Skip to main content

Geo Functions

Geo utility functions

The following helper functions can use geo indexes, but do not have to in all cases. You can use all of these functions in combination with each other, and if you have configured a geo index it may be utilized, see Geo Indexing.

DISTANCE()

DISTANCE(latitude1, longitude1, latitude2, longitude2) → distance

Calculate the distance between two arbitrary coordinates in meters (as birds would fly). The value is computed using the haversine formula, which is based on a spherical Earth model. It's fast to compute and is accurate to around 0.3%, which is sufficient for most use cases such as location-aware services.

  • latitude1 (number): the latitude portion of the first coordinate
  • longitude1 (number): the longitude portion of the first coordinate
  • latitude2 (number): the latitude portion of the second coordinate
  • longitude2 (number): the longitude portion of the second coordinate
  • returns distance (number): the distance between both coordinates in meters
// Distance from Brandenburg Gate (Berlin) to (Cologne)
DISTANCE(52.5163, 13.3777, 50.9322, 6.94) // 476918.89688380965 (~477km)

// Sort a small number of documents based on distance to Central Park (New York)
FOR doc IN doc // e.g. documents returned by a traversal
SORT DISTANCE(doc.latitude, doc.longitude, 40.78, -73.97)
RETURN doc

GEO_CONTAINS()

GEO_CONTAINS(geoJsonA, geoJsonB) → bool

Checks whether the GeoJSON object geoJsonA fully contains geoJsonB (Every point in B is also in A). The object geoJsonA has to be of type Polygon or MultiPolygon, other types are not supported because containment is ill defined. This function can be optimized by a S2 based geospatial index.

  • geoJsonA (object): first GeoJSON object or coordinate array (in longitude, latitude order)
  • geoJsonB (object): second GeoJSON object or coordinate array (in longitude, latitude order)
  • returns bool (bool): true when every point in B is also contained in A, false otherwise

GEO_DISTANCE()

GEO_DISTANCE(geoJsonA, geoJsonB, ellipsoid) → distance

Return the distance between two GeoJSON objects, measured from the centroid of each shape. For a list of supported types see the geo index page.

  • geoJsonA (object): first GeoJSON object
  • geoJsonB (object): second GeoJSON object
  • ellipsoid (string, optional): reference ellipsoid to use. Supported are "sphere" (default) and "wgs84".
  • returns distance (number): the distance between the centroid points of the two objects on the reference ellipsoid
LET polygon = {
type: "Polygon",
coordinates: [[[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]]]
}
FOR doc IN collectionName
LET distance = GEO_DISTANCE(doc.geometry, polygon) // calculates the distance
RETURN distance

GEO_AREA()

GEO_AREA(geoJson, ellipsoid) → area

Return the area for a polygon or multi-polygon on a sphere with the average Earth radius, or an ellipsoid. For a list of supported types see the geo index page.

  • geoJson (object): a GeoJSON object
  • ellipsoid (string, optional): reference ellipsoid to use. Supported are "sphere" (default) and "wgs84".
  • returns area (number): the area in square meters of the polygon
LET polygon = {
type: "Polygon",
coordinates: [[[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]]]
}
RETURN GEO_AREA(polygon, "wgs84")

GEO_EQUALS()

GEO_EQUALS(geoJsonA, geoJsonB) → bool

Checks whether two GeoJSON objects are equal or not. For a list of supported types see the geo index page.

  • geoJsonA (object): first GeoJSON object
  • geoJsonB (object): second GeoJSON object.
  • returns bool (bool): true for equality.
LET polygonA = GEO_POLYGON([
[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]
])
LET polygonB = GEO_POLYGON([
[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]
])
RETURN GEO_EQUALS(polygonA, polygonB) // true
LET polygonA = GEO_POLYGON([
[-11.1, 24.0], [-10.5, 26.1], [-11.2, 27.1], [-11.1, 24.0]
])
LET polygonB = GEO_POLYGON([
[-11.5, 23.5], [-10.5, 26.1], [-11.2, 27.1], [-11.5, 23.5]
])
RETURN GEO_EQUALS(polygonA, polygonB) // false

GEO_INTERSECTS()

GEO_INTERSECTS(geoJsonA, geoJsonB) → bool

Checks whether the GeoJSON object geoJsonA intersects with geoJsonB (i.e. at least one point in B is also A or vice-versa). This function can be optimized by a S2 based geospatial index.

  • geoJsonA (object): first GeoJSON object
  • geoJsonB (object): second GeoJSON object.
  • returns bool (bool): true if B intersects A, false otherwise

GeoJSON Constructors

The following helper functions are available to easily create valid GeoJSON output. In all cases you can write equivalent JSON yourself, but these functions will help you to make all your C8QL queries shorter and easier to read.

GEO_LINESTRING()

GEO_LINESTRING(points) → geoJson

Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs.

  • points (array): number array of longitude/latitude pairs
  • returns geoJson (object): a valid GeoJSON LineString
RETURN GEO_LINESTRING([
[35, 10], [45, 45]
])

GEO_MULTILINESTRING()

GEO_MULTILINESTRING(points) → geoJson

Construct a GeoJSON MultiLineString. Needs at least two elements consisting valid LineStrings coordinate arrays.

  • points (array): array of LineStrings
  • returns geoJson (object): a valid GeoJSON MultiLineString
RETURN GEO_MULTILINESTRING([
[[100.0, 0.0], [101.0, 1.0]],
[[102.0, 2.0], [101.0, 2.3]]
])

GEO_MULTIPOINT()

GEO_MULTIPOINT(points) → geoJson

Construct a GeoJSON LineString. Needs at least two longitude/latitude pairs.

  • points (array): number array of longitude/latitude pairs
  • returns geoJson (object): a valid GeoJSON Point
RETURN GEO_MULTIPOINT([
[35, 10], [45, 45]
])

GEO_POINT()

GEO_POINT(longitude, latitude) → geoJson

Construct a valid GeoJSON Point.

  • longitude (number): the longitude portion of the point
  • latitude (number): the latitude portion of the point
  • returns geoJson (object): a GeoJSON Point
RETURN GEO_POINT(1.0, 2.0)

GEO_POLYGON()

GEO_POLYGON(points) → geoJson

Construct a GeoJSON Polygon. Needs at least one array representing a loop. Each loop consists of an array with at least three longitude/latitude pairs. The first loop must be the outermost, while any subsequent loops will be interpreted as holes.

  • points (array): array of (arrays of) longitude/latitude pairs
  • returns geoJson (object|null): a valid GeoJSON Polygon

Simple Polygon:

RETURN GEO_POLYGON([
[0.0, 0.0], [7.5, 2.5], [0.0, 5.0]
])

Advanced Polygon with a hole inside:

RETURN GEO_POLYGON([
[[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]],
[[20, 30], [35, 35], [30, 20], [20, 30]]
])

GEO_MULTIPOLYGON()

GEO_MULTIPOLYGON(polygons) → geoJson

Construct a GeoJSON MultiPolygon. Needs at least two Polygons inside. See GEO_POLYGON() for the rules of Polygon construction.

  • polygons (array): array of arrays of array of longitude/latitude pairs
  • returns geoJson (object|null): a valid GeoJSON MultiPolygon

MultiPolygon comprised of a simple Polygon and a Polygon with hole:

RETURN GEO_MULTIPOLYGON([
[
[[40, 40], [20, 45], [45, 30], [40, 40]]
],
[
[[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]],
[[30, 20], [20, 15], [20, 25], [30, 20]]
]
])