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.
Interroger des 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.
Rubriques
Présentation de
Les cas d'utilisation courants de Geospatial impliquent une analyse de proximité à partir de vos données. Par exemple, « trouver tous les aéroports dans un rayon de 80 miles de Seattle » ou « trouver les restaurants les plus proches d'un lieu donné ». Amazon DocumentDB utilise la spécification GeoJSON
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 les 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é grâce à l'indexation 2dsphere.
Imaginons un scénario dans lequel vous créez une application pour un service de livraison de nourriture. Vous souhaitez stocker les paires de latitude et de longitude des restaurants dans Amazon DocumentDB. Pour ce faire, créez d'abord un index sur 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 par inclusion consiste à rechercher tous les points (tous les aéroports) situés dans un endroit spécifié area/polygon (État de New York). Un bon exemple de requête d'intersection est la recherche d'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-$nearSphereest un opérateur de recherche qui permet de rechercher des points du plus proche au plus éloigné d'un point GeoJSON. -
$geoNear-$geoNearest un opérateur d'agrégation qui permet de calculer la distance en mètres à partir d'un point GeoJSON. -
$minDistance-$minDistanceest un opérateur de recherche utilisé conjointement avec$nearSphereou$geoNearpour filtrer des documents se trouvant au moins à la distance minimale spécifiée par rapport au point central. -
$maxDistance-$maxDistanceest un opérateur de recherche utilisé conjointement avec$nearSphereou$geoNearpour filtrer des documents se trouvant au plus à la distance maximale spécifiée par rapport au point central. -
$geoWithin-$geoWithinest 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-$geoIntersectsest un opérateur de recherche qui permet de rechercher des documents dont les données géospatiales recoupent un objet GeoJSON spécifié.
Note
$geoNearet $nearSphere nécessitent un index 2dsphere dans le champ GeoJSON que vous utilisez dans votre requête de proximité.
Exemple 1
Dans cet exemple, vous allez apprendre comment trouver tous les restaurants (points) triés par distance la plus proche d'une adresse (point).
Pour effectuer une telle requête, vous pouvez 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é) à partir 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 }
Note
Les num options limit et de l'$geoNearétape, ainsi que la limite par défaut de 100 documents, sont obsolètes dans Amazon DocumentDB 8.0 (Patch moteur version 4.0.5748) et versions ultérieures. Les exemples suivants utilisent limit et num s'appliquent uniquement à Amazon DocumentDB 8.0 (correctif moteur version 4.0.4448) et aux versions antérieures.
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 } } ])
Exemple 2
Dans cet exemple, vous allez apprendre à trouver tous les restaurants (points) situés dans un rayon de 2 kilomètres d'une adresse (point) spécifique. Pour effectuer une telle requête, vous pouvez utiliser entre 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 ramènerait 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" }
Limitations
Amazon DocumentDB ne prend pas en charge les requêtes ou l'indexation des polygones,, LineString, MultiPoint et. MultiPolygon MultiLineString GeometryCollection