Dimungkinkan menggunakan $geoIntersects
MongoDB Operator kueri geospasial.
Jadi, jika Anda memiliki kumpulan poligon GeoJson dan Anda ingin mengetahui semua poligon yang berpotongan dengan titik yang Anda berikan, maka Anda perlu menjalankan perintah berikut:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
Pada perintah di atas, loc
adalah atribut setiap dokumen yang berisi koordinat poligon GeoJson. Juga, pastikan Anda memiliki 2dsphere
indeks di atas <locationFieldOfYourDocuments>
.
Sekarang, untuk menyelesaikan masalah awal Anda, saya akan menggunakan sedikit javascript. Mungkin ada solusi yang lebih baik tetapi tidak sepengetahuan saya.
Katakanlah semua lingkaran Anda disimpan di Circles
koleksi. Saya akan menanyakan koleksi itu dan mengambil setiap lingkaran satu per satu dan kemudian melakukan perpotongan dengan koleksi lain yang akan berisi satu titik yang akan menjadi titik yang ingin Anda tanyakan apakah itu berpotongan dengan lingkaran atau tidak. Jadi biarkan titik disimpan di SinglePoint
koleksi.
Scriptnya akan terlihat seperti...
db.Intersections.remove({}); // emptying the output collection
var circleCursor = db.Circles.find();
while (circleCursor.hasNext()) {
var circle = circleCursor.next();
var coord = circle.location;
var radiusInRadians = circle.radius * conversionFactorForRadius;
var intersect = db.SinglePoint.find({loc :
{ $geoWithin :
{$centerSphere : [coord], radiusInRadians}
}});
if (intersect.hasNext()) {db.Intersections.add(circle)} // this will add all intersecting circles to Intersections collection
}
Yang harus Anda lakukan adalah menyimpan skrip ini dalam file (myScript.js) dan melakukan panggilan:
mongo DBName pathTomyScript.js
Ini akan menyimpan semua lingkaran yang berpotongan dengan titik input Anda di koleksi Intersects. Semua koleksi di atas harus ada di database DBName.