SlideShare a Scribd company logo
Getting Started with
Geospatial Data in MongoDB
Buzz Moschetti
Enterprise Architect
buzz.moschetti@mongodb.com
@buzzmoschetti
2
Agenda
• What is MongoDB?
• What does “geospatial capabilities” mean?
• GeoJSON
• Combining GeoJSON with non-geo data
• APIs and Use Cases
• Comparison to OGC (Open Geospatial Consortium)
• Indexing
• Using Geo Capabilities for non-Geo Things
• Esri and shapefiles
3
MongoDB:
The Post-Relational General Purpose Database
Document
Data Model
Open-
Source
Fully Featured
High Performance
Scalable
{
name: “John Smith”,
pfxs: [“Dr.”,”Mr.”],
address: “10 3rd St.”,
phone: {
home: 1234567890,
mobile: 1234568138 }
}
Nexus Architecture
Scalability
& Performance
Always On,
Global Deployments
Flexibility
Expressive Query Language
& Secondary Indexes
Strong Consistency
Enterprise Management
& Integrations
5
MongoDB Company Overview
~800 employees 2500+ customers
Over $311 million in funding
Offices in NY & Palo Alto and
across EMEA, and APAC
6
What is “Geo”?
At least 4 levels of capability
7
The Geo Stack
Efficiently store, query, and index arbitrary points, lines
and polygons in the DB
8
The Geo Stack
Platform for data analysis of peer data (trades/house
value/population/sales/widgets) grouped by geo data
Efficiently store, query, and index arbitrary points, lines
and polygons in the DB
9
The Geo Stack
Graphical rendering of geo shapes on a map
Platform for data analysis of peer data (trades/house
value/population/sales/widgets) grouped by geo data
Efficiently store, query, and index arbitrary points, lines
and polygons in the DB
10
The Geo Stack
Application(s) to browse and manipulate all the data
Graphical rendering of geo shapes on a map
Platform for data analysis of peer data (trades/house
value/population/sales/widgets) grouped by geo data
Efficiently store, query, and index arbitrary points, lines
and polygons in the DB
11
Important: Sometimes there is NO Map
• Geo stack must support geo functions WITHOUT a Map
• Offline reporting
• “Nightly fleet management report”
• “Distributor loss by assigned area”
• Compute/analytical processing
• Dynamic polygon generation
• Weather catastrophe simulation
• Other geo-filtering as input to analytics
12
MongoDB: The Data “Base”
Application(s) to browse and visualize
Graphical rendering of geo shapes on a map
Platform for data analysis of peer data
(trades/value/population/sales/widgets) grouped by
geo data
Efficiently store, query, and index arbitrary points,
lines, and polygons in the DB
Peer Data
Geo Data
13
One Persistor for All Applications & Use Cases
Google Map APIs
Browser / Mobile
Other Javascript
Peer Data
Geo Data
MongoDB node.js Driver
MongoDB python
Driver
Quant / Analytics
with pandas
Web Service Code
MongoDB Java
Driver
Nightly Reporting
Enterprise
Integration
MongoDB BI
Connector
Tableau
ClickView
PowerBI
Talend
Mule
Informatica
14
Balanced Reporting
• Most other NoSQL DBs do not have this capability
• Oracle, Postgres, MySQL, SQLServer do offer it and
subscribe to Open GeoS Consortium (OGC) standards
15
MongoDB data model is the major difference
MongoDB: Simple, parse-free, type-correct APIs and data to
manipulate and interrogate geo shapes
a.k.a. arrays (of arrays (of arrays))
OpenGIS: Piles of “ST_” functions:
http://postgis.net/docs/reference.html#Geometry_Accessors
SELECT ST_MakePolygon(
ST_GeomFromText(
'LINESTRING(75.15 29.53,77 29,77.6 29.5, 75.15 29.53)'));
16
Data & APIs
17
Legacy: 2D points
{
name: {f: “Buzz”, l: “Moschetti”},
favoritePets: [ “dog”, “cat” ],
house: [ -95.12345, 43.23423 ]
}
18
Better: GeoJSON
{
name: {f: “Buzz”, l: “Moschetti”},
favoritePets: [ “dog”, “cat” ],
house: {
type: “Point”,
coordinates: [ -95.12345, 43.23423 ]
}
}
19
Better: GeoJSON
{
name: “Superfund132”,
location: {
type: “Polygon”,
coordinates: [
[ [-95.12345, 43.2342],[-95.12456,43.2351],…]
[ [-92.8381, 43.75], … ] // “hole”
]
}
}
20
The GeoJSON Family
{
type: “Point”, “MultiPoint”, “LineString”,”MultiLineString”, “Polygon”,
“MultiPolygon”
coordinates: [ specific to type ]
}
{
type: “GeometryCollection”
geometries: [
{ type: (one of above),
coordinates: [ . . . ]
}
]
NO COMPUTED SHAPES
(Circle, Arc, Box, etc.)
We use the WGS84 standard:
http://spatialreference.org/ref/epsg/4326/
21
MongoDB Data Types are Geo-friendly
var poly = [
[ [-95.12345,43.2342],[-95.12345,43.2351],
[-95.12211,43.2351],[-95.12211,43.2342],
[-95.12345,43.2342] // close the loop!
]
];
db.myCollection.insert(
{name: {f: "Buzz", l: "Moschetti"},
favoritePets: ["dog", "cat"],
geo: { type: "Polygon“, coordinates: poly }
}));
22
… even with Java
Document doc = new Document();
doc.put("name", ”Superfund132");
List ring = new ArrayList();
addPoint(ring, -95.12345, 43.2342);
addPoint(ring, -95.12345, 43.2351);
addPoint(ring, -95.12211, 43.2351);
addPoint(ring, -95.12211, 43.2342);
addPoint(ring, -95.12345, 43.2342);
List poly = new ArrayList();
poly.add(ring);
Map mm = new HashMap();
mm.put("type", "Polygon");
mm.put("coordinates", poly);
doc.put("geo", mm);
coll.insertOne(doc);
static void addPoint(List ll,
double lng,
double lat) {
List pt = new ArrayList();
pt.add(lng);
pt.add(lat);
ll.add(pt);
}
23
All Types Are Preserved Correctly
Document doc = coll.find().first();
recursiveWalk(doc);
name: java.lang.String: Superfund132
geo: com.mongodb.BasicDBObject
type: java.lang.String: Polygon
coordinates: com.mongodb.BasicDBList
0: com.mongodb.BasicDBList
0: com.mongodb.BasicDBList
0: java.lang.Double: -95.12345
1: java.lang.Double: 43.2342
1: com.mongodb.BasicDBList
0: java.lang.Double: -95.12345
1: java.lang.Double: 43.2351
2: com.mongodb.BasicDBList
0: java.lang.Double: -95.12211
1: java.lang.Double: 43.2351
24
Comparison to “Good” PostGIS
import org.postgis.PGgeometry; // extended from org.postgresql.util.PGobject
((org.postgresql.Connection)conn).addDataType("geometry","org.postgis.PGgeometry"
)
String sql = "select geom from someTable”;
ResultSet r = stmt.executeQuery(sql);
while( r.next() ) {
PGgeometry geom = (PGgeometry)r.getObject(1);
if( geom.getType() = Geometry.POLYGON ) {
Polygon pl = (Polygon)geom.getGeometry();
for( int r = 0; r < pl.numRings(); r++) {
LinearRing rng = pl.getRing(r);
. . .
}
}
25
Comparison to most OpenGIS
String sql = "select ST_AsText(geom) from someTable”;
ResultSet r = stmt.executeQuery(sql);
while( r.next() ) {
String wkt = r.getString(1);
// wkt is ”POLYGON((0 0,0 1,1 1,1 0,0 0))”
// http://en.wikipedia.org/wiki/Well-known_text
// Now we have to parse the string into
// an array of array of doubles.
// Don’t want to introduce a 3rd party dependency…
// So . . . We write our own parser.
}
26
Checkpoint
We have data in and out of the DB using basic operations
(insert and find)
Now we need to make it performant!
27
Indexing
collection.createIndex({loc:”2d”})
When to use:
• Your database has legacy location data from MongoDB 2.2 or earlier
• You do not intend to store any location data as GeoJSON objects
• “Special Use Cases” e.g. arbitrary two numeric dimension indexing
collection.createIndex({loc:”2dsphere”})
When to use:
• Supports all GeoJSON objects and legacy [x,y] pairs
collection.createIndex({loc:”geoHaystack”})
When to use:
• Special small area flat (planar) lookup optimization
28
Indexing
collection.createIndex({loc:”2d”})
When to use:
• Your database has legacy location data from MongoDB 2.2 or earlier
• You do not intend to store any location data as GeoJSON objects
• “Special Use Cases” e.g. arbitrary two numeric dimension indexing
collection.createIndex({loc:”2dsphere”})
When to use:
• Supports all GeoJSON objects and legacy [x,y] pairs
collection.createIndex({loc:”geoHaystack”})
When to use:
• Special small area flat (planar) lookup optimization
29
find()/$match and Indexing
Operator Geometry Arg Type 2d 2dsphere
$geoWithin $box,$center,$polygon Y N
$geometry: { type, coordinates } N Y
$centerSphere: [ [x,y], radians ] Y Y
$geoIntersects $geometry only N Y
$near,$nearSphere [x,y] R -
(output sorted by distance) $geometry: {type, coordinates} - R
+ $minDistance N Y
+ $maxDistance Y Y
Y = will assist
N = will not assist
R = REQUIRED
Syntax helper:
find(“loc”:{$geoWithin: {$box: [ [x0,y0], [x1,y2] }});
find(“loc”:{$geoWithin: {$geometry: { type: “Polygon”, coordinates: [ …. ] }}} );
30
Aggregation Framework: $geoNear
Option 2D 2dsphere
$geoNear
(output sorted by distance)
near: { type: “Point”, coordinates } - R - and
spherical:true
near: [ x, y ] R (or) R
query: { expression INCL geo find()
on previous page EXCEPT $near}
N N
Y = will assist
N = will not assist
R = REQUIRED
Important Considerations:
1. You can only use $geoNear as the first stage of a pipeline.
2. You must include the distanceField option.
3. The collection must have only one geospatial index: one 2d index or one 2dsphere index.
4. You do not need to specify which field in the documents hold the coordinate pair or point.
Because $geoNear requires that the collection have a single geospatial index, $geoNear
implicitly uses the indexed field.
31
Use Cases
How do we bring data representation, fast lookup, and . . .
32
Case #1: Find Things in a Given Area + More
• Docs contain Points (or possibly “small” polygons)
• $geoWithin
db.site.aggregate([
{$match: { "loc": { $geoWithin: { $geometry:
{ type: "Polygon", coordinates: [ coords ] }}}
,"portfolio_id": portid
,“insuredValue“: {$gt: 1000000}
,“insuredDate“: {$gt: new ISODate(„2016-01-01“) }}
,{$bucket: {groupBy: „$insuredValue“,
boundaries: [ 1000000, 2000000, 5000000, 10000000,
20000000, Infinity] }}
. . .
33
Case #2: Find Things in an Area Stored in DB
• Get the shape from the “shapes” collection via query:
db.shapes.findOne({predicate},{theShape:1});
• Turn around and query the target collection, e.g.
buildingSites with shape:
db.buildingSites.find({loc:{$geoWithin: theShape}})
34
Case #3: Find Things Closest to where I am
db.buildingSites.aggregate([{$geoNear: { point … }});
• Results returned already in sorted order by closeness
35
Case #3.5: Find Things Closest to where I am but
within some bounds
• db.buildingSites.aggregate([
{$geoNear: {
query: { “loc”: {$geoWithin:
{$centerSphere: … }} }
(or)
query: { “loc”: {$geoWithin: {$geometry:
GeoJSON }} }
}} ])
36
When the Database isn’t enough
37
When the Database isn’t enough
• VERY fast intersection/within for many objects given
probes at high velocity (10000s/sec).
• Geo manipulation: unions, deltas, layering
• Dynamic/programmatic geo construction
• Advanced features: smoothing, simplifiers, centroids,
…
38
You Need Three Things
• Basic geo objects
• Geo operators like intersects, within, etc.
• Algos and smoothers, etc.
39
com.vividsolutions.jts
Map m = (Map) dbo.get("loc"); // get a GeoJSON object from MongoDB
List coords = (List) m.get("coordinates");
List outerRing = (List) coords.get(0); // polygon is array of array of pts
CoordinateSequence pseq = new CoordinateGeoJSONSequence(outerRing, true);
LinearRing outerlr = new LinearRing(pseq, gf);
int numHoles = coords.size() - 1; // -1 to skip outer ring;
LinearRing[] holes = null;
if(numHoles > 0) {
holes = new LinearRing[numHoles];
for(int k = 0; k < numHoles; k++) {
List innerRing = (List) coords.get(k+1); // +1 adj for outer ring
CoordinateSequence psx = new CoordinateGeoJSONSequence(innerRing, true);
holes[k] = new LinearRing(psx, gf);
}
}
Polygon poly1 = new Polygon(outerlr, holes, gf); // ok if holes was null
Point pt1 = new Point(pseq2, gf);
boolean a = pt1.intersects(poly1);
Geometry simplified = TopologyPreservingSimplifier.simplify(poly1, tolerance);
40
The Ecosystem
• OpenGeo runs over MongoDB!
http://suite.opengeo.org/docs/latest/dataadmin/mongodb/index.html
• BoundlessGeo: Commerical support for OpenGeo over MongoDB
* Provides top 2 tiers (viz, analysis)
* https://boundlessgeo.com
41
Geo Capabilities beyond “Simple Geo”
42
Geo as Date Range
{
who: ‘john’
where: ‘mongodb’
what: ‘lightning talk’
start: ISODate(“2016-06-30T15:00:00”)
end: ISODate(“2016-06-30T15:05:00”)
}
What events were happening at 15:03?
collection.find({
start : { $lte:ISODate(“2016-06-30T15:05:03”)},
end: { $gte:ISODate(“2016-06-30T15:05:03”)}
})
43
Geo as Date Range
• Ranges on 2 attributes – Two BTree walks (intersection)
• Assuming time can be anywhere in range of records, index walk is average 50% of index
• Test: Macbook Pro, i5, 16GB RAM, data fits in WT Cache easily. Warmed up. Average of
100 runs
694ms /query using index
487ms /query – COLLSCAN!
(StartDate,EndDate)  Range Type using Geo
LineString “Query”
longitude = t
Lat=“quantized”variable
0
1
2
{
who: ‘john’
where: ‘mongodb’
what: ‘lightning talk’
start: ISODate(“2016-06-30T15:00:00”)
end: ISODate(“2016-06-30T15:05:00”)
se_equiv: { type: “LineString”,
coordinates: [[ -123.1232, 1], [-121.6253, 1]]
}
45
Over 10X performance improvement!
start2 = (((start / yearsecs) - 45) *90) – 90
end2 = (((end / yearsecs) - 45) *90) – 90
event = { type: "LineString", coordinates: [ [ start2, 1 ], [end2, 1 ] ] }
// dx = is the LineString “query”
query = {
g: {
$geoIntersects: {
$geometry: { type: "LineString",
coordinates: [ [ dx, 0 ], [dx, 2 ] ] }
}
}
} 45ms!

46
Mr. Smiley
db.participatingVendors.aggregate([
// Stage 1: The Bounding Box
{$match: { "loc": { $geoWithin: { $geometry:
{ type: "Polygon", coordinates: mapBoundingBox}}}
}}
// Stage 2: Compute distance from Mr. Smiley to the points: Pythagorean theorem:
,{$addFields: {dist: {$sqrt: {$add: [
{$pow:[ {$subtract: [ {$arrayElemAt:[ "$loc.coordinates",0]}, mslng]} , 2]}
,{$pow:[ {$subtract:[ {$arrayElemAt:[ "$loc.coordinates", 1]}, mslat]} , 2]}
]}
}}}
// Stage 3: If the distance between points is LTE the sum of the radii, then
// Mr. Smiley's circle intersects that of the participant:
// Project 0 (no touch) or 1 (touch)
,{$addFields: {"touch": {$cond: [
{$lte: [ {$add: [ "$promoRadius", msr ]}, "$dist" ]}, 0, 1
]}}}
,{$match: {"touch": 1}}
]);
// Assume Mr. Smiley has these params:
var mslng = -90.00;
var mslat = 42.00;
var msr = 0.005; // ~1500 ft radius around him
47
The Pusher
var pts = [ [-74.01,40.70], [-73.99,40.71], . . .];
db.foo.insert({_id:1,
loc: { type:"LineString", coordinates: [ pts[0], pts[1] ]}});
// Push points onto LineString to "extend it” in an index optimized way!
for(i = 2; i < pts.length; i++) {
db.foo.update({_id:1},{$push: {"loc.coordinates”: pts[i]}});
// Perform other functions, e.g.
c=db.foo.find({loc: {$geoIntersects:
{$geometry: { type: ”Polygon", coordinates: … } } });
}
48
Perimeter of Simple Polygon
> db.foo.insert({_id:1, "poly": [ [0,0], [2,12], [4,0], [2,5], [0,0] ] });
> db.foo.insert({_id:2, "poly": [ [2,2], [5,8], [6,0], [3,1], [2,2] ] });
> db.foo.aggregate([
{$project: {"conv": {$map: { input: "$poly", as: "z", in: {
x: {$arrayElemAt: ["$$z”,0]}, y: {$arrayElemAt: ["$$z”,1]}
,len: {$literal: 0} }}}}}
,{$addFields: {first: {$arrayElemAt: [ "$conv", 0 ]} }}
,{$project: {"qqq":
{$reduce: { input: "$conv", initialValue: "$first", in: {
x: "$$this.x”, y: "$$this.y"
,len: {$add: ["$$value.len", // len = oldlen + newLen
{$sqrt: {$add: [
{$pow:[ {$subtract:["$$value.x","$$this.x"]}, 2]}
,{$pow:[ {$subtract:["$$value.y","$$this.y"]}, 2]}
] }} ] } }}
,{$project: {"len": "$qqq.len"}}
{ "_id" : 1, “len" : 35.10137973546188 }
{ "_id" : 2, "len" : 19.346952903339393 }
49
Geospatial = 2D Numeric Indexable Space
Find all branches close to my location:
target = [ someLatitude, someLongitude ];
radians = 10 / 3963.2; // 10 miles
db.coll.find({"location": { $geoWithin :
{ $center : [ target, radians ] }}});
Find nearest investments on efficient frontier:
target = [ risk, reward ];
closeness = someFunction(risk, reward);
db.coll.find({”investmentValue": { $geoWithin :
{ $center : [ target, closeness]}}});
50
Basic Tips & Tricks
• We use [long,lat], not [lat,long] like Google Maps
• Use 2dsphere for geo; avoid legacy $box/$circle/$polygon
• Use 2d for true 2d numeric hacks
• 5 digits beyond decimal is accurate to 1.1m:
• var loc = [ -92.12345, 42.56789] // FINE
• var loc = [ -92.123459261145, 42.567891378902] // ABSURD
• $geoWithin and $geoIntersects do not REQUIRE index
• Remember to close loops (it’s GeoJSON!)
51
esri-related Tips & Tricks
• Shapefiles are everywhere; google shapefile <whatever>
• Crack shapefiles to GeoJSON with python pyshp module
import shapefile
import sys
from json import dumps
reader = shapefile.Reader(sys.argv[1])
field_names = [field[0] for field in reader.fields[1:] ]
buffer = []
for sr in reader.shapeRecords():
buffer.append(dict(geometry=sr.shape.__geo_interface__,
properties=dict(zip(field_names, sr.record))))
sys.stdout.write(dumps({"type": "FeatureCollection”, "features": buffer},
indent=2) + "n”)
Q & A
Thank You!
Buzz Moschetti
Enterprise Architect
buzz.moschetti@mongodb.com
@buzzmoschetti
54
Agenda
• What does geospatial capabilities mean?
• The "levels": DB with geo types, rendering, analytics
• MongoDB brings together geo AND non-geo data
• Geo Data model
• GeoJSON
• Combining GeoJSON with non-geo data
• APIs and Use Cases
• Looking up things contained in a polygon
• Finding things near a point
• Summary of geo ops e.g. $center
• $geoNear and the agg framework
• The power of the document model and MongoDB APIs
• Arrays and rich shapes as first class types
• Comparison to Postgres (PostGIS)

Indexing
• Geospatial queries do not necessarily require an index
• 2d vs. 2dsphere
• Geo stacks and the Ecosystem
• MongoDB and OpenGIS and OpenGEO
• Google Maps
• MEAN
• A Sampling of Geo Solutions
• Mr. Smiley, etc.
• Integration with esri and shapefiles
• esri shapefile cracking
55
Clever Hacks
• John Page date thing
• Mr. Smiley
• Wildfire
• Push pts on a LineString and check for intersects
• Perimeter & Area of simple polygon
• makeNgon
56
MongoDB handles your data + geo
Google handles the maps
Our Drivers
Google Map APIs
Chrome
Other Javascript
Your Data
GeoJSON
• Organization unit is document, then
collection
• Geo data can contain arbitrary peer
data or higher scope within doc
• Proper handling of int, long, double,
and decimal128
• Dates are REAL datetimes
• Uniform indexability and querability
across geo and “regular” data
Your Server-side
code

More Related Content

What's hot

Mongodb - NoSql Database
Mongodb - NoSql DatabaseMongodb - NoSql Database
Mongodb - NoSql Database
Prashant Gupta
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
MongoDB
 
PostgreSQL- An Introduction
PostgreSQL- An IntroductionPostgreSQL- An Introduction
PostgreSQL- An Introduction
Smita Prasad
 
Creating a Context-Aware solution, Complex Event Processing with FIWARE Perseo
Creating a Context-Aware solution, Complex Event Processing with FIWARE PerseoCreating a Context-Aware solution, Complex Event Processing with FIWARE Perseo
Creating a Context-Aware solution, Complex Event Processing with FIWARE Perseo
Fernando Lopez Aguilar
 
Introduction to Oracle Spatial
Introduction to Oracle SpatialIntroduction to Oracle Spatial
Introduction to Oracle Spatial
Ehsan Hamzei
 
PostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | EdurekaPostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | Edureka
Edureka!
 
Basics of MongoDB
Basics of MongoDB Basics of MongoDB
Basics of MongoDB
Habilelabs
 
Mongo DB Presentation
Mongo DB PresentationMongo DB Presentation
Mongo DB Presentation
Jaya Naresh Kovela
 
Introduction to PostgreSQL
Introduction to PostgreSQLIntroduction to PostgreSQL
Introduction to PostgreSQL
Joel Brewer
 
FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...
FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...
FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...
FIWARE
 
An intro to Azure Data Lake
An intro to Azure Data LakeAn intro to Azure Data Lake
An intro to Azure Data Lake
Rick van den Bosch
 
PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS
MinPa Lee
 
MongoDB
MongoDBMongoDB
MongoDB
nikhil2807
 
RDBMS vs NoSQL
RDBMS vs NoSQLRDBMS vs NoSQL
RDBMS vs NoSQL
Murat Çakal
 
Mongo db intro.pptx
Mongo db intro.pptxMongo db intro.pptx
Mongo db intro.pptx
JWORKS powered by Ordina
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
Mike Dirolf
 
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
HaNJiN Lee
 
Apache Sentry for Hadoop security
Apache Sentry for Hadoop securityApache Sentry for Hadoop security
Apache Sentry for Hadoop security
bigdatagurus_meetup
 
Mongo Nosql CRUD Operations
Mongo Nosql CRUD OperationsMongo Nosql CRUD Operations
Mongo Nosql CRUD Operations
anujaggarwal49
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL Databases
Derek Stainer
 

What's hot (20)

Mongodb - NoSql Database
Mongodb - NoSql DatabaseMongodb - NoSql Database
Mongodb - NoSql Database
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
PostgreSQL- An Introduction
PostgreSQL- An IntroductionPostgreSQL- An Introduction
PostgreSQL- An Introduction
 
Creating a Context-Aware solution, Complex Event Processing with FIWARE Perseo
Creating a Context-Aware solution, Complex Event Processing with FIWARE PerseoCreating a Context-Aware solution, Complex Event Processing with FIWARE Perseo
Creating a Context-Aware solution, Complex Event Processing with FIWARE Perseo
 
Introduction to Oracle Spatial
Introduction to Oracle SpatialIntroduction to Oracle Spatial
Introduction to Oracle Spatial
 
PostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | EdurekaPostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | Edureka
 
Basics of MongoDB
Basics of MongoDB Basics of MongoDB
Basics of MongoDB
 
Mongo DB Presentation
Mongo DB PresentationMongo DB Presentation
Mongo DB Presentation
 
Introduction to PostgreSQL
Introduction to PostgreSQLIntroduction to PostgreSQL
Introduction to PostgreSQL
 
FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...
FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...
FIWARE Global Summit - The Scorpio NGSI-LD Broker: Features and Supported Arc...
 
An intro to Azure Data Lake
An intro to Azure Data LakeAn intro to Azure Data Lake
An intro to Azure Data Lake
 
PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS
 
MongoDB
MongoDBMongoDB
MongoDB
 
RDBMS vs NoSQL
RDBMS vs NoSQLRDBMS vs NoSQL
RDBMS vs NoSQL
 
Mongo db intro.pptx
Mongo db intro.pptxMongo db intro.pptx
Mongo db intro.pptx
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습 공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
공간정보 거점대학 - OpenLayers의 고급 기능 이해 및 실습
 
Apache Sentry for Hadoop security
Apache Sentry for Hadoop securityApache Sentry for Hadoop security
Apache Sentry for Hadoop security
 
Mongo Nosql CRUD Operations
Mongo Nosql CRUD OperationsMongo Nosql CRUD Operations
Mongo Nosql CRUD Operations
 
Introduction to NoSQL Databases
Introduction to NoSQL DatabasesIntroduction to NoSQL Databases
Introduction to NoSQL Databases
 

Similar to Getting Started with Geospatial Data in MongoDB

Mongodb intro
Mongodb introMongodb intro
Mongodb intro
christkv
 
Fast querying indexing for performance (4)
Fast querying   indexing for performance (4)Fast querying   indexing for performance (4)
Fast querying indexing for performance (4)
MongoDB
 
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
MongoDB
 
Geoindexing with MongoDB
Geoindexing with MongoDBGeoindexing with MongoDB
Geoindexing with MongoDB
leafnode
 
Webinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev TeamsWebinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev Teams
MongoDB
 
OSDC 2012 | Building a first application on MongoDB by Ross Lawley
OSDC 2012 | Building a first application on MongoDB by Ross LawleyOSDC 2012 | Building a first application on MongoDB by Ross Lawley
OSDC 2012 | Building a first application on MongoDB by Ross Lawley
NETWAYS
 
Building web applications with mongo db presentation
Building web applications with mongo db presentationBuilding web applications with mongo db presentation
Building web applications with mongo db presentation
Murat Çakal
 
Using MongoDB and Python
Using MongoDB and PythonUsing MongoDB and Python
Using MongoDB and Python
Mike Bright
 
2016 feb-23 pyugre-py_mongo
2016 feb-23 pyugre-py_mongo2016 feb-23 pyugre-py_mongo
2016 feb-23 pyugre-py_mongo
Michael Bright
 
TDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLTDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQL
tdc-globalcode
 
Back to Basics Webinar 4: Advanced Indexing, Text and Geospatial Indexes
Back to Basics Webinar 4: Advanced Indexing, Text and Geospatial IndexesBack to Basics Webinar 4: Advanced Indexing, Text and Geospatial Indexes
Back to Basics Webinar 4: Advanced Indexing, Text and Geospatial Indexes
MongoDB
 
Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4
MongoDB
 
Social Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDBSocial Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDB
Takahiro Inoue
 
1403 app dev series - session 5 - analytics
1403   app dev series - session 5 - analytics1403   app dev series - session 5 - analytics
1403 app dev series - session 5 - analytics
MongoDB
 
MongoDb and NoSQL
MongoDb and NoSQLMongoDb and NoSQL
MongoDb and NoSQL
TO THE NEW | Technology
 
Mongodb ExpressJS HandlebarsJS NodeJS FullStack
Mongodb ExpressJS HandlebarsJS NodeJS FullStackMongodb ExpressJS HandlebarsJS NodeJS FullStack
Mongodb ExpressJS HandlebarsJS NodeJS FullStack
Narendranath Reddy
 
Webinar: Applikationsentwicklung mit MongoDB : Teil 5: Reporting & Aggregation
Webinar: Applikationsentwicklung mit MongoDB: Teil 5: Reporting & AggregationWebinar: Applikationsentwicklung mit MongoDB: Teil 5: Reporting & Aggregation
Webinar: Applikationsentwicklung mit MongoDB : Teil 5: Reporting & Aggregation
MongoDB
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)
Uwe Printz
 
LocationTech Projects
LocationTech ProjectsLocationTech Projects
LocationTech Projects
Jody Garnett
 
Indexing Strategies to Help You Scale
Indexing Strategies to Help You ScaleIndexing Strategies to Help You Scale
Indexing Strategies to Help You Scale
MongoDB
 

Similar to Getting Started with Geospatial Data in MongoDB (20)

Mongodb intro
Mongodb introMongodb intro
Mongodb intro
 
Fast querying indexing for performance (4)
Fast querying   indexing for performance (4)Fast querying   indexing for performance (4)
Fast querying indexing for performance (4)
 
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
Conceptos básicos. Seminario web 4: Indexación avanzada, índices de texto y g...
 
Geoindexing with MongoDB
Geoindexing with MongoDBGeoindexing with MongoDB
Geoindexing with MongoDB
 
Webinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev TeamsWebinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev Teams
 
OSDC 2012 | Building a first application on MongoDB by Ross Lawley
OSDC 2012 | Building a first application on MongoDB by Ross LawleyOSDC 2012 | Building a first application on MongoDB by Ross Lawley
OSDC 2012 | Building a first application on MongoDB by Ross Lawley
 
Building web applications with mongo db presentation
Building web applications with mongo db presentationBuilding web applications with mongo db presentation
Building web applications with mongo db presentation
 
Using MongoDB and Python
Using MongoDB and PythonUsing MongoDB and Python
Using MongoDB and Python
 
2016 feb-23 pyugre-py_mongo
2016 feb-23 pyugre-py_mongo2016 feb-23 pyugre-py_mongo
2016 feb-23 pyugre-py_mongo
 
TDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLTDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQL
 
Back to Basics Webinar 4: Advanced Indexing, Text and Geospatial Indexes
Back to Basics Webinar 4: Advanced Indexing, Text and Geospatial IndexesBack to Basics Webinar 4: Advanced Indexing, Text and Geospatial Indexes
Back to Basics Webinar 4: Advanced Indexing, Text and Geospatial Indexes
 
Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4Geospatial Enhancements in MongoDB 2.4
Geospatial Enhancements in MongoDB 2.4
 
Social Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDBSocial Data and Log Analysis Using MongoDB
Social Data and Log Analysis Using MongoDB
 
1403 app dev series - session 5 - analytics
1403   app dev series - session 5 - analytics1403   app dev series - session 5 - analytics
1403 app dev series - session 5 - analytics
 
MongoDb and NoSQL
MongoDb and NoSQLMongoDb and NoSQL
MongoDb and NoSQL
 
Mongodb ExpressJS HandlebarsJS NodeJS FullStack
Mongodb ExpressJS HandlebarsJS NodeJS FullStackMongodb ExpressJS HandlebarsJS NodeJS FullStack
Mongodb ExpressJS HandlebarsJS NodeJS FullStack
 
Webinar: Applikationsentwicklung mit MongoDB : Teil 5: Reporting & Aggregation
Webinar: Applikationsentwicklung mit MongoDB: Teil 5: Reporting & AggregationWebinar: Applikationsentwicklung mit MongoDB: Teil 5: Reporting & Aggregation
Webinar: Applikationsentwicklung mit MongoDB : Teil 5: Reporting & Aggregation
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)
 
LocationTech Projects
LocationTech ProjectsLocationTech Projects
LocationTech Projects
 
Indexing Strategies to Help You Scale
Indexing Strategies to Help You ScaleIndexing Strategies to Help You Scale
Indexing Strategies to Help You Scale
 

More from MongoDB

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB
 

More from MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Recently uploaded

How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
ToXSL Technologies
 
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
dakas1
 
Manyata Tech Park Bangalore_ Infrastructure, Facilities and More
Manyata Tech Park Bangalore_ Infrastructure, Facilities and MoreManyata Tech Park Bangalore_ Infrastructure, Facilities and More
Manyata Tech Park Bangalore_ Infrastructure, Facilities and More
narinav14
 
Beginner's Guide to Observability@Devoxx PL 2024
Beginner's  Guide to Observability@Devoxx PL 2024Beginner's  Guide to Observability@Devoxx PL 2024
Beginner's Guide to Observability@Devoxx PL 2024
michniczscribd
 
ACE - Team 24 Wrapup event at ahmedabad.
ACE - Team 24 Wrapup event at ahmedabad.ACE - Team 24 Wrapup event at ahmedabad.
ACE - Team 24 Wrapup event at ahmedabad.
Maitrey Patel
 
Upturn India Technologies - Web development company in Nashik
Upturn India Technologies - Web development company in NashikUpturn India Technologies - Web development company in Nashik
Upturn India Technologies - Web development company in Nashik
Upturn India Technologies
 
Going AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applicationsGoing AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applications
Alina Yurenko
 
The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...
The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...
The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...
kalichargn70th171
 
Building API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructureBuilding API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructure
confluent
 
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom KittEnhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
Peter Caitens
 
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
kgyxske
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
Bert Jan Schrijver
 
🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻
🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻
🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻
campbellclarkson
 
一比一原版(USF毕业证)旧金山大学毕业证如何办理
一比一原版(USF毕业证)旧金山大学毕业证如何办理一比一原版(USF毕业证)旧金山大学毕业证如何办理
一比一原版(USF毕业证)旧金山大学毕业证如何办理
dakas1
 
The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024
Yara Milbes
 
Migration From CH 1.0 to CH 2.0 and Mule 4.6 & Java 17 Upgrade.pptx
Migration From CH 1.0 to CH 2.0 and  Mule 4.6 & Java 17 Upgrade.pptxMigration From CH 1.0 to CH 2.0 and  Mule 4.6 & Java 17 Upgrade.pptx
Migration From CH 1.0 to CH 2.0 and Mule 4.6 & Java 17 Upgrade.pptx
ervikas4
 
Alluxio Webinar | 10x Faster Trino Queries on Your Data Platform
Alluxio Webinar | 10x Faster Trino Queries on Your Data PlatformAlluxio Webinar | 10x Faster Trino Queries on Your Data Platform
Alluxio Webinar | 10x Faster Trino Queries on Your Data Platform
Alluxio, Inc.
 
How GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdfHow GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdf
Zycus
 
Optimizing Your E-commerce with WooCommerce.pptx
Optimizing Your E-commerce with WooCommerce.pptxOptimizing Your E-commerce with WooCommerce.pptx
Optimizing Your E-commerce with WooCommerce.pptx
WebConnect Pvt Ltd
 

Recently uploaded (20)

How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
 
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
 
Manyata Tech Park Bangalore_ Infrastructure, Facilities and More
Manyata Tech Park Bangalore_ Infrastructure, Facilities and MoreManyata Tech Park Bangalore_ Infrastructure, Facilities and More
Manyata Tech Park Bangalore_ Infrastructure, Facilities and More
 
Beginner's Guide to Observability@Devoxx PL 2024
Beginner's  Guide to Observability@Devoxx PL 2024Beginner's  Guide to Observability@Devoxx PL 2024
Beginner's Guide to Observability@Devoxx PL 2024
 
ACE - Team 24 Wrapup event at ahmedabad.
ACE - Team 24 Wrapup event at ahmedabad.ACE - Team 24 Wrapup event at ahmedabad.
ACE - Team 24 Wrapup event at ahmedabad.
 
Upturn India Technologies - Web development company in Nashik
Upturn India Technologies - Web development company in NashikUpturn India Technologies - Web development company in Nashik
Upturn India Technologies - Web development company in Nashik
 
Going AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applicationsGoing AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applications
 
The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...
The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...
The Power of Visual Regression Testing_ Why It Is Critical for Enterprise App...
 
Building API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructureBuilding API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructure
 
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom KittEnhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
 
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
 
🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻
🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻
🏎️Tech Transformation: DevOps Insights from the Experts 👩‍💻
 
一比一原版(USF毕业证)旧金山大学毕业证如何办理
一比一原版(USF毕业证)旧金山大学毕业证如何办理一比一原版(USF毕业证)旧金山大学毕业证如何办理
一比一原版(USF毕业证)旧金山大学毕业证如何办理
 
bgiolcb
bgiolcbbgiolcb
bgiolcb
 
The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024
 
Migration From CH 1.0 to CH 2.0 and Mule 4.6 & Java 17 Upgrade.pptx
Migration From CH 1.0 to CH 2.0 and  Mule 4.6 & Java 17 Upgrade.pptxMigration From CH 1.0 to CH 2.0 and  Mule 4.6 & Java 17 Upgrade.pptx
Migration From CH 1.0 to CH 2.0 and Mule 4.6 & Java 17 Upgrade.pptx
 
Alluxio Webinar | 10x Faster Trino Queries on Your Data Platform
Alluxio Webinar | 10x Faster Trino Queries on Your Data PlatformAlluxio Webinar | 10x Faster Trino Queries on Your Data Platform
Alluxio Webinar | 10x Faster Trino Queries on Your Data Platform
 
How GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdfHow GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdf
 
Optimizing Your E-commerce with WooCommerce.pptx
Optimizing Your E-commerce with WooCommerce.pptxOptimizing Your E-commerce with WooCommerce.pptx
Optimizing Your E-commerce with WooCommerce.pptx
 

Getting Started with Geospatial Data in MongoDB

  • 1. Getting Started with Geospatial Data in MongoDB Buzz Moschetti Enterprise Architect buzz.moschetti@mongodb.com @buzzmoschetti
  • 2. 2 Agenda • What is MongoDB? • What does “geospatial capabilities” mean? • GeoJSON • Combining GeoJSON with non-geo data • APIs and Use Cases • Comparison to OGC (Open Geospatial Consortium) • Indexing • Using Geo Capabilities for non-Geo Things • Esri and shapefiles
  • 3. 3 MongoDB: The Post-Relational General Purpose Database Document Data Model Open- Source Fully Featured High Performance Scalable { name: “John Smith”, pfxs: [“Dr.”,”Mr.”], address: “10 3rd St.”, phone: { home: 1234567890, mobile: 1234568138 } }
  • 4. Nexus Architecture Scalability & Performance Always On, Global Deployments Flexibility Expressive Query Language & Secondary Indexes Strong Consistency Enterprise Management & Integrations
  • 5. 5 MongoDB Company Overview ~800 employees 2500+ customers Over $311 million in funding Offices in NY & Palo Alto and across EMEA, and APAC
  • 6. 6 What is “Geo”? At least 4 levels of capability
  • 7. 7 The Geo Stack Efficiently store, query, and index arbitrary points, lines and polygons in the DB
  • 8. 8 The Geo Stack Platform for data analysis of peer data (trades/house value/population/sales/widgets) grouped by geo data Efficiently store, query, and index arbitrary points, lines and polygons in the DB
  • 9. 9 The Geo Stack Graphical rendering of geo shapes on a map Platform for data analysis of peer data (trades/house value/population/sales/widgets) grouped by geo data Efficiently store, query, and index arbitrary points, lines and polygons in the DB
  • 10. 10 The Geo Stack Application(s) to browse and manipulate all the data Graphical rendering of geo shapes on a map Platform for data analysis of peer data (trades/house value/population/sales/widgets) grouped by geo data Efficiently store, query, and index arbitrary points, lines and polygons in the DB
  • 11. 11 Important: Sometimes there is NO Map • Geo stack must support geo functions WITHOUT a Map • Offline reporting • “Nightly fleet management report” • “Distributor loss by assigned area” • Compute/analytical processing • Dynamic polygon generation • Weather catastrophe simulation • Other geo-filtering as input to analytics
  • 12. 12 MongoDB: The Data “Base” Application(s) to browse and visualize Graphical rendering of geo shapes on a map Platform for data analysis of peer data (trades/value/population/sales/widgets) grouped by geo data Efficiently store, query, and index arbitrary points, lines, and polygons in the DB Peer Data Geo Data
  • 13. 13 One Persistor for All Applications & Use Cases Google Map APIs Browser / Mobile Other Javascript Peer Data Geo Data MongoDB node.js Driver MongoDB python Driver Quant / Analytics with pandas Web Service Code MongoDB Java Driver Nightly Reporting Enterprise Integration MongoDB BI Connector Tableau ClickView PowerBI Talend Mule Informatica
  • 14. 14 Balanced Reporting • Most other NoSQL DBs do not have this capability • Oracle, Postgres, MySQL, SQLServer do offer it and subscribe to Open GeoS Consortium (OGC) standards
  • 15. 15 MongoDB data model is the major difference MongoDB: Simple, parse-free, type-correct APIs and data to manipulate and interrogate geo shapes a.k.a. arrays (of arrays (of arrays)) OpenGIS: Piles of “ST_” functions: http://postgis.net/docs/reference.html#Geometry_Accessors SELECT ST_MakePolygon( ST_GeomFromText( 'LINESTRING(75.15 29.53,77 29,77.6 29.5, 75.15 29.53)'));
  • 17. 17 Legacy: 2D points { name: {f: “Buzz”, l: “Moschetti”}, favoritePets: [ “dog”, “cat” ], house: [ -95.12345, 43.23423 ] }
  • 18. 18 Better: GeoJSON { name: {f: “Buzz”, l: “Moschetti”}, favoritePets: [ “dog”, “cat” ], house: { type: “Point”, coordinates: [ -95.12345, 43.23423 ] } }
  • 19. 19 Better: GeoJSON { name: “Superfund132”, location: { type: “Polygon”, coordinates: [ [ [-95.12345, 43.2342],[-95.12456,43.2351],…] [ [-92.8381, 43.75], … ] // “hole” ] } }
  • 20. 20 The GeoJSON Family { type: “Point”, “MultiPoint”, “LineString”,”MultiLineString”, “Polygon”, “MultiPolygon” coordinates: [ specific to type ] } { type: “GeometryCollection” geometries: [ { type: (one of above), coordinates: [ . . . ] } ] NO COMPUTED SHAPES (Circle, Arc, Box, etc.) We use the WGS84 standard: http://spatialreference.org/ref/epsg/4326/
  • 21. 21 MongoDB Data Types are Geo-friendly var poly = [ [ [-95.12345,43.2342],[-95.12345,43.2351], [-95.12211,43.2351],[-95.12211,43.2342], [-95.12345,43.2342] // close the loop! ] ]; db.myCollection.insert( {name: {f: "Buzz", l: "Moschetti"}, favoritePets: ["dog", "cat"], geo: { type: "Polygon“, coordinates: poly } }));
  • 22. 22 … even with Java Document doc = new Document(); doc.put("name", ”Superfund132"); List ring = new ArrayList(); addPoint(ring, -95.12345, 43.2342); addPoint(ring, -95.12345, 43.2351); addPoint(ring, -95.12211, 43.2351); addPoint(ring, -95.12211, 43.2342); addPoint(ring, -95.12345, 43.2342); List poly = new ArrayList(); poly.add(ring); Map mm = new HashMap(); mm.put("type", "Polygon"); mm.put("coordinates", poly); doc.put("geo", mm); coll.insertOne(doc); static void addPoint(List ll, double lng, double lat) { List pt = new ArrayList(); pt.add(lng); pt.add(lat); ll.add(pt); }
  • 23. 23 All Types Are Preserved Correctly Document doc = coll.find().first(); recursiveWalk(doc); name: java.lang.String: Superfund132 geo: com.mongodb.BasicDBObject type: java.lang.String: Polygon coordinates: com.mongodb.BasicDBList 0: com.mongodb.BasicDBList 0: com.mongodb.BasicDBList 0: java.lang.Double: -95.12345 1: java.lang.Double: 43.2342 1: com.mongodb.BasicDBList 0: java.lang.Double: -95.12345 1: java.lang.Double: 43.2351 2: com.mongodb.BasicDBList 0: java.lang.Double: -95.12211 1: java.lang.Double: 43.2351
  • 24. 24 Comparison to “Good” PostGIS import org.postgis.PGgeometry; // extended from org.postgresql.util.PGobject ((org.postgresql.Connection)conn).addDataType("geometry","org.postgis.PGgeometry" ) String sql = "select geom from someTable”; ResultSet r = stmt.executeQuery(sql); while( r.next() ) { PGgeometry geom = (PGgeometry)r.getObject(1); if( geom.getType() = Geometry.POLYGON ) { Polygon pl = (Polygon)geom.getGeometry(); for( int r = 0; r < pl.numRings(); r++) { LinearRing rng = pl.getRing(r); . . . } }
  • 25. 25 Comparison to most OpenGIS String sql = "select ST_AsText(geom) from someTable”; ResultSet r = stmt.executeQuery(sql); while( r.next() ) { String wkt = r.getString(1); // wkt is ”POLYGON((0 0,0 1,1 1,1 0,0 0))” // http://en.wikipedia.org/wiki/Well-known_text // Now we have to parse the string into // an array of array of doubles. // Don’t want to introduce a 3rd party dependency… // So . . . We write our own parser. }
  • 26. 26 Checkpoint We have data in and out of the DB using basic operations (insert and find) Now we need to make it performant!
  • 27. 27 Indexing collection.createIndex({loc:”2d”}) When to use: • Your database has legacy location data from MongoDB 2.2 or earlier • You do not intend to store any location data as GeoJSON objects • “Special Use Cases” e.g. arbitrary two numeric dimension indexing collection.createIndex({loc:”2dsphere”}) When to use: • Supports all GeoJSON objects and legacy [x,y] pairs collection.createIndex({loc:”geoHaystack”}) When to use: • Special small area flat (planar) lookup optimization
  • 28. 28 Indexing collection.createIndex({loc:”2d”}) When to use: • Your database has legacy location data from MongoDB 2.2 or earlier • You do not intend to store any location data as GeoJSON objects • “Special Use Cases” e.g. arbitrary two numeric dimension indexing collection.createIndex({loc:”2dsphere”}) When to use: • Supports all GeoJSON objects and legacy [x,y] pairs collection.createIndex({loc:”geoHaystack”}) When to use: • Special small area flat (planar) lookup optimization
  • 29. 29 find()/$match and Indexing Operator Geometry Arg Type 2d 2dsphere $geoWithin $box,$center,$polygon Y N $geometry: { type, coordinates } N Y $centerSphere: [ [x,y], radians ] Y Y $geoIntersects $geometry only N Y $near,$nearSphere [x,y] R - (output sorted by distance) $geometry: {type, coordinates} - R + $minDistance N Y + $maxDistance Y Y Y = will assist N = will not assist R = REQUIRED Syntax helper: find(“loc”:{$geoWithin: {$box: [ [x0,y0], [x1,y2] }}); find(“loc”:{$geoWithin: {$geometry: { type: “Polygon”, coordinates: [ …. ] }}} );
  • 30. 30 Aggregation Framework: $geoNear Option 2D 2dsphere $geoNear (output sorted by distance) near: { type: “Point”, coordinates } - R - and spherical:true near: [ x, y ] R (or) R query: { expression INCL geo find() on previous page EXCEPT $near} N N Y = will assist N = will not assist R = REQUIRED Important Considerations: 1. You can only use $geoNear as the first stage of a pipeline. 2. You must include the distanceField option. 3. The collection must have only one geospatial index: one 2d index or one 2dsphere index. 4. You do not need to specify which field in the documents hold the coordinate pair or point. Because $geoNear requires that the collection have a single geospatial index, $geoNear implicitly uses the indexed field.
  • 31. 31 Use Cases How do we bring data representation, fast lookup, and . . .
  • 32. 32 Case #1: Find Things in a Given Area + More • Docs contain Points (or possibly “small” polygons) • $geoWithin db.site.aggregate([ {$match: { "loc": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ coords ] }}} ,"portfolio_id": portid ,“insuredValue“: {$gt: 1000000} ,“insuredDate“: {$gt: new ISODate(„2016-01-01“) }} ,{$bucket: {groupBy: „$insuredValue“, boundaries: [ 1000000, 2000000, 5000000, 10000000, 20000000, Infinity] }} . . .
  • 33. 33 Case #2: Find Things in an Area Stored in DB • Get the shape from the “shapes” collection via query: db.shapes.findOne({predicate},{theShape:1}); • Turn around and query the target collection, e.g. buildingSites with shape: db.buildingSites.find({loc:{$geoWithin: theShape}})
  • 34. 34 Case #3: Find Things Closest to where I am db.buildingSites.aggregate([{$geoNear: { point … }}); • Results returned already in sorted order by closeness
  • 35. 35 Case #3.5: Find Things Closest to where I am but within some bounds • db.buildingSites.aggregate([ {$geoNear: { query: { “loc”: {$geoWithin: {$centerSphere: … }} } (or) query: { “loc”: {$geoWithin: {$geometry: GeoJSON }} } }} ])
  • 36. 36 When the Database isn’t enough
  • 37. 37 When the Database isn’t enough • VERY fast intersection/within for many objects given probes at high velocity (10000s/sec). • Geo manipulation: unions, deltas, layering • Dynamic/programmatic geo construction • Advanced features: smoothing, simplifiers, centroids, …
  • 38. 38 You Need Three Things • Basic geo objects • Geo operators like intersects, within, etc. • Algos and smoothers, etc.
  • 39. 39 com.vividsolutions.jts Map m = (Map) dbo.get("loc"); // get a GeoJSON object from MongoDB List coords = (List) m.get("coordinates"); List outerRing = (List) coords.get(0); // polygon is array of array of pts CoordinateSequence pseq = new CoordinateGeoJSONSequence(outerRing, true); LinearRing outerlr = new LinearRing(pseq, gf); int numHoles = coords.size() - 1; // -1 to skip outer ring; LinearRing[] holes = null; if(numHoles > 0) { holes = new LinearRing[numHoles]; for(int k = 0; k < numHoles; k++) { List innerRing = (List) coords.get(k+1); // +1 adj for outer ring CoordinateSequence psx = new CoordinateGeoJSONSequence(innerRing, true); holes[k] = new LinearRing(psx, gf); } } Polygon poly1 = new Polygon(outerlr, holes, gf); // ok if holes was null Point pt1 = new Point(pseq2, gf); boolean a = pt1.intersects(poly1); Geometry simplified = TopologyPreservingSimplifier.simplify(poly1, tolerance);
  • 40. 40 The Ecosystem • OpenGeo runs over MongoDB! http://suite.opengeo.org/docs/latest/dataadmin/mongodb/index.html • BoundlessGeo: Commerical support for OpenGeo over MongoDB * Provides top 2 tiers (viz, analysis) * https://boundlessgeo.com
  • 41. 41 Geo Capabilities beyond “Simple Geo”
  • 42. 42 Geo as Date Range { who: ‘john’ where: ‘mongodb’ what: ‘lightning talk’ start: ISODate(“2016-06-30T15:00:00”) end: ISODate(“2016-06-30T15:05:00”) } What events were happening at 15:03? collection.find({ start : { $lte:ISODate(“2016-06-30T15:05:03”)}, end: { $gte:ISODate(“2016-06-30T15:05:03”)} })
  • 43. 43 Geo as Date Range • Ranges on 2 attributes – Two BTree walks (intersection) • Assuming time can be anywhere in range of records, index walk is average 50% of index • Test: Macbook Pro, i5, 16GB RAM, data fits in WT Cache easily. Warmed up. Average of 100 runs 694ms /query using index 487ms /query – COLLSCAN!
  • 44. (StartDate,EndDate)  Range Type using Geo LineString “Query” longitude = t Lat=“quantized”variable 0 1 2 { who: ‘john’ where: ‘mongodb’ what: ‘lightning talk’ start: ISODate(“2016-06-30T15:00:00”) end: ISODate(“2016-06-30T15:05:00”) se_equiv: { type: “LineString”, coordinates: [[ -123.1232, 1], [-121.6253, 1]] }
  • 45. 45 Over 10X performance improvement! start2 = (((start / yearsecs) - 45) *90) – 90 end2 = (((end / yearsecs) - 45) *90) – 90 event = { type: "LineString", coordinates: [ [ start2, 1 ], [end2, 1 ] ] } // dx = is the LineString “query” query = { g: { $geoIntersects: { $geometry: { type: "LineString", coordinates: [ [ dx, 0 ], [dx, 2 ] ] } } } } 45ms! 
  • 46. 46 Mr. Smiley db.participatingVendors.aggregate([ // Stage 1: The Bounding Box {$match: { "loc": { $geoWithin: { $geometry: { type: "Polygon", coordinates: mapBoundingBox}}} }} // Stage 2: Compute distance from Mr. Smiley to the points: Pythagorean theorem: ,{$addFields: {dist: {$sqrt: {$add: [ {$pow:[ {$subtract: [ {$arrayElemAt:[ "$loc.coordinates",0]}, mslng]} , 2]} ,{$pow:[ {$subtract:[ {$arrayElemAt:[ "$loc.coordinates", 1]}, mslat]} , 2]} ]} }}} // Stage 3: If the distance between points is LTE the sum of the radii, then // Mr. Smiley's circle intersects that of the participant: // Project 0 (no touch) or 1 (touch) ,{$addFields: {"touch": {$cond: [ {$lte: [ {$add: [ "$promoRadius", msr ]}, "$dist" ]}, 0, 1 ]}}} ,{$match: {"touch": 1}} ]); // Assume Mr. Smiley has these params: var mslng = -90.00; var mslat = 42.00; var msr = 0.005; // ~1500 ft radius around him
  • 47. 47 The Pusher var pts = [ [-74.01,40.70], [-73.99,40.71], . . .]; db.foo.insert({_id:1, loc: { type:"LineString", coordinates: [ pts[0], pts[1] ]}}); // Push points onto LineString to "extend it” in an index optimized way! for(i = 2; i < pts.length; i++) { db.foo.update({_id:1},{$push: {"loc.coordinates”: pts[i]}}); // Perform other functions, e.g. c=db.foo.find({loc: {$geoIntersects: {$geometry: { type: ”Polygon", coordinates: … } } }); }
  • 48. 48 Perimeter of Simple Polygon > db.foo.insert({_id:1, "poly": [ [0,0], [2,12], [4,0], [2,5], [0,0] ] }); > db.foo.insert({_id:2, "poly": [ [2,2], [5,8], [6,0], [3,1], [2,2] ] }); > db.foo.aggregate([ {$project: {"conv": {$map: { input: "$poly", as: "z", in: { x: {$arrayElemAt: ["$$z”,0]}, y: {$arrayElemAt: ["$$z”,1]} ,len: {$literal: 0} }}}}} ,{$addFields: {first: {$arrayElemAt: [ "$conv", 0 ]} }} ,{$project: {"qqq": {$reduce: { input: "$conv", initialValue: "$first", in: { x: "$$this.x”, y: "$$this.y" ,len: {$add: ["$$value.len", // len = oldlen + newLen {$sqrt: {$add: [ {$pow:[ {$subtract:["$$value.x","$$this.x"]}, 2]} ,{$pow:[ {$subtract:["$$value.y","$$this.y"]}, 2]} ] }} ] } }} ,{$project: {"len": "$qqq.len"}} { "_id" : 1, “len" : 35.10137973546188 } { "_id" : 2, "len" : 19.346952903339393 }
  • 49. 49 Geospatial = 2D Numeric Indexable Space Find all branches close to my location: target = [ someLatitude, someLongitude ]; radians = 10 / 3963.2; // 10 miles db.coll.find({"location": { $geoWithin : { $center : [ target, radians ] }}}); Find nearest investments on efficient frontier: target = [ risk, reward ]; closeness = someFunction(risk, reward); db.coll.find({”investmentValue": { $geoWithin : { $center : [ target, closeness]}}});
  • 50. 50 Basic Tips & Tricks • We use [long,lat], not [lat,long] like Google Maps • Use 2dsphere for geo; avoid legacy $box/$circle/$polygon • Use 2d for true 2d numeric hacks • 5 digits beyond decimal is accurate to 1.1m: • var loc = [ -92.12345, 42.56789] // FINE • var loc = [ -92.123459261145, 42.567891378902] // ABSURD • $geoWithin and $geoIntersects do not REQUIRE index • Remember to close loops (it’s GeoJSON!)
  • 51. 51 esri-related Tips & Tricks • Shapefiles are everywhere; google shapefile <whatever> • Crack shapefiles to GeoJSON with python pyshp module import shapefile import sys from json import dumps reader = shapefile.Reader(sys.argv[1]) field_names = [field[0] for field in reader.fields[1:] ] buffer = [] for sr in reader.shapeRecords(): buffer.append(dict(geometry=sr.shape.__geo_interface__, properties=dict(zip(field_names, sr.record)))) sys.stdout.write(dumps({"type": "FeatureCollection”, "features": buffer}, indent=2) + "n”)
  • 52. Q & A
  • 53. Thank You! Buzz Moschetti Enterprise Architect buzz.moschetti@mongodb.com @buzzmoschetti
  • 54. 54 Agenda • What does geospatial capabilities mean? • The "levels": DB with geo types, rendering, analytics • MongoDB brings together geo AND non-geo data • Geo Data model • GeoJSON • Combining GeoJSON with non-geo data • APIs and Use Cases • Looking up things contained in a polygon • Finding things near a point • Summary of geo ops e.g. $center • $geoNear and the agg framework • The power of the document model and MongoDB APIs • Arrays and rich shapes as first class types • Comparison to Postgres (PostGIS) Indexing • Geospatial queries do not necessarily require an index • 2d vs. 2dsphere • Geo stacks and the Ecosystem • MongoDB and OpenGIS and OpenGEO • Google Maps • MEAN • A Sampling of Geo Solutions • Mr. Smiley, etc. • Integration with esri and shapefiles • esri shapefile cracking
  • 55. 55 Clever Hacks • John Page date thing • Mr. Smiley • Wildfire • Push pts on a LineString and check for intersects • Perimeter & Area of simple polygon • makeNgon
  • 56. 56 MongoDB handles your data + geo Google handles the maps Our Drivers Google Map APIs Chrome Other Javascript Your Data GeoJSON • Organization unit is document, then collection • Geo data can contain arbitrary peer data or higher scope within doc • Proper handling of int, long, double, and decimal128 • Dates are REAL datetimes • Uniform indexability and querability across geo and “regular” data Your Server-side code