Bagikan melalui


Dukungan untuk Pertanyaan Geospasial

Data geospasial sekarang dapat disimpan dan dikueri menggunakan Azure DocumentDB. Peningkatan ini menyediakan alat canggih untuk mengelola dan menganalisis data spasial, memungkinkan berbagai aplikasi seperti pelacakan lokasi real time, pengoptimalan rute, dan analitik spasial.

Berikut adalah gambaran umum singkat tentang perintah dan operator geospasial yang sekarang didukung:

Operator Kueri Geospasial

$geoIntersects

Memilih dokumen tempat geometri tertentu bersinggungan dengan geometri dokumen. Berguna untuk menemukan dokumen yang berbagi bagian ruang apa pun dengan geometri tertentu.

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

$geoWithin

Memilih dokumen dengan data geospasial yang sepenuhnya ada dalam bentuk tertentu. Operator ini digunakan untuk menemukan dokumen dalam area yang ditentukan.

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

$box

Menentukan area persegi panjang menggunakan dua pasangan koordinat (sudut kiri bawah dan kanan atas). Digunakan dengan $geoWithin operator untuk menemukan dokumen dalam persegi panjang ini. Misalnya, menemukan semua lokasi dalam wilayah persegi panjang di peta.

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

$center

Menentukan area melingkar menggunakan titik tengah dan radius dalam radian. Digunakan dengan $geoWithin operator untuk menemukan dokumen dalam lingkaran ini.

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

$centerSphere

Mirip $centerdengan , tetapi mendefinisikan area bulat menggunakan titik tengah dan radius dalam radian. Berguna untuk penghitungan geometri bunyi.

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

$geometry

Menentukan objek GeoJSON untuk menentukan geometri. Digunakan dengan operator geospasial untuk melakukan kueri berdasarkan bentuk kompleks.

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

$maxDistance

Menentukan jarak maksimum dari titik untuk kueri geospasial. Digunakan dengan $near operator dan $nearSphere . Misalnya, menemukan semua lokasi dalam jarak 2 km dari titik tertentu.

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

$minDistance

Menentukan jarak minimum dari titik untuk kueri geospasial. Digunakan dengan $near operator dan $nearSphere .

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

$polygon

Menentukan poligon menggunakan array pasangan koordinat. Digunakan dengan $geoWithin operator untuk menemukan dokumen dalam poligon ini.

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

$near

Menemukan dokumen yang berada di dekat titik tertentu. Mengembalikan dokumen yang diurutkan berdasarkan jarak dari titik. Misalnya, menemukan restoran terdekat ke lokasi pengguna.

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

$nearSphere

Mirip $neardengan , tetapi melakukan perhitungan pada permukaan sferis. Berguna untuk perhitungan jarak yang lebih akurat di permukaan Bumi.

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

Tahap Agregasi Geospasial

$geoNear

Melakukan kueri geospasial untuk mengembalikan dokumen yang diurutkan berdasarkan jarak dari titik tertentu. Bisa menyertakan kriteria kueri tambahan dan informasi jarak kembali.

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

Pertimbangan dan Kemampuan yang Tidak Didukung

  • Saat ini, kueri dengan poligon GeoJSON berdering tunggal yang areanya melebihi satu belahan tidak didukung. Dalam kasus seperti itu, Azure DocumentDB mengembalikan pesan kesalahan berikut:

    Error: Custom CRS for big polygon is not supported yet.
    
  • Indeks komposit yang menggunakan indeks reguler dan indeks geospasial tidak diizinkan. Contohnya:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • Poligon dengan lubang saat ini tidak didukung untuk digunakan dengan kueri $geoWithin. Meskipun memasukkan poligon dengan lubang tidak dibatasi, akhirnya gagal dengan pesan kesalahan berikut:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • Bidang kunci selalu diperlukan dalam tahap agregasi $geoNear. Jika bidang kunci hilang, kesalahan berikut terjadi:

    Error: $geoNear requires a 'key' option as a String
    
  • Tahapan $geoNear, $near, dan $nearSphere tidak memiliki persyaratan indeks yang ketat, sehingga kueri ini tidak akan gagal jika indeks hilang.