Geospatial Enhancements in MongoDB 2.4

3,547 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,547
On SlideShare
0
From Embeds
0
Number of Embeds
395
Actions
Shares
0
Downloads
48
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Geospatial Enhancements in MongoDB 2.4

  1. 1. Map the Globe, simplyPolygon indexing and GeoJSON supportin MongoDBGreg Studergreg@10gen.commongoNYC 2013
  2. 2. ● 2d vs 2dsphere● (Quick) overview of previous geospatial featuresin MongoDB● New line/polygon indexing on spherical globeGeoJSON - lines and polygons● Geo in aggregation● Future Roadmap
  3. 3. Why use (2dsphere) geospatial indexing?1. Have earth-like coordinates and regions taggedto other data over large areas2. Want to query this databased on location3. Dont necessarily want tothink a lot about the factthat the earth is round
  4. 4. [ from Jpatokal at wikimedia.org ]https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
  5. 5. [ from Jpatokal at wikimedia.org ]https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
  6. 6. https://www.e-education.psu.edu/natureofgeoinfo
  7. 7. Why use (2d) geospatial indexing?1. Have regional or virtual world coordinatesembedded in other data2. (For now) Only indexinglocations3. Dont want sphericaloverhead
  8. 8. Overview of geo features● 2.2 - "2d"Index only (multi-)pointsQuery near points or within simple polygons
  9. 9. // Make a flat 2d index [-180 -> 180)> db.coll.ensureIndex({ location : "2d", type : 1 } )// Insert some point data> db.coll.insert({ name : "Shake Shack",type : "rest",location : [ -73.9881353, 40.7415064 ]})> db.coll.insert({ name : "Park AvenueTavern", type : "bar",location : [ -73.9786924, 40.7502231 ]})
  10. 10. // Find in Manhattan Mall> db.coll.find({ location : { $geoWithin : {$polygon : [[ -73.9884761, 40.7491204 ],[ -73.988829, 40.7486387 ],[ -73.9901297, 40.7491856 ],[ -73.9897768, 40.7496673 ],[ -73.9884761, 40.7491204 ]] }}},type : "rest" })// Find near Washington Square (center)> db.coll.find({ location : {$geoNear : [ -73.7695467, 42.6622728 ] },type : "rest" });
  11. 11. Overview of geo features● 2.2 - "2d"DEMO - NYC OpenStreetMaps datagithub.com/mongodb/mongo-snippets/tree/master/2dsphere
  12. 12. Overview of geo features● Current 2.4 - "2dsphere"Index points, lines, and polygons (on sphere)Understands simple GeoJSONQuery with points, lines, and polygonsWithin-region, Intersect-region, Near-pointqueries
  13. 13. GeoJSON● Widely supported open JSON standardhttp://www.geojson.org/● Simple language:{ type : Point,coordinates : [<lon>, <lat>] }{ type : LineString,coordinates : [[<lon>, <lat>],...] }{ type : Polygon,coordinates : [[[<lon>,<lat>],...],...]}+ other MultiXXX types (future) ...
  14. 14. // Make a spherical 2d compound index> db.coll.ensureIndex({ type : 1, location : "2dsphere" } )// Insert Park Avenue> db.coll.insert({ name : "Park Avenue", type : "road",location : { type : LineString,coordinates : [[ -73.9359712600708, 40.80942429324451],[ -73.93676519393921, 40.80820620367037],... ]} });
  15. 15. // Insert Great Hill> db.coll.insert({ name : "Great Hill", type : "park",location : { type : Polygon,coordinates : [[[ -73.95841598510742, 40.79724239132546],[ -73.95817995071411, 40.79691751000055],... ]]} });
  16. 16. // Find docs with geometry that intersects// a route> db.coll.find({ location :{ $geoIntersects : { $geometry :{ type : LineString,// Run coordinatescoordinates : [[ -73.95586252212524, 40.77964777966238 ],[ -73.95886659622192, 40.78091513739611 ],... ]} }}})
  17. 17. Overview of geo features● Current 2.4 - "2dsphere"DEMO - NYC OpenStreetMaps datagithub.com/mongodb/mongo-snippets/tree/master/2dsphere
  18. 18. Overview of geo features● Current 2.4 - "2dsphere"Reduced shape distortionDEMO - NYC OpenStreetMaps datagithub.com/mongodb/mongo-snippets/tree/master/2dsphere
  19. 19. Technology● GeoJSONhttp://www.geojson.org● Google S2 Geometry LibraryApache License 2.0http://code.google.com/p/s2-geometry-libraryimage by user geek3 @ http://en.wikipedia.org/wiki/File:Sphere_wireframe_10deg_6r.svg
  20. 20. S2
  21. 21. S20001101110|0110|0010|1110|10
  22. 22. ● 2d vs 2dsphere● (Quick) overview of previous geospatial featuresin MongoDB● New line/polygon indexing on spherical globeGeoJSON - lines and polygons● Geo in aggregation● Future Roadmap
  23. 23. Overview of geo features● Current 2.4 - aggregation supportGeospatial predicates in aggregationNear sorting in aggregation, custom outputfields
  24. 24. > db.ny.aggregate([// Find everything in MidTown/Hells Kitchen{ $match : { geo: { $geoWithin: { $geometry:{ type: "Polygon", coordinates: [[// Midtown/Hells Kitchen[ -73.9984130859375, 40.78028146155187 ],[ -73.95240783691406, 40.76182096906601 ],[ -73.96888732910156, 40.73945350425846 ],[ -74.01420593261719, 40.75531957477602 ],[ -73.9984130859375, 40.78028146155187 ]]] } } } } },...
  25. 25. ...// Organize stuff we want{ $project :{ tags : 1,info : { name : "$name",lonLat : "$geo.coordinates" }} },{ $unwind : "$tags" },// Count by tag types{ $group : { _id : "$tags",total : { $sum : 1 },locs : { $push : "$info" } }}]); // end
  26. 26. { "result" : [{ "_id" : "park", "total" : 18,"locs" : [{"name" : "Hells Kitchen Park","lonLat" : [ -73.9925, 40.7630556 ] },...{ "_id" : "bar", "total" : 28,"locs" : [{ "name" : "Landmark Tavern","lonLat" : [ -73.9963261, 40.7631922 ] },{ "name" : "Pony Bar","lonLat" : [ -73.994236, 40.761723 ] },......
  27. 27. > db.ny.aggregate([// Find near Times Square{ $geoNear : {near : {type: "Point",// Times Squarecoordinates: [ -73.98508787155151,40.75905795418586 ] },distanceField : "distance",spherical : true, // 2dspherenum : 1000 } },...
  28. 28. ...// Organize stuff we want{ $project :{ tags : 1,info : { name : "$name",distance : "$distance",lonLat : "$geo.coordinates" }} },{ $unwind : "$tags" },// Count by tag types{ $group : { _id : "$tags",total : { $sum : 1 },locs : { $push : "$info" } }}]); // end...
  29. 29. { "result" : [{ "_id" : "park", "total" : 11,"locs" : [{"name" : "Ramone Aponte Park","distance" : 449.7417003854033, // m"lonLat" : [ -73.9894444, 40.7613889 ]},...{ "_id" : "bar", "total" : 24,"locs" : [{"name" : "The Lambs Club","distance" : 275.0270424641914, // m"lonLat" : [ -73.9963261, 40.7631922 ]},......
  30. 30. [ from Jpatokal at wikimedia.org ]https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
  31. 31. Future● Further support for other predicatesOGC Simple Features● GeoJSON composite shapes● Indexing API to allow similar enhancements for"flat plane" work● Space open for non-default CRSes
  32. 32. Thanks!greg@10gen.com

×