Cara Melaksanakan Ciri Geospatial MongoDB

Cara Melaksanakan Ciri Geospatial Mongodb



Ciri geospatial MongoDB menyediakan cara yang mudah untuk menyimpan data geografi dalam pangkalan data. Pada asasnya, kami boleh menyimpan data geospatial dalam MongoDB sebagai objek GeoJSON. GeoJSON ialah format percuma dan sumber terbuka yang bergantung pada Notasi Objek JavaScript dengan data geografi yang mudah. Fungsi ini penting untuk apl yang memerlukan perkhidmatan berdasarkan lokasi seperti proses pemetaan, berdasarkan carian lokasi dan lain-lain. Artikel ini merangkumi ciri geospatial dengan contoh pelaksanaan.

Menambah Dokumen ke dalam Koleksi untuk Ciri Geospatial

Untuk menunjukkan kefungsian ciri Geospatial MongoDB, kami memerlukan dokumen untuk koleksi khusus. Kami memasukkan beberapa dokumen ke dalam koleksi 'kawasan' seperti yang ditunjukkan dalam berikut:

db.area.insertMany( [
{
nama: 'Taman Kanak-kanak' ,
lokasi: { jenis: 'Titik' , koordinat: [ - 60.97 , 30.77 ] },
kategori: 'Taman'
},
{
nama: 'Kawasan Pelajar' ,
lokasi: { jenis: 'Titik' , koordinat: [ - 60.9928 , 30.7193 ] },
kategori: 'Taman'
},
{
nama: 'Tanah Bola Sepak' ,
lokasi: { jenis: 'Titik' , koordinat: [ - 60.9375 , 30.8303 ] },
kategori: 'Stadium'
}
] )

Kami mempunyai dokumen yang mengandungi data lokasi seperti koordinat. Selain itu, kami mencipta indeks geospatial di lapangan untuk mengoptimumkan prestasi pertanyaan geospatial.









Contoh 1: Menggunakan Operator Pertanyaan $geoIntersects

Pertama, kami mempunyai pengendali $geoIntersects ciri geospatial yang bersilang dengan objek yang disediakan. Pertimbangkan pelaksanaan pengendali $geoIntersects berikut:



db.area.find({ lokasi: { $geoIntersects: { $geometry: { type: 'Titik' ,

koordinat: [ - 60.97 , 30.77 ] } } } })

Dalam contoh, kami memanggil koleksi 'kawasan' bersama-sama dengan operasi 'cari'. Kepada kaedah find(), kami menghantar set medan 'lokasi' kepada pengendali pertanyaan $geoIntersects bagi ciri geospatial. Ini digunakan untuk menyemak sama ada titik yang ditentukan bersilang dengan geometri yang disimpan dalam medan geometri.





Kemudian, pengendali $geoIntesects mengambil operator $geometry di mana medan jenis ditetapkan dengan nilai 'Titik' dan medan koordinat diberikan dengan nilai 'koordinat'. Di sini, $geometri ditakrifkan untuk perbandingan geospatial.

Output berikut ialah tempat dokumen yang dijangkakan diambil dan medan geometri mengandungi objek geometri yang bersilang dengan titik yang ditentukan:



Contoh 2: Menggunakan $near Query Operator

Operator $near juga merupakan ciri geospatial yang digunakan untuk melakukan pertanyaan geospatial untuk mengenal pasti dokumen yang secara geografi berdekatan dengan tempat tertentu. Ia mendapatkan semula dokumen yang disusun mengikut kedekatannya dengan lokasi yang ditentukan. Di sini, kami menyediakan pelaksanaan pengendali $near:

db.area.find(
{
lokasi:
{ $dekat :
{
$geometri: { jenis: 'Titik' ,  koordinat: [ - 60.9667 , 30.78 ] },
$minDistance: 1000 ,
$maxDistance: 5000
}
}
}
)

Dalam contoh, kami mentakrifkan medan 'lokasi' koleksi 'kawasan' dalam operasi 'cari'. Kemudian, kami menetapkan pengendali pertanyaan $near bagi ciri geospatial kepada medan 'lokasi' itu. Operator $near mencari titik dekat dengan titik koordinat yang diberikan. Seterusnya, kami menggunakan parameter $minDistance dan $maxDistance dalam operator $near yang disediakan dengan nilai tertentu untuk mendapatkan semula dokumen dalam julat jarak yang ditentukan dari titik yang diberikan.

Dokumen itu diambil dalam output yang berdekatan dengan lokasi atau tempat menarik yang ditentukan dalam koleksi 'kawasan' geospatial:

Contoh 3: Menggunakan Operator Pertanyaan $nearsphere

Sebagai alternatif, kami mempunyai operator $nearsphere yang serupa dengan operator $near, tetapi $nearSphere mengambil kira bentuk sfera Bumi semasa mengira jarak.

