All Posts By

Kunal Gautam

MongoDB | Geospatial Query Part - II

By | MongoDB Learning

Let say we need to find if user is within polygon area.

Setting points of polygon

const p1 = [-122.45476, 37.77488]
const p2 = [-122.453, 37.76637]
const p3 = [-122.5104, 37.76397]
const p4 = [-122.51115, 37.77134]
db.areas.insertOne({
      name: 'Golden Gate Park',
      area: { type: 'Polygon', coordinates: [[p1, p2, p3, p4, p1]] }
    })

Set Index.

db.areas.createIndex({area: "2dsphere"})

Find if Point inside polygon area

db.areas
      .find({
        area: {
          $geoIntersects: { $geometry: { type: 'Point', coordinates: [-122.463792, 37.768638] } }
        }
      })
      .pretty();
db.areas
      .find({
        area: {
          $geoIntersects: { $geometry: { type: 'Point', coordinates:[-122.4436619, 37.774995] } }
        }
      })
      .pretty();

geoIntersects helps to find out area within polygon defined.

MongoDB | Geospatial Query Part - I

By | MongoDB Learning

First we need to set index as 2dsphere

db.places.createIndex({location: "2dsphere"})

Then provide the input to find nearby. Distance is in Meters.

db.places
  .find({
    location: {
      $near: {
        $geometry: { type: 'Point', coordinates: [-122.4626966, 37.7694006] },
        $maxDistance: 130,
        $minDistance: 10
      }
    }
  })
  .pretty();

To Find withing Polygon area

Setting points of polygon

const p1 = [-122.45476, 37.77488]
const p2 = [-122.453, 37.76637]
const p3 = [-122.5104, 37.76397]
const p4 = [-122.51115, 37.77134]

Perform Query

db.places
      .find({
        location: {
          $geoWithin: {
            $geometry: { type: 'Polygon', coordinates: [[p1, p2, p3, p4, p1]] }
          }
        }
      })
      .pretty();

MongoDB | GeoJSON Object

By | MongoDB Learning

GeoJSON Objects

Overview

MongoDB supports the GeoJSON object types listed on this page.

To specify GeoJSON data, use an embedded document with:

  • a field named type that specifies the GeoJSON object type and
  • a field named coordinates that specifies the object’s coordinates.

    If specifying latitude and longitude coordinates, list the longitude first and then latitude:

    • Valid longitude values are between -180 and 180, both inclusive.
    • Valid latitude values are between -90 and 90, both inclusive.
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

MongoDB geospatial queries on GeoJSON objects calculate on a sphere; MongoDB uses the WGS84 reference system for geospatial queries on GeoJSON objects.

Point

The following example specifies a GeoJSON Point:

{ type: "Point", coordinates: [ 40, 5 ] }

LineString

The following example specifies a GeoJSON LineString:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

Polygon

Polygons consist of an array of GeoJSON LinearRing coordinate arrays. These LinearRings are closed LineStrings. Closed LineStrings have at least four coordinate pairs and specify the same position as the first and last coordinates.

The line that joins two points on a curved surface may or may not contain the same set of co-ordinates that joins those two points on a flat surface. The line that joins two points on a curved surface will be a geodesic. Carefully check points to avoid errors with shared edges, as well as overlaps and other types of intersections.

Polygons with a Single Ring

The following example specifies a GeoJSON Polygon with an exterior ring and no interior rings (or holes). The first and last coordinates must match in order to close the polygon:

{
  type: "Polygon",
  coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] ]
}

For Polygons with a single ring, the ring cannot self-intersect.

Polygons with Multiple Rings

For Polygons with multiple rings:

  • The first described ring must be the exterior ring.
  • The exterior ring cannot self-intersect.
  • Any interior ring must be entirely contained by the outer ring.
  • Interior rings cannot intersect or overlap each other. Interior rings cannot share an edge.

The following example represents a GeoJSON polygon with an interior ring:

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ],
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]
  ]
}

Diagram of a Polygon with internal ring.

MultiPoint

Requires Versions

GeoJSON MultiPoint embedded documents encode a list of points.

{
  type: "MultiPoint",
  coordinates: [
     [ -73.9580, 40.8003 ],
     [ -73.9498, 40.7968 ],
     [ -73.9737, 40.7648 ],
     [ -73.9814, 40.7681 ]
  ]
}

MultiLineString

Requires Versions

The following example specifies a GeoJSON MultiLineString:

{
  type: "MultiLineString",
  coordinates: [
     [ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],
     [ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],
     [ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],
     [ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]
  ]
}

MultiPolygon

Requires Versions

The following example specifies a GeoJSON MultiPolygon:

{
  type: "MultiPolygon",
  coordinates: [
     [ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.9814, 40.7681 ], [ -73.958, 40.8003 ] ] ],
     [ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.958, 40.8003 ] ] ]
  ]
}

GeometryCollection

Requires Versions

The following example stores coordinates of GeoJSON type GeometryCollection:

{
  type: "GeometryCollection",
  geometries: [
     {
       type: "MultiPoint",
       coordinates: [
          [ -73.9580, 40.8003 ],
          [ -73.9498, 40.7968 ],
          [ -73.9737, 40.7648 ],
          [ -73.9814, 40.7681 ]
       ]
     },
     {
       type: "MultiLineString",
       coordinates: [
          [ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],
          [ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],
          [ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],
          [ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]
       ]
     }
  ]
}

MongoDB | Geospatial Data

By | MongoDB Learning

Insert data

db.places.insertOne({
      name: 'California Academy of Sciences',
      location: { type: 'Point', coordinates: [-122.4640133, 37.7690971] }
    })

Type is GeoJSON Object.

Cordinates need to be provided first value as Longitude and second value as latitude