

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
<a name="geospatial"></a>

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. 

**Topics**
+ [Présentation de](#overview)
+ [Indexation et stockage de données géospatiales](#indexing)
+ [Interrogation de données géospatiales](#querying_geospatial)
+ [Limitations](#limitations)

## Présentation de
<a name="overview"></a>

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](https://datatracker.ietf.org/doc/html/rfc7946). 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
<a name="indexing"></a>

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
<a name="querying_geospatial"></a>

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 un État spécifique area/polygon (É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**  
`$geoNear`et `$nearSphere` exigez un index 2dsphere sur le champ GeoJSON que vous utilisez dans votre requête de proximité.

### Exemple 1
<a name="w2aac47c23c11b9"></a>

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'`num`option `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**  
`$geoNear`stage prend en charge les `num` options `limit` et pour spécifier le nombre maximum de documents à renvoyer. `$geoNear`renvoie 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
<a name="w2aac47c23c11c11"></a>

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" }
```

## Limitations
<a name="limitations"></a>

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