MongoDB

MongoDB ist die führende Open-Source, Document Datenbank die für einfache Entwicklung und Skalierung aber auch für Big Data Szenarien entwickelt wurde.

Geospatial Indexe und Geolocation Abfragen

Marc-David Militz
Experte
Das geospatiale Indexieren in MongoDB ermöglicht es, Abfragen auf eine Collection zu machen, die geospatiale Formen und Punkte enthält. Zwei Datenformate werden derzeit unterstützt:
  • sog. "Legacy Koordinaten"-Paare (z.B. [49.4883355, 11.125711]) mit denen Punkte auf einem flachen Koordinatensystem beschrieben werden.
  • "GeoJSON", ein JSON-basiertes Format mit dem Punkte oder Formen auf einem kugelförmigen Koordinaten-system beschrieben werden.


    • Abhängig vom Datenformat sind zwei Indexe möglich:
      • Für "Legacy Koordinaten"-Paare gibt es einen 2d-geospatial-Index.
      • Für "GeoJSON"-Daten gibt es einen 2dsphere-geospatial-Index.


        • Das erstellen der Index funktioniert sehr einfach. Hier am Beispiel auf der MongoDB Konsole
          use geospatial
          db.restaurants.createIndex({location:"2dsphere"})
          db.neighborhoods.createIndex({geometry:"2dsphere"})

          db.restaurants.findOne()
          db.neighborhoods.findOne()


          Für die einzelnen Indexe gibt es unterschiedliche Abfragen, die möglich sind. Diese Abfragen können nur auf Geodaten angewendet werden, die auch mit einem geospatial Index versehen sind.
          • $near (GeoJSON Punkt, 2dsphere index)
          • $near (Legacy Koordinaten, 2d index)
          • $nearSphere (GeoJSON Punkt, 2dsphere index)
          • $nearSphere (Legacy Koordinaten, 2d index)
          • $geoWithin : { $geometry: ... }
          • $geoWithin : { $polygon: ... }
          • $geoWithin : { $center: ... }
          • $geoWithin : { $centerSphere: ... }
          • $geoIntersects


            • MongoDB bietet zu diesem Thema Beispieldaten, sowie Abfragebeispiele für eine Restaurantsuche.
              https://docs.mongodb.com/manual/tutorial/geospatial-tutorial

              In den Beispieldaten sind New Yorker Stadtteile in Form von Geodaten definert.
              Hier kann man nun z.B. Abfragen ob eine Punkt (Geokoordinaten) innerhalb eines bestimmten Stadtteils liegt.
              Eine Abfrage mit "geoIntersect" sieht so aus:
              db.neighborhoods.findOne(
              { geometry:
              { $geoIntersects:
              { $geometry:
              { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }
              }
              }
              })


              Was beim Thema Geokoordinaten auch immer ein spannender Anwendungsfall ist, sind Umkreissuchen.
              In folgendem Beispiel wird "centerSphere" genutzt um alle Restaurants in einem bestimmten Radius zu finden.
              db.restaurants.find(
              { location:
              { $geoWithin:
              { $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 3963.2 ] }
              }
              })


              Die Berechnung von "5 / 3963.2" ermittelt den sog. "Radius im Bogenmaß". Die Zahl 5 ist hier der Abstand in Meilen, in dem gesucht werden soll.
              Die Zahl 3963.2 ist der Radius der Erde in Meilen. Der Radius im Bogenmaß berücksichtigt auch die Erdkrümmung.

              Im letzten Beispiel suchen wir wieder Restaurants, diesmal sortieren wir das Ergebnis aber nach Entfernung. Damit sollte uns das am näcxhsten löigende Retaurant als erstes angezeigt werden.
              var METERS_PER_MILE = 1609.34
              db.restaurants.find(
              { location:
              { $nearSphere:
              { $geometry:
              { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }, $maxDistance: 5 * METERS_PER_MILE
              }
              }
              })

              Der "Point" bestimmt unseren Standort, die Funktion "maxDistance" errechnet welche Restaurants sich innerhalb des gewünschten Radius befinden.

              Wem das nicht genug ist, für den bietet Qualiero ein entsprechendes Classroom Training für MongoDB Entwickler an
              https://www.qualiero.com/lerninhalte/classroom-trainings/mongodb-datenbank-entwickler-kurs.html

Neueste Mitgliederaktivitäten

Diesen Community Beitrag weiterempfehlen