Megosztás:


Térinformatikai lekérdezések támogatása

A térinformatikai adatok mostantól tárolhatók és lekérdezhetők az Azure DocumentDB használatával. Ez a fejlesztés hatékony eszközöket biztosít a térbeli adatok kezeléséhez és elemzéséhez, így számos alkalmazás, például a valós idejű helykövetés, az útvonaloptimalizálás és a térbeli elemzések széles skáláját teszi lehetővé.

Íme egy gyors áttekintés a térinformatikai parancsokról és az operátorokról, amelyek most már támogatottak:

Térinformatikai lekérdezési operátorok

$geoIntersects

Olyan dokumentumokat jelöl ki, ahol egy adott geometria metszi a dokumentumok geometriájával. Olyan dokumentumok megkereséséhez hasznos, amelyek a tér bármely részét egy adott geometriával osztják meg.

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

$geoWithin

Olyan térinformatikai adatokat tartalmazó dokumentumokat jelöl ki, amelyek teljes egészében egy adott alakzaton belül léteznek. Ez az operátor egy meghatározott területen belüli dokumentumok keresésére szolgál.

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

$box

Négyszögletes területet határoz meg két koordináta-pár használatával (bal alsó és jobb felső sarokban). Az operátorral a $geoWithin téglalapon belüli dokumentumok megkereséséhez használható. Egy térképen például egy négyszögletes régióban található összes hely megkeresése.

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

$center

Egy körkörös területet határoz meg egy középpont és egy sugár radián használatával. Az operátorral a $geoWithin körön belüli dokumentumok megkeresésére szolgál.

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

$centerSphere

Hasonló, $centerde egy gömb alakú területet határoz meg középpont és sugár alapján radiánban. Gömbgeometriai számításokhoz hasznos.

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

$geometry

GeoJSON-objektumot ad meg a geometria definiálásához. A térinformatikai operátorokkal összetett alakzatokon alapuló lekérdezések végrehajtására szolgál.

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

$maxDistance

Meghatározza a térinformatikai lekérdezések pontjától való maximális távolságot. Használva és $nearSphere operátorokkal $near együtt. Például az összes hely megkeresése egy adott ponttól 2 km-re.

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

$minDistance

A térinformatikai lekérdezés egy pontjától való minimális távolságot adja meg. Használva és $nearSphere operátorokkal $near együtt.

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

$polygon

Koordinátapárok tömbjének használatával definiál sokszöget. Az operátorral a $geoWithin sokszögben lévő dokumentumok megkeresésére szolgál.

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

$near

Megkeresi a megadott ponthoz közeli dokumentumokat. A ponttól való távolság szerint rendezett dokumentumokat adja vissza. Például keresse meg a legközelebbi éttermeket a felhasználó helyére.

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

$nearSphere

$nearEhhez hasonló, de gömbfelületen végez számításokat. Hasznos a földfelszín pontosabb távolságszámításához.

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

Térinformatikai összesítési szakasz

$geoNear

Térinformatikai lekérdezést hajt végre a dokumentumok megadott ponttól való távolság szerinti rendezéséhez. Tartalmazhat további lekérdezési feltételeket és a távolságra vonatkozó információkat.

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

Szempontok és nem támogatott képességek

  • Jelenleg nem támogatott egy gyűrűs GeoJSON-poligonnal történő lekérdezés, amelynek területe meghaladja az egyetlen félgömböt. Ilyen esetekben az Azure DocumentDB a következő hibaüzenetet adja vissza:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Normál indexet és térinformatikai indexet használó összetett index nem engedélyezett. Például:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • A lyukas sokszögek jelenleg nem támogatottak $geoWithin lekérdezésekhez. Bár a lyukakkal rendelkező sokszög beszúrása nincs korlátozva, végül a következő hibaüzenettel meghiúsul:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • A kulcsmezőre mindig szükség van az $geoNear összesítési szakaszban. Ha a kulcsmező hiányzik, a következő hiba történik:

    Error: $geoNear requires a 'key' option as a String
    
  • A $geoNear, $nearés $nearSphere a fázisok nem rendelkeznek szigorú indexkövetelményekkel, ezért ezek a lekérdezések nem hiúsulnak meg, ha hiányzik egy index.