Delen via


Ondersteuning voor georuimtelijke query's

Georuimtelijke gegevens kunnen nu worden opgeslagen en opgevraagd met behulp van Azure DocumentDB. Deze uitbreiding biedt krachtige hulpprogramma's voor het beheren en analyseren van ruimtelijke gegevens, waardoor een breed scala aan toepassingen mogelijk is, zoals realtime locatietracking, routeoptimalisatie en ruimtelijke analyses.

Hier volgt een kort overzicht van de georuimtelijke opdrachten en operators die nu worden ondersteund:

Georuimtelijke queryoperators

$geoIntersects

Selecteert documenten waarbij een opgegeven geometrie met de geometrie van de documenten wordt gekruist. Handig voor het vinden van documenten die een deel van de ruimte delen met een bepaalde geometrie.

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

$geoWithin

Hiermee selecteert u documenten met georuimtelijke gegevens die volledig binnen een opgegeven shape bestaan. Deze operator wordt gebruikt om documenten in een gedefinieerd gebied te vinden.

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

$box

Hiermee definieert u een rechthoekig gebied met twee coördinaatparen (linksonder en rechtsboven). Wordt gebruikt met de $geoWithin operator om documenten in deze rechthoek te vinden. Zoek bijvoorbeeld alle locaties in een rechthoekige regio op een kaart.

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

$center

Definieert een cirkelvormig gebied met behulp van een middelpunt en een straal in radialen. Wordt gebruikt met de $geoWithin operator om documenten in deze cirkel te vinden.

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

$centerSphere

Vergelijkbaar met $center, maar definieert een bolvormig gebied met behulp van een middelpunt en een radius in radialen. Handig voor sferische geometrieberekeningen.

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

$geometry

Hiermee geeft u een GeoJSON-object om een geometrie te definiëren. Wordt gebruikt met georuimtelijke operators om query's uit te voeren op basis van complexe shapes.

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

$maxDistance

Hiermee geeft u de maximale afstand van een punt voor een georuimtelijke query. Wordt gebruikt met $near en $nearSphere operators. U kunt bijvoorbeeld alle locaties binnen 2 km van een bepaald punt vinden.

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

$minDistance

Hiermee geeft u de minimale afstand van een punt voor een georuimtelijke query. Wordt gebruikt met $near en $nearSphere operators.

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

$polygon

Definieert een veelhoek met behulp van een matrix van coördinaatparen. Wordt gebruikt met de $geoWithin operator om documenten in deze veelhoek te vinden.

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

$near

Hiermee vindt u documenten die zich in de buurt van een opgegeven punt bevinden. Retourneert documenten gesorteerd op afstand van het punt. Zoek bijvoorbeeld de dichtstbijzijnde restaurants naar de locatie van een gebruiker.

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

$nearSphere

Vergelijkbaar met $near, maar voert berekeningen uit op een bolvormig oppervlak. Handig voor nauwkeurigere afstandsberekeningen op het aardoppervlak.

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

Georuimtelijke aggregatiefase

$geoNear

Voert een georuimtelijke query uit om documenten te retourneren die zijn gesorteerd op afstand van een opgegeven punt. Kan aanvullende querycriteria bevatten en informatie over de retourafstand.

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

Overwegingen en niet-ondersteunde mogelijkheden

  • Query's uitvoeren met een geojson-veelhoek met één ring waarvan het gebied een enkel halfrond overschrijdt, wordt momenteel niet ondersteund. In dergelijke gevallen retourneert Azure DocumentDB het volgende foutbericht:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Een samengestelde index met behulp van een normale index en georuimtelijke index is niet toegestaan. Voorbeeld:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Veelhoeken met gaten worden momenteel niet ondersteund voor gebruik met $geoWithin query's. Hoewel het invoegen van een veelhoek met gaten niet beperkt is, mislukt het uiteindelijk met het volgende foutbericht:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Het sleutelveld is altijd vereist in de $geoNear aggregatiefase. Als het sleutelveld ontbreekt, treedt de volgende fout op:

    Error: $geoNear requires a 'key' option as a String
    
  • De $geoNear, $nearen $nearSphere fasen hebben geen strikte indexvereisten, dus deze query's mislukken niet als er een index ontbreekt.