Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Geoindexing with MongoDB
Search
Leszek Krupiński
May 17, 2012
Programming
0
58
Geoindexing with MongoDB
Leszek Krupiński
May 17, 2012
Tweet
Share
More Decks by Leszek Krupiński
See All by Leszek Krupiński
So that the daemon won’t die
leafnode
2
390
Practical PHP7
leafnode
2
450
Dobrze posól swoje hasło
leafnode
0
100
Dobrze posól swoje hasło (z notatkami)
leafnode
0
90
PHPNG kontra HHVM
leafnode
0
99
PHPNG kontra HHVM (z notatkami)
leafnode
0
64
Ewolucja PHP: PHP 5.6, NG, PHP 7, HHVM
leafnode
2
290
Sculpin - Generowanie statycznych stron w PHP
leafnode
2
57
Skalowanie aplikacji PHP
leafnode
1
410
Other Decks in Programming
See All in Programming
ソフトウェアテスト徹底指南書の紹介
goyoki
1
110
あのころの iPod を どうにか再生させたい
orumin
2
2.5k
Kiroの仕様駆動開発から見えてきたAIコーディングとの正しい付き合い方
clshinji
1
150
デザインシステムが必須の時代に
yosuke_furukawa
PRO
2
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
180
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
3
1.2k
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
2
730
Flutter로 Gemini와 MCP를 활용한 Agentic App 만들기 - 박제창 2025 I/O Extended Seoul
itsmedreamwalker
0
150
AHC051解法紹介
eijirou
0
620
技術的負債で信頼性が限界だったWordPress運用をShifterで完全復活させた話
rvirus0817
1
2.1k
SOCI Index Manifest v2が出たので調べてみた / Introduction to SOCI Index Manifest v2
tkikuc
1
110
令和最新版手のひらコンピュータ
koba789
14
8k
Featured
See All Featured
How GitHub (no longer) Works
holman
315
140k
Git: the NoSQL Database
bkeepers
PRO
431
65k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Rails Girls Zürich Keynote
gr2m
95
14k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Fireside Chat
paigeccino
39
3.6k
RailsConf 2023
tenderlove
30
1.2k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Building an army of robots
kneath
306
46k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Visualization
eitanlees
147
16k
Transcript
Geoindexing with MongoDB Leszek Krupiński WebClusters 2012
About me
On-line since 1997
Funny times
1 hr of internet for 1 USD
None
None
First social site: geocities
My first web page
What do I do now
Day-time job Managing team of developers for Polish Air Force
Side: consulting, optimizing, desiging
Buzzwords incoming!
The Internet 2008
Web 2.0
http://en.wikipedia.org/wiki/File:Web_2.0_Map.svg CC-BY-SA-2.5
Be social in your bedroom
alone.
The Internet 2012
Web 3.0
None
Why geospatial?
Needs shifted
Why? Because they could.
None
None
None
How to implement?
Database. Duh.
Keep, but also query
Is there a person at 53.438522,14.52198? Nope. Is there a
person at 53.438522,14.52199? Nope. Is there a person at 53.438522,14.52199? Yeah, here’s Johnny!
Not too useful.
Give me nearby homies. Within the range of 1 km
there is: • Al Gore (53.438625,14.52103) • Bill Clinton (53.432531,14.55127) • Johnny Bravo (53.438286,14.52363)
Now that’s better.
Geoindexing. Nothing new.
Oracle, PostreSQL, Lucene/Solr, even MySQL (via extensions)
SELECT c.holding_company, c.location FROM competitor c, bank b WHERE b.site_id
= 1604 AND SDO_WITHIN_DISTANCE(c.location, b.location, ’distance=2 unit=mile’) = ’TRUE’ ORACLE
SQL is so last year
Let’s use something cool
MongoDB. Because all the cool kids use NoSQL now
None
Why MongoDB?
Choose your NoSQL wise.
NoSQL in MongoDB • Document –based • Queries (JS-like syntax)
• JSON-like storage
Why MongoDB? Use Cases • Archiving • Event logging •
Document and CMS • Gaming • High volume sites • Mobile • Operational datastore • Agile development • Real-time stats Features • Ad hoc queries • Indexing • Replication • Load Balancing • File Storage • Aggregation • Server-side JavaScript • Capped collections http://en.wikipedia.org/wiki/Mongodb
Back to geo.
{ loc: [ 52.0, 21.0 ], name: ”Warsaw”, type: ”City”
}
db.nodes.ensureIndex({loc: '2d'})
That’s it.
Query • Exact o db.places.find( { loc : [50,50] }
) • Near o db.places.find( { loc : { $near : [50,50] } } ) • Limit o db.places.find( { loc : { $near : [50,50] } } ).limit(20) • Distance o db.places.find( { loc : { $near : [50,50] , $maxDistance : 5 } } ).limit(20)
Compound index • db.places.ensureIndex( { location : "2d" , category
: 1 } ); • db.places.find( { location : { $near : [50,50] }, category : 'coffee‚ } );
Bound queries • box = [ [40.73083, -73.99756], [40.741404, -73.988135]
] • db.places.find( {"loc" : {"$within" : {"$box" : box }} } )
Problems
Units
Coordinates in arc units Distance in kilometers
In query
earthRadius = 6378 // km multi = earthRadius * PI
/ 180.0 range = 3000 // km … maxDistance : range * multi…
In results
pointDistance = distances[0].dis / multi
Earth is not flat.
Problem: can’t use linear distance
Earth isn’t flat too.
Solution? Use approximation.
MongoDB has it built-in distances = db.runCommand( { geoNear :
"points", near : [0, 0], spherical : true, maxDistance : range / earthRadius /* to radians */ } ).results
Focus: runCommand distances = db.runCommand({ geoNear : "points" …
Sort by distance Only with runCommand
Automatically sorted • db.runCommand( { geoNear : "places" , near
: [50,50], num : 10 } ); • { "ns" : "test.places", "results" : [ { "dis" : 69.29646421910687, "obj" : … }, { "dis" : 69.29646421910687, "obj" : … }, … ], … }
Demo
OpenStreetMaps database of Poland imported into MongoDB
14.411.552 nodes
3GB of raw XML data
PHP in virtual machine
Imported about 100.000 nodes every 10s.
Pretty cool, eh?
Kudos to Derick Rethans Part of this talk was inspired
by his talk
Questions?
Thanks! Rate me at https://joind.in/talk/view/6475
Geoindexing with MongoDB supplement Leszek Krupiński WebClusters 2012
Why MongoDB?
Evaluate.
PostGIS is cool too. (but it’s SQL, meh)
Why MongoDB? Use Cases • Archiving • Event logging •
Document and CMS • Gaming • High volume sites • Mobile • Operational datastore • Agile development • Real-time stats Features • Ad hoc queries • Indexing • Replication • Load Balancing • File Storage • Aggregation • Server-side JavaScript • Capped collections http://en.wikipedia.org/wiki/Mongodb
If you need other features of MongoDB, use it
If you don’t, evaluate.
Evaluate.
Demo (hopefully)
Questions?
Please leave feedback! Rate me at https://joind.in/6475