Aracılığıyla paylaş


Jeo-uzamsal sorgular için destek

Jeo-uzamsal veriler artık Azure DocumentDB kullanılarak depolanabilir ve sorgulanabilir. Bu geliştirme uzamsal verileri yönetmek ve analiz etmek için güçlü araçlar sağlayarak gerçek zamanlı konum izleme, rota iyileştirme ve uzamsal analiz gibi çok çeşitli uygulamalar sağlar.

Şimdi desteklenen jeo-uzamsal komutlara ve işleçlere hızlı bir genel bakış aşağıda verilmiştir:

Jeo-uzamsal Sorgu İşleçleri

$geoIntersects

Belirtilen geometrinin belgelerin geometrisiyle kesiştiği belgeleri seçer. Belirli bir geometriyle alanın herhangi bir bölümünü paylaşan belgeleri bulmak için kullanışlıdır.

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

$geoWithin

Tamamen belirtilen bir şekilde var olan jeo-uzamsal verilere sahip belgeleri seçer. Bu işleç, tanımlı bir alan içindeki belgeleri bulmak için kullanılır.

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

$box

İki koordinat çifti (sol alt ve sağ üst köşeler) kullanarak dikdörtgen bir alan tanımlar. Bu dikdörtgen içindeki $geoWithin belgeleri bulmak için işleçle birlikte kullanılır. Örneğin, haritada dikdörtgen bir bölge içindeki tüm konumları bulma.

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

$center

Radyan cinsinden bir merkez noktası ve yarıçap kullanarak dairesel bir alan tanımlar. Bu daire içindeki $geoWithin belgeleri bulmak için işleçle birlikte kullanılır.

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

$centerSphere

gibi $center, ancak radyan cinsinden bir merkez noktası ve yarıçap kullanarak küresel bir alan tanımlar. Küresel geometri hesaplamaları için kullanışlıdır.

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

$geometry

Geometri tanımlamak için bir GeoJSON nesnesi belirtir. Karmaşık şekillere dayalı sorgular gerçekleştirmek için jeo-uzamsal işleçlerle birlikte kullanılır.

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

$maxDistance

Jeo-uzamsal sorgu için bir noktadan en yüksek uzaklığı belirtir. ve $nearSphere işleçleriyle kullanılır$near. Örneğin, belirli bir noktadan 2 km içindeki tüm konumları bulma.

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

$minDistance

Jeo-uzamsal sorgu için bir noktadan en düşük uzaklığı belirtir. ve $nearSphere işleçleriyle kullanılır$near.

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

$polygon

Koordinat çiftleri dizisi kullanarak çokgen tanımlar. Bu çokgen içindeki $geoWithin belgeleri bulmak için işleçle birlikte kullanılır.

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

$near

Belirtilen bir noktaya yakın belgeleri bulur. Noktadan uzaklıklara göre sıralanmış belgeleri döndürür. Örneğin, bir kullanıcının konumuna en yakın restoranları bulma.

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

$nearSphere

gibi $near, ancak küresel bir yüzey üzerinde hesaplamalar yapar. Dünya yüzeyinde daha doğru mesafe hesaplamaları için kullanışlıdır.

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

Jeo-uzamsal Toplama Aşaması

$geoNear

Belirtilen noktadan uzaklıklara göre sıralanmış belgeleri döndürmek için jeo-uzamsal sorgu gerçekleştirir. Ek sorgu ölçütleri ve dönüş uzaklığı bilgilerini içerebilir.

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

Dikkat Edilmesi Gerekenler ve Desteklenmeyen Özellikler

  • Şu anda, alanı tek bir yarım küreyi aşan tek halkalı GeoJSON poligonuyla sorgulama desteklenmez. Bu gibi durumlarda Azure DocumentDB aşağıdaki hata iletisini döndürür:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Normal dizin ve jeo-uzamsal dizin kullanan bileşik dizine izin verilmez. Örneğin:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Delikli çokgenler şu anda $geoWithin sorgularla kullanılmak üzere desteklenmemektedir. Delikli çokgen ekleme kısıtlanmasa da, sonunda aşağıdaki hata iletisiyle başarısız olur:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Anahtar alanı her zaman $geoNear toplama aşamasında gereklidir. Anahtar alanı eksikse aşağıdaki hata oluşur:

    Error: $geoNear requires a 'key' option as a String
    
  • , $nearve $nearSphere aşamalarının $geoNearkatı dizin gereksinimleri yoktur, bu nedenle bir dizin eksikse bu sorgular başarısız olmaz.