db.area.find(
{
lokasi: {
$nearSphere: {
$geometri: {
jenis: 'Titik' ,
koordinat : [ - 60.9667 , 30.78 ]
},
$minDistance: 1000 ,
$maxDistance: 5000
}
}
}
)

Dalam contoh, kami menggunakan pengendali $nearsphere bagi pertanyaan geospatial. Pengendali $nearspehere di sini mencari dokumen yang titik terdekatnya berdekatan dengan titik yang dinyatakan dalam pertanyaan dan titik ditetapkan kepada tatasusunan medan koordinat.

Selepas itu, kami memperhalusi keputusan dengan mewujudkan parameter $minDistance dan $maxDistance. Parameter $minDistance memastikan bahawa dokumen yang dikembalikan berada sekurang-kurangnya 1000 meter dari titik yang ditentukan, manakala parameter $maxDistance mengehadkan keputusan ke lokasi yang tidak lebih daripada 5000 meter jauhnya.

Dokumen dipaparkan dalam output dengan lokasi dalam meter tertentu dari titik dengan koordinat yang diberikan:

Contoh 4: Menggunakan Operator Pertanyaan $geoWithin

Seterusnya, kami mempunyai operator $geoWithin dalam MongoDB yang digunakan untuk pertanyaan geospatial untuk mencari dokumen yang benar-benar dalam bentuk tertentu seperti bulatan. Mari kita lakukan demonstrasi pertanyaan $geoWithin berikut:

db.area.find({ lokasi:

{ $geoWithin:

{ $centerSphere: [ [ - 60.93414657 , 30.82302903 ], 3 / 3963.2 ] } } })

Dalam contoh, kami menggunakan operator $geoWithin untuk mencari dokumen koleksi 'kawasan' dalam kawasan bulat tertentu pada sfera 2D. Untuk ini, kami menentukan operator $centerSphere di dalam operator $geoWithin yang mengambil dua hujah sebagai titik sentrik, yang berkemungkinan mewakili titik koordinat di sini dan jejari bulatan yang mewakili nilai jarak dalam batu.

Dokumen yang terhasil diambil dalam perkara berikut yang mewakili titik geospatial yang berada dalam bulatan yang ditakrifkan oleh titik pusat yang diberikan dan jejari lebih kurang 3 batu:

Contoh 5: Menggunakan Operator Pertanyaan $geoNear

Selain itu, pengendali $geoNear juga merupakan pengendali geospatial yang digunakan untuk saluran paip pengagregatan. Ia melakukan pertanyaan geospatial dan mengembalikan dokumen yang diisih mengikut kedekatannya ke titik tertentu. Di sini, kami telah memberikan pengendali $geoNear yang dipanggil di dalam saluran paip pengagregatan.

db.area.aggregate([
{
$geoDekat: {
berhampiran: { jenis: 'Titik' , koordinat: [ - 60.99279 , 30.719296 ] },
jarakBidang: 'dist.calculated' ,
maxDistance: 2 ,
pertanyaan: { kategori: 'Taman' },
includeLocs: 'lokasi dist' ,
sfera: benar
}
}
])

Dalam contoh, kami memanggil kaedah agregat MongoDB dan mentakrifkan pengendali $geoNear di dalamnya. Pengendali $geoNear ditetapkan dengan beberapa parameter untuk menentukan tingkah laku pertanyaan. Mula-mula, kami menetapkan parameter 'berhampiran' yang menyediakan nilai 'koordinat' sebagai titik rujukan untuk mencari.

Kemudian, kami menggunakan parameter 'distanceField' untuk menentukan medan yang disediakan sebagai medan hasil. Medan hasil set ini menyimpan jarak antara setiap dokumen dan titik rujukan. Seterusnya, kami mentakrifkan parameter 'maxDistance' dengan nilai '2' yang mewakili jarak maksimum dalam meter.

Selepas itu, kami mempunyai parameter 'pertanyaan' yang menapis dokumen mengikut medan 'kategori' dan hanya mempertimbangkan dokumen yang 'kategori' ialah 'Taman'. Kami kemudian memanggil parameter 'includeLocs' untuk mengandungi maklumat lokasi. Kami akhirnya menentukan parameter 'sfera' dengan nilai 'benar' yang mengira jarak menggunakan sistem koordinat sfera 2D.

Saluran paip pengagregatan mewakili dokumen dalam output yang memaparkan maklumat terhadap parameter dengan sewajarnya. Medan 'dist.calculated' berikut memaparkan jarak setiap dokumen dari titik rujukan:

Kesimpulan

Kami mendapat tahu bahawa keupayaan geospatial MongoDB membantu kami mengendalikan dan menanya maklumat berasaskan lokasi dengan cekap. Kami mempelajari pelaksanaan ciri geospatial menggunakan pelbagai pengendalinya dengan program contoh. Kami mempunyai lebih banyak fungsi dan kaedah yang juga bermanfaat untuk pelbagai aplikasi.