Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menanyakan data geospasial dengan Amazon DocumentDB
Bagian ini mencakup bagaimana Anda dapat menanyakan data Geospasial dengan Amazon DocumentDB. Setelah Anda membaca bagian ini, Anda akan dapat menjawab bagaimana menyimpan, menanyakan, dan mengindeks data Geospasial di Amazon DocumentDB.
Gambaran Umum
Kasus penggunaan umum untuk Geospasial melibatkan analisis kedekatan dari data Anda. Misalnya, “menemukan semua bandara dalam jarak 50 mil dari Seattle”, atau “temukan restoran terdekat dari lokasi tertentu”. Amazon DocumentDB menggunakan spesifikasi GeoJSON untuk mewakili data geospasial
Mengindeks dan menyimpan data geospasial
Amazon DocumentDB menggunakan tipe GeoJSON 'Point' untuk menyimpan data geospasial. Setiap dokumen GeoJSON (atau subdokumen) umumnya terdiri dari dua bidang:
-
type - bentuk yang diwakili, yang menginformasikan Amazon DocumentDB bagaimana menafsirkan bidang “koordinat”. Saat ini, Amazon DocumentDB hanya mendukung poin
-
koordinat — pasangan lintang dan bujur direpresentasikan sebagai objek dalam array — [bujur, lintang]
Amazon DocumentDB juga menggunakan indeks 2dsphere untuk mengindeks data Geospasial. Amazon DocumentDB mendukung poin pengindeksan. Amazon DocumentDB mendukung query proximity dengan pengindeksan 2dsphere.
Mari pertimbangkan skenario di mana Anda sedang membangun aplikasi untuk layanan pengiriman makanan. Anda ingin menyimpan berbagai lintang dan pasangan bujur restoran di Amazon DocumentDB. Untuk melakukannya, pertama-tama kami sarankan Anda membuat indeks pada bidang Geospasial yang memegang pasangan lintang dan bujur.
use restaurantsdb db.usarestaurants.createIndex({location:"2dsphere"})
Output dari perintah ini akan terlihat seperti ini:
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Setelah Anda membuat indeks, Anda dapat mulai memasukkan data ke dalam koleksi Amazon DocumentDB Anda.
db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Thai Palace", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3264, 47.6009 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Noodle House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3517, 47.6159 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Curry House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -121.4517, 47.6229 ] } });
Meminta data geospasial
Amazon DocumentDB mendukung kueri kedekatan, inklusi, dan persimpangan data Geospasial. Contoh yang baik dari kueri kedekatan adalah menemukan semua titik (semua bandara) yang kurang dari jarak tertentu dan lebih dari jarak dari titik lain (kota). Contoh yang baik dari kueri inklusi adalah menemukan semua titik (semua bandara) yang terletak di area/poligon tertentu (negara bagian New York). Contoh yang baik dari kueri persimpangan adalah menemukan poligon (status) yang berpotongan dengan titik (kota). Anda dapat menggunakan operator Geospasial berikut untuk mendapatkan wawasan dari data Anda.
-
$nearSphere
-$nearSphere
adalah operator find yang mendukung pencarian titik dari terdekat ke terjauh dari titik GeoJSON. -
$geoNear
-$geoNear
adalah operator agregasi yang mendukung penghitungan jarak dalam meter dari titik GeoJSON. -
$minDistance
-$minDistance
adalah operator find yang digunakan bersama dengan$nearSphere
atau$geoNear
untuk memfilter dokumen yang setidaknya pada jarak minimum yang ditentukan dari titik pusat. -
$maxDistance
-$maxDistance
adalah operator find yang digunakan bersama dengan$nearSphere
atau$geoNear
untuk memfilter dokumen yang paling banyak pada jarak maksimum yang ditentukan dari titik pusat. -
$geoWithin
-$geoWithin
adalah operator find yang mendukung pencarian dokumen dengan data geospasial yang ada seluruhnya dalam bentuk tertentu seperti poligon. -
$geoIntersects
-$geoIntersects
adalah operator find yang mendukung pencarian dokumen yang data geospasialnya berpotongan dengan objek GeoJSON tertentu.
catatan
$geoNear
dan $nearSphere
memerlukan indeks 2dsphere pada bidang GeoJSON yang Anda gunakan dalam kueri kedekatan Anda.
Contoh 1
Dalam contoh ini, Anda akan belajar bagaimana menemukan semua restoran (titik) yang diurutkan berdasarkan jarak terdekat dari alamat (titik).
Untuk melakukan kueri seperti itu, Anda dapat menggunakan $geoNear
untuk menghitung jarak set titik dari titik lain. Anda juga dapat menambahkan distanceMultiplier
untuk mengukur jarak dalam kilometer.
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001 } } ])
Perintah di atas akan mengembalikan restoran yang diurutkan berdasarkan jarak (paling dekat dengan terjauh) dari titik yang ditentukan. Output dari perintah ini akan terlihat seperti ini
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 } { "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 } { "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }
Untuk membatasi jumlah hasil dalam kueri, gunakan num
opsi limit
or.
limit
:
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "limit": 10 } } ])
num
:
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "num": 10 } } ])
catatan
$geoNear
tahap mendukung limit
dan num
pilihan untuk menentukan jumlah maksimum dokumen untuk kembali. $geoNear
mengembalikan maksimal 100 dokumen secara default jika num
opsi limit
atau tidak ditentukan. Ini diganti dengan nilai $limit
tahap jika ada dan nilainya kurang dari 100.
Contoh 2
Dalam contoh ini, Anda akan belajar cara menemukan semua restoran (poin) dalam jarak 2 kilometer dari alamat (titik) tertentu. Untuk melakukan kueri seperti itu, Anda dapat menggunakan $nearSphere
dalam minimum $minDistance
dan maksimum $maxDistance
dari GeoJSON Point
db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })
Perintah di atas akan mengembalikan restoran pada jarak maksimum 2 kilometer dari titik yang ditentukan. Output dari perintah ini akan terlihat seperti ini
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }
Batasan
Amazon DocumentDB tidak mendukung kueri atau pengindeksan LineString Poligon,,,,, dan. MultiPoint MultiPolygon MultiLineString GeometryCollection