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.