Skip to main content

Mongo - GeoSpacial

Lesson Objectives#

  1. Explain GeoSpacial
  2. Explain GeoJSON
  3. Explain containers
  4. Explain How To Create an Index
  5. Explain $near
  6. Explain $geoWithin
  7. Explain $geoIntersects

Explain GeoSpacial#

Explain GeoJSON#

  1. { type: "<GeoJSON type>" , coordinates: <coordinates> }
  2. Always list coordinates in longitude, latitude order.
  3. point
  • { type: "Point", coordinates: [ 40, 5 ] }
  1. line
  • { type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }
  1. polygons
  • array of coordinate arrays (rings)
  • at least four points and have same start/end position
  • one outer ring and 0+ inner rings
  • cannot self intersect
  • single ring
  • { type: "Polygon", coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ] }
  • multiple rings
  • 1st ring is outer ring
  • 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.
  • http://docs.mongodb.org/manual/_images/index-2dsphere-polygon-with-ring.png
{  type: "Polygon",  coordinates: [    [      [0, 0],      [3, 6],      [6, 1],      [0, 0],    ],    [      [2, 2],      [3, 3],      [4, 2],      [2, 2],    ],  ],}; 

Explain containers#

  1. MultiPoint
{  type: "MultiPoint",  coordinates: [    [-73.958, 40.8003],    [-73.9498, 40.7968],    [-73.9737, 40.7648],    [-73.9814, 40.7681],  ],}
  1. 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.9788, 40.77247],      [-73.97036, 40.76811],    ],  ],}
  1. 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],      ],    ],  ],}
  1. GeometryCollection
{  type: "GeometryCollection",  geometries: [    {      type: "MultiPoint",      coordinates: [        [-73.958, 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.9788, 40.77247],          [-73.97036, 40.76811],        ],      ],    },  ],}

Explain How To Create an Index#

  1. db.collection.createIndex( { <location field> : "2dsphere" } )

Explain $near#

db.test_data.insert({  name: "north",  position: { type: "Point", coordinates: [0, 1] },});db.test_data.insert({  name: "east",  position: { type: "Point", coordinates: [1, 0] },});db.test_data.insert({  name: "south",  position: { type: "Point", coordinates: [0, -1] },});db.test_data.insert({  name: "west",  position: { type: "Point", coordinates: [-1, 0] },});db.test_data.createIndex({ position: "2dsphere" });
db.test_data.find({  position: {    $near: {      $geometry: {        type: "Point",        coordinates: [2, 0],      },      $minDistance: 0,      $maxDistance: 200000,    },  },});

Explain $geoWithin#

db.test_data.find({  position: {    $geoWithin: {      $geometry: {        type: "Polygon",        coordinates: [          [            [0.5, 0.5],            [1.5, 0.5],            [1.5, -0.5],            [0.5, -0.5],            [0.5, 0.5], // VERY IMPORTANT          ],        ],      },    },  },});

Explain $geoIntersects#

db.test_data.insert({  name: "line",  position: {    type: "LineString",    coordinates: [      [1, 0],      [2, 0],    ],  },});WriteResult({ nInserted: 1 });
db.test_data.find({  position: {    $geoIntersects: {      $geometry: {        type: "Polygon",        coordinates: [          [            [0.5, 0.5],            [1.5, 0.5],            [1.5, -0.5],            [0.5, -0.5],            [0.5, 0.5], // VERY IMPORTANT          ],        ],      },    },  },});