You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.0 KiB

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 ] }
  4. line
    • { type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }
  5. 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
      {
        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.9580, 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.97880, 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.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 ] ]
       ]
     }
  ]
}

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
				]]
			}
		}
	}
});