Condividi tramite


Supporto per le query geospaziali

I dati geospaziali possono ora essere archiviati ed sottoposti a query usando Azure DocumentDB. Questo miglioramento offre strumenti avanzati per gestire e analizzare i dati spaziali, consentendo un'ampia gamma di applicazioni, ad esempio il rilevamento della posizione in tempo reale, l'ottimizzazione della route e l'analisi spaziale.

Ecco una rapida panoramica dei comandi e degli operatori geospaziali ora supportati:

Operatori di query geospaziali

$geoIntersects

Seleziona i documenti in cui una geometria specificata si interseca con la geometria dei documenti. Utile per trovare documenti che condividono qualsiasi parte dello spazio con una determinata geometria.

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

$geoWithin

Seleziona documenti con dati geospaziali che esistono interamente all'interno di una forma specificata. Questo operatore viene usato per trovare documenti all'interno di un'area definita.

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

$box

Definisce un'area rettangolare usando due coppie di coordinate (angoli inferiore sinistro e superiore destro). Usato con l'operatore $geoWithin per trovare i documenti all'interno di questo rettangolo. Ad esempio, trovare tutte le posizioni all'interno di un'area rettangolare su una mappa.

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

$center

Definisce un'area circolare utilizzando un punto centrale e un raggio in radianti. Usato con l'operatore $geoWithin per trovare documenti all'interno di questo cerchio.

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

$centerSphere

Simile a $center, ma definisce un'area sferica usando un punto centrale e un raggio in radianti. Utile per i calcoli di geometria sferica.

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

$geometry

Specifica un oggetto GeoJSON per definire una geometria. Usato con operatori geospaziali per eseguire query basate su forme complesse.

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

$maxDistance

Specifica la distanza massima da un punto per una query geospaziale. Usato con $near gli operatori e $nearSphere . Ad esempio, trovare tutte le località entro 2 km da un determinato punto.

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

$minDistance

Specifica la distanza minima da un punto per una query geospaziale. Usato con $near gli operatori e $nearSphere .

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

$polygon

Definisce un poligono usando una matrice di coppie di coordinate. Usato con l'operatore $geoWithin per trovare documenti all'interno di questo poligono.

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

$near

Trova i documenti vicini a un punto specificato. Restituisce i documenti ordinati in base alla distanza dal punto. Ad esempio, trovare i ristoranti più vicini alla posizione di un utente.

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

$nearSphere

Simile a $near, ma esegue calcoli su una superficie sferica. Utile per calcoli di distanza più accurati sulla superficie terrestre.

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

Fase di aggregazione geospaziale

$geoNear

Esegue una query geospaziale per restituire i documenti ordinati in base alla distanza da un punto specificato. Può includere criteri di query aggiuntivi e informazioni sulla distanza restituita.

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

Considerazioni e funzionalità non supportate

  • Attualmente, l'esecuzione di query con un poligono GeoJSON a anello singolo la cui area supera un singolo emisfero non è supportata. In questi casi, Azure DocumentDB restituisce il messaggio di errore seguente:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Un indice composito che usa un indice regolare e un indice geospaziale non è consentito. Per esempio:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • I poligoni con fori non sono attualmente supportati per l'uso con $geoWithin query. Anche se l'inserimento di un poligono con fori non è limitato, alla fine ha esito negativo con il messaggio di errore seguente:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Il campo chiave è sempre obbligatorio nella fase di aggregazione $geoNear. Se il campo chiave non è presente, si verifica l'errore seguente:

    Error: $geoNear requires a 'key' option as a String
    
  • Le $geoNearfasi , $neare $nearSphere non hanno requisiti di indice rigorosi, quindi queste query non avranno esito negativo se manca un indice.