Raumoperatoren definieren (Gleich, Disjunkt, Berührungen, Innerhalb, Überlappungen, Kreuze, Schnittpunkte, Enthält, Beziehen)?


9

Ok, ich muss zugeben, ich gehe nicht wirklich zu tief in die Semantik der Liste der räumlichen Operatoren ein, ich bin eher ein Benutzer, ich schreibe Software, um die meiste Zeit SQL zu steuern, und denke nicht wirklich nach darüber zu viel.

Ich habe jedoch eine Situation, in der eine räumliche Operation, die ich durchführe, langsam läuft, auf einem Tisch, der über hervorragende Indizes verfügt und noch nie zuvor ein Problem verursacht hat.

Infolgedessen versuche ich herauszufinden, welche der folgenden Optionen meine beste Wahl ist, um die beste Leistung zu erzielen. Manchmal finde ich jedoch, dass meine Suchanfragen nichts zurückgeben, wenn ich weiß, dass sie es sollten, und manchmal Sachen zurückgeben, wenn sie nicht sollten.

Also greife ich zu, um zu fragen, ob mir jemand die tatsächliche Definition geben kann, z. B. Kriterien, die übereinstimmen, vollständig innerhalb der umschließenden Geometrie oder innerhalb des Außenrings usw. usw. jeder der folgenden Operationen:

Equals(Geom1, Geom2):int
Disjoint(Geom1, Geom2):int
Touches(Geom1, Geom2):int
Within(Geom1, Geom2):int
Overlaps(Geom1, Geom2):int
Crosses(Geom1, Geom2):int
Intersects(Geom1, Geom2):int
Contains(Geom1, Geom2):int
Relate(Geom1, Geom2):int

Wenn Sie ein konkretes Beispiel dafür geben können, wann sie auch übereinstimmen und wann nicht, wäre das großartig.

Als Referenz suche ich in einer Linestringtabelle mit einem rechteckigen Polygon, das so gedreht ist, dass es in Fahrtrichtung zeigt (Teil einer Verkehrsmanagement-App).

Als weitere Referenz finden Sie hier ein Beispiel für die SQL, die die App generiert, um eine Suche durchzuführen:

SELECT recordID,AsBinary(geometry) AS geometry,Distance(GeomFromText('POINT(-1.84101 54.85078)',4326), geometry) AS distanceFromGps FROM linegrid WHERE Intersects(GeomFromText('POLYGON ((-1.8413149820810311 54.850782468607292, -1.8409507853094111 54.850952257034713, -1.8408279009723911 54.850864894077496, -1.8411920982612455 54.850695105650068, -1.8413149820810311 54.850782468607292))'), geometry)

Sie können in diesem Beispiel sehen, dass ich Schnittpunkte verwende, um die anderen zu testen, da die genannten Ergebnisse nicht ganz die erwarteten Ergebnisse liefern. Daher stelle ich die Frage.

Bitte beachten Sie, dass ich mich im Moment nicht besonders um die schnelleren / anderen Möglichkeiten kümmere, ABER wenn Sie einen besseren Weg finden, können Sie sich gerne anschreien :-)

Im Moment versuche ich hauptsächlich, die Unterschiede zwischen den einzelnen Operationen zu verstehen.

Um es schneller / besser zu machen, beabsichtige ich, zu einem späteren Zeitpunkt eine andere Frage zu stellen.

Für weitere Informationen ist die Spatial-Engine, gegen die dies arbeitet, Spatilite 2.3.0, und ich kann sie nicht aktualisieren, da auf den Geräten, auf denen sie ausgeführt wird, keine aktuellere Version (Windows CE) vorhanden ist.


Ich werde hier die Antwort von mintix wählen, da dies ein super leicht verständliches Raster und eine Beschreibung aller verschiedenen Operationen lieferte, die meine Frage beantworteten.

Ich bin immer noch mit der Verbesserung der Leistung bei den Routinen konfrontiert, aber ich habe jetzt ein paar Strategien, um diese auszuprobieren. Ich kann hier noch Rat von der Gruppe einholen.

@Vince verdient auch etwas Anerkennung, da dieses Whitepaper definitiv die endgültige Antwort ist, aber es ist auch ziemlich schwierig zu lesen (ich musste es mehrmals durchlesen), für alle, die das wahre wollen, was ich bei diesen Operationen bin. Das Clementini-Papier ist das Wenn Sie während der Entwicklung von Lösungen eine leicht verständliche Übersicht benötigen, sollte der FME-Link in einem anderen Browser-Tab geöffnet sein.


Mögliche Beschleunigung - testen Sie möglicherweise den Schnittpunkt des Begrenzungsrahmens mit " MbrIntersects ", bevor Sie testen, ob sich die Geometrie schneidet?
user2856

Hey Luke. Ich habe ursprünglich versucht, einen MBR zu verwenden, aber dann festgestellt, dass ich ihn nicht drehen kann. Leider muss ich die Box drehen, um in Richtung eines GPS-Lagers zu zeigen, so dass es ein Polygon sein muss. Vielen Dank für den Vorschlag.
Shawty

Der Vorschlag war, nicht nur einen MBRIntersects-Test zu verwenden. MbrIntersects sollte verwendet werden, um die Anzahl der Geometrien zu reduzieren, anhand derer die Intersects-Funktionstests durchgeführt werden. Das Eingrenzen der Suche auf diese Weise ist eine ziemlich übliche Methode, um Überlagerungen zu beschleunigen.
user2856

Ah ja, jetzt lese ich das noch einmal, ich verstehe, was du meinst.
Shawty

Wenn das Linienraster viele Zeilen enthält und Sie die meisten davon nicht treffen werden, kann ein räumlicher Index hilfreich sein.
BradHards

Antworten:


16

Sie suchen die "Dimensionally Extended 9 Intersection Matrix" oder kurz DE-9IM.

DE-9IM von FME

Dieser FME-Link enthält hervorragende Beispiele für die oben aufgeführten räumlichen Operatoren. Es zerlegt es in eine 3x3-True / False-Matrix mit Beispielen und Beschreibungen der einzelnen Prädikatattribute.


BEEINDRUCKEND!! Der Link ist super nützlich, hatte einen schnellen Scan und wird ihn etwas später genauer lesen.
Shawty

Link ist unterbrochen.
Alphabetasoup

9

Das Nachschlagewerk, das ich für die Erwartungen von Raumoperatoren verwende, ist das Clementini-Papier ("Ein kleiner Satz formaler topologischer Beziehungen, die für die Interaktion zwischen Endbenutzern geeignet sind", Eliseo Clementini, Paolino Di Felice und Peter van Oosterom, 1993). Es beschreibt die Theorie hinter den Operatoren in Bezug auf Innenräume, Außenräume und Dimensionalität, wodurch die Vermutung beseitigt wird, welche Beziehungen von welchen Operatoren zwischen welchen Typen erfasst werden.

Ob alle Implementierungen alle Aspekte der Clementini-Betreiber berücksichtigen, ist leider ein weiteres Problem.


Ja, ich höre dich dort ... die Welt der IT ist voller Standards, die niemand jemals zu ehren scheint, danke für die Informationen, die ich für eine Kopie des Papiers suchen werde.
Shawty
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.