Partager via


Prise en charge des requêtes géospatiales

Les données géospatiales peuvent désormais être stockées et interrogées à l’aide d’Azure DocumentDB. Cette amélioration fournit des outils puissants pour gérer et analyser des données spatiales, ce qui permet à un large éventail d’applications telles que le suivi de l’emplacement en temps réel, l’optimisation des itinéraires et l’analytique spatiale.

Voici une vue d’ensemble rapide des commandes et opérateurs géospatiaux désormais pris en charge :

Opérateurs de requête géospatiales

$geoIntersects

Sélectionne les documents dans lesquels une géométrie spécifiée se croise avec la géométrie des documents. Utile pour rechercher des documents qui partagent une partie de l’espace avec une géométrie donnée.

   db.collection.find({
       location: {
           $geoIntersects: {
               $geometry: {
                   type: "<GeoJSON object type>",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$geoWithin

Sélectionne des documents avec des données géospatiales qui existent entièrement dans une forme spécifiée. Cet opérateur est utilisé pour rechercher des documents dans une zone définie.

   db.collection.find({
       location: {
           $geoWithin: {
               $geometry: {
                   type: "Polygon",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$box

Définit une zone rectangulaire à l’aide de deux paires de coordonnées (coin inférieur gauche et supérieur droit). Utilisé avec l’opérateur $geoWithin pour rechercher des documents dans ce rectangle. Par exemple, recherchez tous les emplacements dans une région rectangulaire sur une carte.

  db.collection.find({
      location: {
          $geoWithin: {
              $box: [[lowerLeftLong, lowerLeftLat], [upperRightLong, upperRightLat]]
          }
      }
  })

$center

Définit une zone circulaire à l’aide d’un point central et d’un rayon en radians. Utilisé avec l’opérateur $geoWithin pour rechercher des documents dans ce cercle.

  db.collection.find({
      location: {
          $geoWithin: {
              $center: [[longitude, latitude], radius]
          }
      }
  })

$centerSphere

Similaire à , mais définit une zone sphérique à $centerl’aide d’un point central et d’un rayon en radians. Utile pour les calculs de géométrie sphérique.

  db.collection.find({
      location: {
          $geoWithin: {
              $centerSphere: [[longitude, latitude], radius]
          }
      }
  })

$geometry

Spécifie un objet GeoJSON pour définir une géométrie. Utilisé avec des opérateurs géospatiaux pour effectuer des requêtes basées sur des formes complexes.

  db.collection.find({
      location: {
          $geoIntersects: {
              $geometry: {
                  type: "<GeoJSON object type>",
                  coordinates: [longitude, latitude]
              }
          }
      }
  })

$maxDistance

Spécifie la distance maximale d’un point pour une requête géospatiale. Utilisé avec et $nearSphere opérateurs$near. Par exemple, recherchez tous les emplacements situés à moins de 2 km d’un point donné.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $maxDistance: distance
          }
      }
  })

$minDistance

Spécifie la distance minimale d’un point pour une requête géospatiale. Utilisé avec et $nearSphere opérateurs$near.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $minDistance: distance
          }
      }
  })

$polygon

Définit un polygone à l’aide d’un tableau de paires de coordonnées. Utilisé avec l’opérateur $geoWithin pour rechercher des documents dans ce polygone.

  db.collection.find({
      location: {
          $geoWithin: {
              $geometry: {
                  type: "Polygon",
                  coordinates: [[[...], [...], [...], [...]]]
              }
          }
      }
  })

$near

Recherche des documents proches d’un point spécifié. Retourne des documents triés par distance à partir du point. Par exemple, recherchez les restaurants les plus proches à l’emplacement d’un utilisateur.

    db.collection.find({
        location: {
            $near: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

$nearSphere

Similaire à $near, mais effectue des calculs sur une surface sphérique. Utile pour des calculs de distance plus précis sur la surface de la Terre.

    db.collection.find({
        location: {
            $nearSphere: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

Étape d’agrégation géospatiale

$geoNear

Effectue une requête géospatiale pour retourner des documents triés par distance à partir d’un point spécifié. Peut inclure des critères de requête supplémentaires et des informations de distance de retour.

  db.collection.aggregate([
      {
          $geoNear: {
              near: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              distanceField: "distance",
              spherical: true
          }
      }
  ])

Considérations et fonctionnalités non prises en charge

  • Actuellement, l’interrogation avec un polygone GeoJSON à sonnerie unique dont la zone dépasse un seul hémisphère n’est pas prise en charge. Dans ce cas, Azure DocumentDB retourne le message d’erreur suivant :

    Error: Custom CRS for big polygon is not supported yet.
    
  • Un index composite utilisant un index normal et un index géospatial n’est pas autorisé. Par exemple:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Les polygones avec trous ne sont actuellement pas pris en charge pour une utilisation avec des requêtes $geoWithin. Bien que l’insertion d’un polygone avec des trous ne soit pas restreinte, elle échoue finalement avec le message d’erreur suivant :

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Le champ clé est toujours requis dans l’étape d’agrégation $geoNear. Si le champ clé est manquant, l’erreur suivante se produit :

    Error: $geoNear requires a 'key' option as a String
    
  • Les $geoNearétapes et $nearSphere les $nearétapes n’ont pas de conditions d’index strictes. Ces requêtes ne échouent donc pas si un index est manquant.