Sdílet prostřednictvím


Podpora geoprostorových dotazů

Geoprostorová data se teď dají ukládat a dotazovat pomocí Azure DocumentDB. Toto vylepšení poskytuje výkonné nástroje pro správu a analýzu prostorových dat, které umožňují širokou škálu aplikací, jako je sledování polohy v reálném čase, optimalizace tras a prostorová analýza.

Tady je rychlý přehled podporovaných geoprostorových příkazů a operátorů:

Geoprostorové operátory dotazů

$geoIntersects

Vybere dokumenty, ve kterých se zadaná geometrie protíná s geometrií dokumentů. Užitečné při hledání dokumentů, které sdílejí jakoukoli část prostoru s danou geometrií.

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

$geoWithin

Vybere dokumenty s geoprostorovými daty, které jsou zcela v zadaném obrazci. Tento operátor slouží k vyhledání dokumentů v definované oblasti.

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

$box

Definuje obdélníkovou oblast pomocí dvou párů souřadnic (levý dolní a pravý horní roh). Používá se s operátorem $geoWithin k vyhledání dokumentů v tomto obdélníku. Například vyhledání všech umístění v obdélníkové oblasti na mapě.

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

$center

Definuje kruhovou oblast pomocí středového bodu a poloměru v radiánech. Používá se s operátorem $geoWithin k vyhledání dokumentů v tomto kruhu.

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

$centerSphere

$centerPodobá se tomu, ale definuje kulovou oblast pomocí středového bodu a poloměru v radiánech. Užitečné pro výpočty s kulovou geometrií.

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

$geometry

Určuje objekt GeoJSON definující geometrii. Používá se s geoprostorovými operátory k provádění dotazů na základě složitých obrazců.

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

$maxDistance

Určuje maximální vzdálenost od bodu geoprostorového dotazu. Používá se s operátory $near a $nearSphere operátory. Můžete například najít všechna místa v okruhu 2 km od daného bodu.

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

$minDistance

Určuje minimální vzdálenost od bodu geoprostorového dotazu. Používá se s operátory $near a $nearSphere operátory.

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

$polygon

Definuje mnohoúhelník pomocí pole párů souřadnic. Používá se s operátorem $geoWithin k vyhledání dokumentů v rámci tohoto mnohoúhelníku.

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

$near

Vyhledá dokumenty, které jsou blízko zadaného bodu. Vrátí dokumenty seřazené podle vzdálenosti od bodu. Například vyhledání nejbližších restaurací k umístění uživatele.

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

$nearSphere

$nearPodobá se tomu, ale provádí výpočty na kulové ploše. Užitečné pro přesnější výpočty vzdálenosti na povrchu Země.

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

Geoprostorová fáze agregace

$geoNear

Provede geoprostorový dotaz, který vrátí dokumenty seřazené podle vzdálenosti od zadaného bodu. Může obsahovat další kritéria dotazu a informace o návratu vzdálenosti.

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

Důležité informace a nepodporované funkce

  • V současné době se dotazování pomocí polygonu GeoJSON s jedním kruhem, jehož oblast překračuje jednu polokouli, nepodporuje. V takových případech azure DocumentDB vrátí následující chybovou zprávu:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Složený index používající běžný index a geoprostorový index není povolený. Například:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Mnohoúhelníky s otvory se v současné době nepodporují pro použití s dotazy $geoWithin. I když vložení mnohoúhelníku s otvory není omezeno, nakonec selže s následující chybovou zprávou:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Klíčové pole je vždy vyžadováno ve fázi $geoNear agregace. Pokud pole klíče chybí, dojde k následující chybě:

    Error: $geoNear requires a 'key' option as a String
    
  • Fáze $geoNeara $nearSphere , $nearkteré nemají přísné požadavky na index, takže tyto dotazy nebudou neúspěšné, pokud chybí index.