Dies ist mit $geoIntersects
von MongoDB möglich Operator für Geodatenabfragen.
Wenn Sie also eine Sammlung von GeoJson-Polygonen haben und alle Polygone herausfinden möchten, die sich mit Ihrem angegebenen Punkt schneiden, müssen Sie Folgendes ausführen:
db.places.find( { <locationFieldOfYourDocuments> :
{ $geoIntersects :
{ $geometry :
{ type : "Point" ,
coordinates: [long, lat]
} } } } )
Im obigen Befehl loc
ist das Attribut jedes Dokuments, das die Koordinaten für das GeoJson-Polygon enthält. Stellen Sie außerdem sicher, dass Sie 2dsphere
haben Index über <locationFieldOfYourDocuments>
.
Um Ihr ursprüngliches Problem zu lösen, werde ich jetzt ein wenig Javascript verwenden. Möglicherweise gibt es bessere Lösungen, aber meines Wissens nicht.
Nehmen wir an, alle Ihre Kreise sind in Circles
gespeichert Sammlung. Ich würde diese Sammlung abfragen und jeden Kreis einzeln abrufen und dann eine Überschneidung mit einer anderen Sammlung durchführen, die einen einzelnen Punkt enthalten würde, den Sie abfragen möchten, ob er sich mit den Kreisen schneidet oder nicht. Lassen Sie den Punkt also in SinglePoint
speichern Sammlung.
Das Skript würde wie folgt aussehen...
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
}
Alles, was Sie tun müssen, ist dieses Skript in einer Datei (myScript.js) zu speichern und aufzurufen:
mongo DBName pathTomyScript.js
Dadurch werden alle Kreise, die sich mit Ihrem Eingabepunkt schneiden, in der Schnittmenge-Sammlung gespeichert. Alle oben genannten Sammlungen sollten sich in der DBName-Datenbank befinden.