2017-01-17 2 views
8

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]]}]} 
+0

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? –

Antwort

4

Ist jemand in der Lage, dieses Verhalten zu erklären?

Dies ist, weil die Erde nicht flach ist, aber ziemlich kugelförmig (gekrümmt). Die Erdoberfläche kann nicht in einer Ebene ohne Verzerrung dargestellt werden. Das bedeutet, dass jede Kartenprojektion die Erde in irgendeiner Weise verzerrt. Siehe auch Map Projections

MongoDB 2dsphere index, unterstützt Abfragen, die Geometrien auf einer erdähnlichen Kugel berechnen.

Wenn Sie die Koordinate auf http://geojson.io abbilden, wird die sphärische Natur der Erde nicht berücksichtigt. Der kürzere LineString befindet sich innerhalb des "quadratischen" Polygons.

geojson.io

Wenn Sie die GeoJSON geometrics auf https://geodndmap.mongodb.com Karte, die der Tatsache Rechnung nimmt, dass es eine sphärische Verzerrung ist, sehen Sie hier:

geodndmap.mongodb.com

Je kürzer Linestring ist außerhalb eigentlich von "Quadrat" Polygon. Dies ist, was MongoDB 2dsphere Index/Abfrage durchgeführt wird.

Der Einfluss des Verzerrungseffekts wächst mit den längeren/größeren Flächenprojektionen.

Beispiel:

{"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":[[24.7698287,-28.7353533],[88.0423,-26.19793]]}]} 

geojson.io

geodndmap.mongodb.com

PS: Zur Nutzung geodndmap.mongodb.com, Drag & Drop-GeoJSON auf die Karte entweder als Datei oder als Text aus einem Bearbeitungsprogramm.

Verwandte Themen