KEMBAR78
Geospatial Enhancements in MongoDB 2.4 | PDF
Map the Globe, simply
Polygon indexing and GeoJSON support
in MongoDB
Greg Studer
greg@10gen.com
mongoNYC 2013
● 2d vs 2dsphere
● (Quick) overview of previous geospatial features
in MongoDB
● New line/polygon indexing on spherical globe
GeoJSON - lines and polygons
● Geo in aggregation
● Future Roadmap
Why use (2dsphere) geospatial indexing?
1. Have earth-like coordinates and regions tagged
to other data over large areas
2. Want to query this data
based on location
3. Don't necessarily want to
think a lot about the fact
that the earth is round
[ from Jpatokal at wikimedia.org ]
https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
[ from Jpatokal at wikimedia.org ]
https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
https://www.e-education.psu.edu/natureofgeoinfo
Why use (2d) geospatial indexing?
1. Have regional or virtual world coordinates
embedded in other data
2. (For now) Only indexing
locations
3. Don't want spherical
overhead
Overview of geo features
● 2.2 - "2d"
Index only (multi-)points
Query near points or within simple polygons
// 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 Avenue
Tavern", type : "bar",
location : [ -73.9786924, 40.7502231 ]
})
// 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" });
Overview of geo features
● 2.2 - "2d"
DEMO - NYC OpenStreetMaps data
github.com/mongodb/mongo-snippets/tree/master/2dsphere
Overview of geo features
● Current 2.4 - "2dsphere"
Index points, lines, and polygons (on sphere)
Understands simple GeoJSON
Query with points, lines, and polygons
Within-region, Intersect-region, Near-point
queries
GeoJSON
● Widely supported open JSON standard
http://www.geojson.org/
● Simple language:
{ type : 'Point',
coordinates : [<lon>, <lat>] }
{ type : 'LineString',
coordinates : [[<lon>, <lat>],...] }
{ type : 'Polygon',
coordinates : [[[<lon>,<lat>],...],...]}
+ other MultiXXX types (future) ...
// 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],
... ]} });
// Insert Great Hill
> db.coll.insert(
{ name : "Great Hill", type : "park",
location : { type : 'Polygon',
coordinates : [[
[ -73.95841598510742, 40.79724239132546],
[ -73.95817995071411, 40.79691751000055],
... ]]} });
// Find docs with geometry that intersects
// a route
> db.coll.find({ location :
{ $geoIntersects : { $geometry :
{ type : 'LineString',
// Run coordinates
coordinates : [
[ -73.95586252212524, 40.77964777966238 ],
[ -73.95886659622192, 40.78091513739611 ],
... ]} }}})
Overview of geo features
● Current 2.4 - "2dsphere"
DEMO - NYC OpenStreetMaps data
github.com/mongodb/mongo-snippets/tree/master/2dsphere
Overview of geo features
● Current 2.4 - "2dsphere"
Reduced shape distortion
DEMO - NYC OpenStreetMaps data
github.com/mongodb/mongo-snippets/tree/master/2dsphere
Technology
● GeoJSON
http://www.geojson.org
● Google S2 Geometry Library
Apache License 2.0
http://code.google.com/p/s2-geometry-library
image by user geek3 @ http://en.
wikipedia.org/wiki/File:
Sphere_wireframe_10deg_6r.svg
S2
S2
00
0110
11
10|01
10|0010|11
10|10
● 2d vs 2dsphere
● (Quick) overview of previous geospatial features
in MongoDB
● New line/polygon indexing on spherical globe
GeoJSON - lines and polygons
● Geo in aggregation
● Future Roadmap
Overview of geo features
● Current 2.4 - aggregation support
Geospatial predicates in aggregation
Near sorting in aggregation, custom output
fields
> db.ny.aggregate([
// Find everything in MidTown/Hell's Kitchen
{ $match : { geo: { $geoWithin: { $geometry:
{ type: "Polygon", coordinates: [[
// Midtown/Hell's Kitchen
[ -73.9984130859375, 40.78028146155187 ],
[ -73.95240783691406, 40.76182096906601 ],
[ -73.96888732910156, 40.73945350425846 ],
[ -74.01420593261719, 40.75531957477602 ],
[ -73.9984130859375, 40.78028146155187 ]
]] } } } } },
...
...
// 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
{ "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 ] },
...
...
> db.ny.aggregate([
// Find near Times Square
{ $geoNear : {
near : {
type: "Point",
// Times Square
coordinates: [ -73.98508787155151,
40.75905795418586 ] },
distanceField : "distance",
spherical : true, // 2dsphere
num : 1000 } },
...
...
// 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
...
{ "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 ]},
...
...
[ from Jpatokal at wikimedia.org ]
https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
Future
● Further support for other predicates
OGC Simple Features
● GeoJSON composite shapes
● Indexing API to allow similar enhancements for
"flat plane" work
● Space open for non-default CRSes
Thanks!
greg@10gen.com

Geospatial Enhancements in MongoDB 2.4

  • 1.
    Map the Globe,simply Polygon indexing and GeoJSON support in MongoDB Greg Studer greg@10gen.com mongoNYC 2013
  • 2.
    ● 2d vs2dsphere ● (Quick) overview of previous geospatial features in MongoDB ● New line/polygon indexing on spherical globe GeoJSON - lines and polygons ● Geo in aggregation ● Future Roadmap
  • 3.
    Why use (2dsphere)geospatial indexing? 1. Have earth-like coordinates and regions tagged to other data over large areas 2. Want to query this data based on location 3. Don't necessarily want to think a lot about the fact that the earth is round
  • 4.
    [ from Jpatokalat wikimedia.org ] https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
  • 5.
    [ from Jpatokalat wikimedia.org ] https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
  • 6.
  • 7.
    Why use (2d)geospatial indexing? 1. Have regional or virtual world coordinates embedded in other data 2. (For now) Only indexing locations 3. Don't want spherical overhead
  • 8.
    Overview of geofeatures ● 2.2 - "2d" Index only (multi-)points Query near points or within simple polygons
  • 9.
    // Make aflat 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 Avenue Tavern", type : "bar", location : [ -73.9786924, 40.7502231 ] })
  • 10.
    // Find inManhattan 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.
    Overview of geofeatures ● 2.2 - "2d" DEMO - NYC OpenStreetMaps data github.com/mongodb/mongo-snippets/tree/master/2dsphere
  • 12.
    Overview of geofeatures ● Current 2.4 - "2dsphere" Index points, lines, and polygons (on sphere) Understands simple GeoJSON Query with points, lines, and polygons Within-region, Intersect-region, Near-point queries
  • 13.
    GeoJSON ● Widely supportedopen JSON standard http://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.
    // Make aspherical 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.
    // Insert GreatHill > db.coll.insert( { name : "Great Hill", type : "park", location : { type : 'Polygon', coordinates : [[ [ -73.95841598510742, 40.79724239132546], [ -73.95817995071411, 40.79691751000055], ... ]]} });
  • 16.
    // Find docswith geometry that intersects // a route > db.coll.find({ location : { $geoIntersects : { $geometry : { type : 'LineString', // Run coordinates coordinates : [ [ -73.95586252212524, 40.77964777966238 ], [ -73.95886659622192, 40.78091513739611 ], ... ]} }}})
  • 17.
    Overview of geofeatures ● Current 2.4 - "2dsphere" DEMO - NYC OpenStreetMaps data github.com/mongodb/mongo-snippets/tree/master/2dsphere
  • 18.
    Overview of geofeatures ● Current 2.4 - "2dsphere" Reduced shape distortion DEMO - NYC OpenStreetMaps data github.com/mongodb/mongo-snippets/tree/master/2dsphere
  • 19.
    Technology ● GeoJSON http://www.geojson.org ● GoogleS2 Geometry Library Apache License 2.0 http://code.google.com/p/s2-geometry-library image by user geek3 @ http://en. wikipedia.org/wiki/File: Sphere_wireframe_10deg_6r.svg
  • 20.
  • 21.
  • 22.
    ● 2d vs2dsphere ● (Quick) overview of previous geospatial features in MongoDB ● New line/polygon indexing on spherical globe GeoJSON - lines and polygons ● Geo in aggregation ● Future Roadmap
  • 23.
    Overview of geofeatures ● Current 2.4 - aggregation support Geospatial predicates in aggregation Near sorting in aggregation, custom output fields
  • 24.
    > db.ny.aggregate([ // Findeverything in MidTown/Hell's Kitchen { $match : { geo: { $geoWithin: { $geometry: { type: "Polygon", coordinates: [[ // Midtown/Hell's Kitchen [ -73.9984130859375, 40.78028146155187 ], [ -73.95240783691406, 40.76182096906601 ], [ -73.96888732910156, 40.73945350425846 ], [ -74.01420593261719, 40.75531957477602 ], [ -73.9984130859375, 40.78028146155187 ] ]] } } } } }, ...
  • 25.
    ... // Organize stuffwe 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.
    { "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.
    > db.ny.aggregate([ // Findnear Times Square { $geoNear : { near : { type: "Point", // Times Square coordinates: [ -73.98508787155151, 40.75905795418586 ] }, distanceField : "distance", spherical : true, // 2dsphere num : 1000 } }, ...
  • 28.
    ... // Organize stuffwe 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.
    { "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.
    [ from Jpatokalat wikimedia.org ] https://secure.wikimedia.org/wikipedia/commons/wiki/File:World-airline-routemap-2009.png
  • 31.
    Future ● Further supportfor other predicates OGC Simple Features ● GeoJSON composite shapes ● Indexing API to allow similar enhancements for "flat plane" work ● Space open for non-default CRSes
  • 32.