Keys in Spatial View Functions

Keys in Spatial View Functions

The key must be a multidimensional bounding box.

The keys in a spatial view function can defined in several ways:

Single values

When a single value is used in the key, it expands to a collapsed range.

For example, the [1, 2] value is stored as [[1, 1], [2, 2]].

Ranges

Use ranges for keys, for example, for shops with certain opening hours such as 10:00 to 20:00. This example uses timestamps and converts the values of 10:00 - 20:00 to 1000 and 2000.

emit([[1000, 2000]], null);

GeoJSON geometry

You can use a GeoJSON geometry in a key. It must be the first element of the array. The bounding box is automatically calculated and used as the range.

Couchbase Server supports the following GeoJSON objects:

  • Point
  • MultiPoint
  • LineString
  • MultiLineString
  • Polygon
  • MultiPolygon
  • GeometryCollection

Examples

In this example, the key is stored internally as [[10.9, 10.9], [48.4, 48.4]].

 emit([{
   "type": "Point",
   "coordinates":[10.9, 48.4]
}], null);  

In this example, the key is stored internally as [[10.9, 10.9], [48.4, 48.4]].

emit([{
   "type": "Point",
   "coordinates":[10.9, 48.4]
}, [1000, 2000], 5], null);
Note: For backward compatibility, you can also emit a GeoJSON geometry that is not wrapped in an array.

The value can be any arbitrary valid JSON. Here is an example spatial view function that emits a point with its height:

function(doc, meta) {
  if (doc.loc && doc.height && doc.name) {
     emit([doc.loc.lon, doc.loc.lat, doc.height], doc.name);
  }
}

You can put a spatial view function into a design document by using the object name spatial to indicate the nature of the view definition. For example, the following design document includes the previous function as a view named points.

  {
   "spatial" : {
      "points" : "function(doc, meta) {if (doc.loc  && doc.height && doc.name) {
          emit([doc.loc.lon, doc.loc.lat, doc.height], doc.name);}}"
   }
}

If your document already contains GeoJSON encoded data, you can directly emit that geometry:

function(doc, meta) {
  if (doc.geometry && doc.name) {
     emit([doc.geometry], doc.name);
  }
}   

To execute the spatial query, use the design document format that uses the embedded spatial function. For example, a design document named main that resides within the bucket places is executed with this URL:

http://[localhost]:8092/places/_design/main/_spatial/points.