Ich habe eine MongoDB-Datenbank mit einer Sammlung namens fooCollection
. Diese Sammlung enthält Dokumente mit Geodaten in der Art eines Polygons. Ich verwende den C# MongoDB-Treiber in meiner App. Ich bemerkte, dass es keine Dokumente mit bestimmten räumlichen Abfragen fand, obwohl es mit den meisten von ihnen funktioniert. Ich habe die Sammlung geleert, bis auf ein beleidigendes Dokument, und ich habe versucht, es zu finden, indem ich direkt Abfragen durchführte.
Mein Dokument sieht wie folgt aus:
[
1,
{
"polygon" : "2dsphere"
},
"polygon_2dsphere",
"data.fooCollection",
3
]
Die folgende Abfrage korrekt liefert dieses Dokument:
{
"_id" : UUID("12345678-62d9-4024-86dc-123456789012"),
"polygon" : {
"type" : "Polygon",
"coordinates" : [ [
[ 18.414846, -33.9699577 ],
[ 18.414846, -26.0991189 ],
[ 31.0330578, -26.0991189 ],
[ 31.0330578, -33.9699577 ],
[ 18.414846, -33.9699577 ]
] ]
},
"foo": "bar"
}
ich diesen Index auch auf dieser Sammlung haben
db.getCollection('fooCollection').find({
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[24.7698287, -28.7353533],[28.0423, -26.19793]]
}}}})
jedoch Diese Abfrage funktioniert nicht:
db.getCollection('fooCollection').find({
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]]
}}}})
Wenn Sie diese drei Geometrien zeichnen, kann ich nicht wirklich sehen, warum das eine funktioniert, aber nicht das andere.
- Beiden Linien liegen vollständig innerhalb des Polygons
- die Arbeitsleitung ist viel länger
- die Arbeitsleitung ein Lager zwischen 0 ° und 90 ° hat, die andere zwischen 90 ° und 180 °.
Kann jemand dieses Verhalten erklären?
EDIT: Ich habe auch die Punkte einzeln getestet, anstatt die LineStrings zu verwenden. Der einzige Treffer ist [24.7698287, -28.7353533]
. Ich die Linestrings müssen - die Abfrage sollte ein Hit werden, auch wenn nur die Kante schneidet das Polygon und keine Punkte liegen innerhalb
können Sie die GeoJSON sehen here oder Sie können die drei Geometrien selbst durch Einfügen der folgenden Zeile in http://geojson.io/ plotten :
{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},{"type":"LineString","coordinates":[[27.7706902,-26.1091189],[28.0423,-26.19793]]},{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[28.0423,-26.19793]]}]}
Hey Ivan, ich hatte mit '$ geoIntersects 'durch Angabe von Polygonen durchgehend Erfolg, die Mongo Docs scheuen sich auch vor Beispielen mit LineStrings. Wie Sie richtig sehen, sollte die Abfrage funktionieren, so ist es seltsam, dass es nicht ist. Haben Sie andere Geoperatoren ausprobiert, um zu sehen, ob Sie mit ihnen das gleiche Ergebnis erzielen können? Finden Sie schließlich Routen, die vollständig in eine Begrenzungsbox fallen, oder solche, die sich teilweise mit einer Begrenzungsbox "berühren" oder schneiden? –