Jest to możliwe przy użyciu $geoIntersects
MongoDB Geoprzestrzenny operator zapytań.
Tak więc, jeśli masz kolekcję wielokątów GeoJson i chcesz znaleźć wszystkie wielokąty, które przecinają się z danym punktem, musisz uruchomić następujące polecenie:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
W powyższym poleceniu loc
jest tym atrybutem każdego dokumentu, który zawiera współrzędne wielokąta GeoJson. Upewnij się również, że masz 2dsphere
indeksuj nad <locationFieldOfYourDocuments>
.
Teraz, aby rozwiązać twój pierwotny problem, użyję trochę javascriptu. Mogą istnieć lepsze rozwiązania, ale nie według mojej wiedzy.
Załóżmy, że wszystkie Twoje kręgi są przechowywane w Circles
kolekcja. Zapytałbym o tę kolekcję i pobierał każdy krąg jeden po drugim, a następnie wykonałbym przecięcie z inną kolekcją, która zawierałaby pojedynczy punkt, który byłby tym, o który chcesz zapytać, czy przecina się z kręgami, czy nie. Więc niech punkt będzie przechowywany w SinglePoint
kolekcja.
Skrypt wyglądałby tak...
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
}
Wszystko, co musisz zrobić, to zapisać ten skrypt w pliku (myScript.js) i wykonać połączenie:
mongo DBName pathTomyScript.js
Spowoduje to zapisanie wszystkich okręgów przecinających się z punktem wejściowym w kolekcji Przecięcia. Wszystkie powyższe kolekcje powinny znajdować się w bazie danych DBName.