Auf einen Blick: Die Geolokalisierungsfunktionen von MongoDB ermöglichen eine effiziente Speicherung und Abfrage von Standortdaten im GeoJSON-Format. Der Leitfaden bietet Beispiele für Abfragen von Punkten und Flächen, Datenimport und zur Erstellung von Indizes unter Verwendung der räumlichen Abfragemethoden von MongoDB.
- Geolokalisierungsdaten werden im GeoJSON-Format gespeichert.
- Beispiele sind das Abfragen von Punkten und Polygonen mit MongoDB.
Hier erklären wir, wie man Geolokalisierungsdaten in MongoDB abfragt und mit ihnen arbeitet. GeoJSON ist ein allgemein anerkannter Standard, um einen Ort anhand seiner Breiten- und Längengrade darzustellen, also Koordinaten. MongoDB verwendet dieselbe Syntax wie der US Geological Survey oder andere, die mit Karten arbeiten. Zum Beispiel wird ein einfacher Punkt so dargestellt:
"location" : {
"type" : "Point",
"coordinates" : [
-72.7738706,
41.6332836
]
}
Auf dem Globus < Länge 0 westlich von Greenwich, England, konventionell. Zahlen > 0 liegen im Osten. Um sich zu merken, was was ist, kann man sich Längenlinien als lang vorstellen, da sie sich vom Norden bis zum Südpol erstrecken. Dies ist ein Bogen von 180 Grad. Konventionell ist er in zwei Bögen zu je 90 Grad unterteilt. Nord ist positiv und Süd negativ. Der Breitengrad ist der Kreis, der volle 360 Grad um die Erde verläuft. Konventionell liegt das zwischen -180 (West) und 180 (Ost) Grad. Der Äquator ist der Punkt, an dem der Breitengrad 0 ist. Beachten Sie, dass Sie Google Maps nutzen und auf einen Ort auf einer Karte zeigen können, mit der Maus mit der rechten Maus auswählen und Was hier ist , und es gibt Länge und Breite an. Aber es verkehrt umgekehrt von der Konvention, indem man zuerst die Breite und dann die Länge angibt. Beachten Sie auch, dass Matrosen zwar Grad (°), Minuten (") und Sekunden (') verwenden, basierend auf der Zahl 360, während GeoJSON das Dezimalsystem der Basis-10 verwendet, was bei der Rechenführung offensichtlich leichter zu handhaben ist. Mit GeoJSON kann man auch eine Fläche statt eines Punktes darstellen, indem man beliebig viele Liniensegmente darum herum zeichnet, was Polygon genannt wird, obwohl das nicht bedeutet, dass es fünf Seiten haben muss, wie es bei einem Polygon in Universitätsgeometriekursen der Fall ist. Jedes Koordinatenpaar in einem GeoJSON-Polygon ist ein Liniensegment. So:
location: {
type: "Polygon",
coordinates:
[ [ -73.564453125, 41.178653972331674 ],
[ -71.69128417968749, 41.178653972331674 ],
[ -71.69128417968749, 42.114523952464246 ],
[ -73.564453125, 42.114523952464246 ],
[ -73.564453125, 41.178653972331674 ]
]]
}
MongoDB eignet sich hervorragend zur Speicherung von Geolokalisierungsdaten, da es Punkte, Polygone und andere Geolocation-Objekte sowie integrierte Abfragemethoden bereitstellt, um Daten basierend auf ihrer Nähe zu einem Punkt auf einer Karte, innerhalb einer bestimmten Entfernung zu diesem Punkt oder innerhalb von Linien um diesen Ort abzufragen. Das veranschaulichen wir mit Daten, die von der Stadt Fairfield und anderen Städten in Connecticut bereitgestellt und von OpenAddresses zusammengestellt wurden. (Die vollständige Lizenz ist hier zu finden.) Laden Sie die Daten hier herunter. Dann entpacken Sie sie:
tar xvfz ct.json.tar
Dann laden Sie es in eine MongoDB-Instanz wie diese, wobei Geo die Datenbank und die Adresse die Sammlung ist:
mongoimport --db geo --collection address --file ct.csv.json
Nun können wir dieses clevere Werkzeug verwenden, um eine Karte um einen bestimmten Ort zu zeichnen, und es erzeugt ein Polygon im GeoJSON-Format. Beachten Sie in der untenstehenden Grafik, dass Connecticut, da es ungefähr ein Rechteck ist, ein Rechteck von ausreichender Größe zeichnen können, um den Ort Connecticut grob zu definieren.
Geben Sie mongo ein, um die MongoDB-Shell zu öffnen, und zeigen Sie dann einen Datensatz wie unten gezeigt und nicht die Koordinaten als Typpunkt an:
db.address.findOne()
{
"_id" : ObjectId("5c55b6b46c6e2fc66db81675"),
"state" : "CT",
"postcode" : "06037",
"street" : "Parish Dr",
"district" : "",
"unit" : "",
"location" : {
"type" : "Point",
"coordinates" : [
-72.7738706,
41.6332836
]
},
"region" : "Hartford",
"number" : "51",
"city" : "Berlin"
}
Jetzt erstellen wir einen Index. Wir verwenden den Parameter 2dsphere , was bedeutet, dass wir Punkte auf einer Kugel verwenden wollen und nicht eine euklidische, also flache, Ebene. So berücksichtigt MongoDB bei der Arbeit mit Entfernungen die Krümmung der Erde:
db.address.createIndex( { "location": "2dsphere"} )
Finden wir nun Adressen, die sich innerhalb von 4 Metern von den unten gezeigten Koordinaten befinden , mit dem $near-Operator:
db.address.find ({
location: {
$near: {
$geometry: {
type: "Point" ,
coordinates: [ -72.7738706,41.6332836 ]
},
$maxDistance: 4,
$minDistance: 0
}
}
})
Jetzt suchen wir alle Adressen innerhalb des Quadrats, das Connecticut definiert, das wir oben mit $geoWithin gezeichnet haben. Beachte, dass du eine zusätzliche Klammergruppe [] um die Koordinatenpaare setzen musst, sonst beschwert sich MongoDB, dass das kein Array ist. Beachte, dass das erste und das letzte Liniensegment konventionell sind. Deshalb braucht man 5 Zeilen, um zu definieren, und nicht 4, wie man denken würde.
db.address.find ({location:
{$geoWithin:
{$geometry: {
type: "Polygon",
coordinates:
[[ [ -73.564453125, 41.178653972331674 ],
[ -71.69128417968749, 41.178653972331674 ],
[ -71.69128417968749, 42.114523952464246 ],
[ -73.564453125, 42.114523952464246 ],
[ -73.564453125, 41.178653972331674 ]
]]
}}}});
Und da Mongo JavaScript versteht, können wir Connecticut so definieren:
var connecticut = db.address.find ({location:
{$geoWithin:
{$geometry: {
type: "Polygon",
coordinates:
[[ [ -73.564453125, 41.178653972331674 ],
[ -71.69128417968749, 41.178653972331674 ],
[ -71.69128417968749, 42.114523952464246 ],
[ -73.564453125, 42.114523952464246 ],
[ -73.564453125, 41.178653972331674 ]
]]
}}}});
Es gibt also 918.356 Adressen dort:
connecticut.count()
918356
MongoDB-Leitfaden
- MongoDB-Überblick: Einstieg mit MongoDB
- Wie man MongoDB auf Ubuntu und Mac installiert
- Erstellung einer Datenbank in MongoDB
- MongoDB Shell Grundbefehle
- MongoDB Compass: Nutzung der Mongo GUI
- MongoDB rollenbasierte Zugriffskontrolle (RBAC) erklärt
- MongoDB-Projektion und Projektionsoperatoren erklärt
- MongoDB-Aggregatfunktionen erklärt
- MongoDB-Sortierung: sort()-Methode & Beispiele
- Verwendung von Push-and-Pull-Operatoren in MongoDB
- Wie man MongoDB $unwind
- 23 Gängige MongoDB-Abfrageoperatoren und deren Verwendung
- MongoDB GeoLocation-Abfragebeispiele
- Einführung in MongoDB-Transaktionen
- MongoDB-Indizes: Top-Indextypen und deren Verwaltung
- Die wichtigsten MongoDB-Befehle, die du kennen solltest
- MongoDB-Replikation: Eine vollständige Einführung
- Wie man einen MongoDB-Cluster einrichtet
- MongoDB Sharding: Konzepte, Beispiele & Tutorials
- MongoDB Atlas: Einrichtung und Nutzung von verwaltetem MongoDB
- Wie man MongoDB als Docker-Container ausführt
- MongoDB-Speichernutzung, Verwaltung und Anforderungen
- Wie man Mongodump für MongoDB-Backups verwendet
- Mongorestore-Beispiele zur Wiederherstellung von MongoDB-Backups
- Wie man PyMongo benutzt
- Wie man Mongoose für MongoDB und NodeJS verwendet
- MongoDB Spickzettel
- MongoDB vs Cassandra: NoSQL-Datenbanken im Vergleich
- PostgreSQL vs MongoDB: Vergleich von Datenbanken
- MySQL vs. MongoDB: Vergleich von Datenbanken
- MongoDB-Zertifizierungen: Eine Einführung
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.