Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Geoindexing with MongoDB
Search
Leszek Krupiński
May 17, 2012
Programming
61
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Geoindexing with MongoDB
Leszek Krupiński
May 17, 2012
More Decks by Leszek Krupiński
See All by Leszek Krupiński
So that the daemon won’t die
leafnode
2
420
Practical PHP7
leafnode
2
510
Dobrze posól swoje hasło
leafnode
0
130
Dobrze posól swoje hasło (z notatkami)
leafnode
0
120
PHPNG kontra HHVM
leafnode
0
130
PHPNG kontra HHVM (z notatkami)
leafnode
0
89
Ewolucja PHP: PHP 5.6, NG, PHP 7, HHVM
leafnode
2
310
Sculpin - Generowanie statycznych stron w PHP
leafnode
2
80
Skalowanie aplikacji PHP
leafnode
1
440
Other Decks in Programming
See All in Programming
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
Workers Cache を知る
syumai
0
360
APNsからLive Activityを開始する話
yumnumm
0
170
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
ジョジョの世界をXRで再現する
mofurune
0
160
R8 の設定見直しでアプリサイズ削減
andpad
0
210
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
410
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
780
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
390
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
490
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
340
Featured
See All Featured
KATA
mclloyd
PRO
35
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
So, you think you're a good person
axbom
PRO
2
2.2k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
560
Marketing to machines
jonoalderson
1
5.9k
Leo the Paperboy
mayatellez
10
2.4k
Site-Speed That Sticks
csswizardry
13
1.6k
A designer walks into a library…
pauljervisheath
211
25k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
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