MongoDB के $geoIntersects
. का उपयोग करना संभव है भू-स्थानिक क्वेरी ऑपरेटर।
इसलिए, यदि आपके पास जियोसन बहुभुजों का संग्रह है और आप उन सभी बहुभुजों का पता लगाना चाहते हैं जो आपके दिए गए बिंदु से प्रतिच्छेद करते हैं, तो आपको निम्नलिखित को चलाने की आवश्यकता है:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
ऊपर दिए गए कमांड में, loc
प्रत्येक दस्तावेज़ की वह विशेषता है जिसमें GeoJson बहुभुज के निर्देशांक होते हैं। साथ ही, सुनिश्चित करें कि आपके पास 2dsphere
है <locationFieldOfYourDocuments>
. पर अनुक्रमणिका ।
अब, आपकी मूल समस्या को हल करने के लिए मैं थोड़ी सी जावास्क्रिप्ट का उपयोग करूंगा। बेहतर समाधान हो सकते हैं लेकिन मेरी जानकारी में नहीं।
मान लें कि आपकी सभी मंडलियां Circles
. में संगृहीत हैं संग्रह। मैं उस संग्रह को क्वेरी करता हूं और प्रत्येक सर्कल को एक-एक करके लाता हूं और फिर दूसरे संग्रह के साथ एक इंटरसेक्ट करता हूं जिसमें एक बिंदु होता है जिसे आप पूछना चाहते हैं कि यह सर्कल के साथ छेड़छाड़ करता है या नहीं। तो पॉइंट को SinglePoint
में स्टोर होने दें संग्रह।
स्क्रिप्ट इस तरह दिखेगी...
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
}
आपको बस इस स्क्रिप्ट को एक फाइल (myScript.js) में सेव करना है और कॉल करना है:
mongo DBName pathTomyScript.js
यह उन सभी मंडलियों को संग्रहीत करेगा जो आपके इनपुट बिंदु के साथ प्रतिच्छेद संग्रह में प्रतिच्छेद करते हैं। उपरोक्त सभी संग्रह DBName डेटाबेस में होने चाहिए।