Interrogation de données géospatiales avec Amazon DocumentDB - Amazon DocumentDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interrogation de données géospatiales avec Amazon DocumentDB

Cette section explique comment interroger des données géospatiales avec Amazon DocumentDB. Après avoir lu cette section, vous serez en mesure de savoir comment stocker, interroger et indexer des données géospatiales dans Amazon DocumentDB.

Présentation

Les cas d'utilisation courants de la géospatiale impliquent l'analyse de proximité à partir de vos données. Par exemple, « trouver tous les aéroports situés dans un rayon de 80 miles de Seattle » ou « trouver les restaurants les plus proches d'un endroit donné ». Amazon DocumentDB utilise la spécification GeoJSON pour représenter les données géospatiales. GeoJSON est une spécification open source pour le formatage JSON des formes dans un espace de coordonnées. Les coordonnées GeoJSON capturent à la fois la longitude et la latitude, représentant les positions sur une sphère semblable à la Terre.

Indexation et stockage de données géospatiales

Amazon DocumentDB utilise le type GeoJSON « Point » pour stocker les données géospatiales. Chaque document (ou sous-document) GeoJSON est généralement composé de deux champs :

  • type : la forme représentée, qui indique à Amazon DocumentDB comment interpréter le champ « coordonnées ». Pour le moment, Amazon DocumentDB ne prend en charge que les points

  • coordonnées — une paire de latitude et de longitude représentée sous la forme d'un objet dans un tableau — [longitude, latitude]

Amazon DocumentDB utilise également des index 2dsphere pour indexer les données géospatiales. Amazon DocumentDB prend en charge les points d'indexation. Amazon DocumentDB prend en charge les requêtes de proximité avec l'indexation 2dsphere.

Imaginons un scénario dans lequel vous créez une application pour un service de livraison de nourriture. Vous souhaitez stocker la paire de latitudes et de longitude de différents restaurants dans Amazon DocumentDB. Pour ce faire, nous vous recommandons de créer d'abord un index dans le champ Géospatial contenant la paire de latitude et de longitude.

use restaurantsdb db.usarestaurants.createIndex({location:"2dsphere"})

Le résultat de cette commande ressemblerait à ceci :

{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }

Une fois que vous avez créé un index, vous pouvez commencer à insérer des données dans votre collection Amazon DocumentDB.

db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Thai Palace", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3264, 47.6009 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Noodle House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3517, 47.6159 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Curry House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -121.4517, 47.6229 ] } });

Interrogation de données géospatiales

Amazon DocumentDB prend en charge les requêtes de proximité, d'inclusion et d'intersection de données géospatiales. Un bon exemple de requête de proximité consiste à rechercher tous les points (tous les aéroports) situés à moins d'une certaine distance et à plus d'une distance d'un autre point (ville). Un bon exemple de requête d'inclusion consiste à rechercher tous les points (tous les aéroports) situés dans une zone/un polygone spécifique (État de New York). Un bon exemple de requête d'intersection consiste à trouver un polygone (état) qui croise un point (ville). Vous pouvez utiliser les opérateurs géospatiaux suivants pour obtenir des informations à partir de vos données.

  • $nearSphere- $nearSphere est un opérateur de recherche qui permet de rechercher des points du plus proche au plus éloigné d'un point GeoJSON.

  • $geoNear- $geoNear est un opérateur d'agrégation qui permet de calculer la distance en mètres à partir d'un point GeoJSON.

  • $minDistance- $minDistance est un opérateur de recherche utilisé conjointement avec $nearSphere ou $geoNear pour filtrer les documents situés au moins à la distance minimale spécifiée par rapport au point central.

  • $maxDistance- $maxDistance est un opérateur de recherche utilisé conjointement avec $nearSphere ou $geoNear pour filtrer les documents situés au maximum à la distance maximale spécifiée par rapport au point central.

  • $geoWithin- $geoWithin est un opérateur de recherche qui permet de rechercher des documents contenant des données géospatiales qui existent entièrement dans une forme spécifiée, telle qu'un polygone.

  • $geoIntersects- $geoIntersects est un opérateur de recherche qui permet de rechercher des documents dont les données géospatiales croisent un objet GeoJSON spécifié.

Note

$geoNearet $nearSphere exigez un index 2dsphere sur le champ GeoJSON que vous utilisez dans votre requête de proximité.

Exemple 1

Dans cet exemple, vous allez apprendre comment rechercher tous les restaurants (points) triés par distance la plus proche d'une adresse (point).

Pour effectuer une telle requête, vous pouvez l'utiliser $geoNear pour calculer la distance d'un ensemble de points par rapport à un autre point. Vous pouvez également ajouter le distanceMultiplier pour mesurer la distance en kilomètres.

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001 } } ])

La commande ci-dessus renverrait les restaurants triés par distance (du plus proche au plus éloigné) du point spécifié. La sortie de cette commande ressemblerait à ceci

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 } { "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 } { "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }

Pour limiter le nombre de résultats d'une requête, utilisez l'numoption limit ou.

limit:

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "limit": 10 } } ])

num:

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "num": 10 } } ])
Note

$geoNearstage prend en charge les num options limit et pour spécifier le nombre maximum de documents à renvoyer. $geoNearrenvoie un maximum de 100 documents par défaut si les num options limit ou ne sont pas spécifiées. Cette valeur est remplacée par la valeur de l'$limitétape si elle est présente et la valeur est inférieure à 100.

Exemple 2

Dans cet exemple, vous allez apprendre comment trouver tous les restaurants (points) situés dans un rayon de 2 kilomètres d'une adresse spécifique (point). Pour effectuer une telle requête, vous pouvez utiliser un minimum $nearSphere $minDistance et un maximum $maxDistance à partir d'un point GeoJSON

db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })

La commande ci-dessus renverrait les restaurants à une distance maximale de 2 kilomètres du point spécifié. La sortie de cette commande ressemblerait à ceci

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }

Limites

Amazon DocumentDB ne prend pas en charge l'interrogation ou l'indexation des polygones,,,, LineString et. MultiPoint MultiPolygon MultiLineString GeometryCollection