Ok, je dois admettre que je ne m'attarde pas vraiment sur la sémantique de la liste des opérateurs spatiaux ci-dessous, je suis plutôt un utilisateur, j'écris des logiciels pour piloter le SQL la plupart du temps et je ne pense pas vraiment à ce sujet trop.
Cependant, j'ai une situation où une opération spatiale que je fais va lentement, sur une table qui a de bons index et n'a jamais causé de problème auparavant.
En conséquence, j'essaie de déterminer lequel des éléments suivants est mon meilleur pari à utiliser, qui me donnera les meilleures performances, cependant, parfois je trouve que mes recherches ne retournent rien quand je sais qu'elles le devraient, et parfois retourner des trucs quand ils ne devraient pas.
J'essaie donc de demander si quelqu'un peut me donner la définition réelle, comme les critères à respecter, entièrement dans la géométrie englobante, ou dans l'anneau extérieur, etc., de chacune des opérations suivantes:
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
Si vous pouvez donner un exemple concret du moment où elles concordent ou non, ce serait formidable.
Pour référence, je cherche sur une table de Linestrings, en utilisant un polygone rectangulaire, tourné pour pointer dans le sens de la marche (Cela fait partie d'une application de gestion du trafic)
Pour plus d'informations, voici un exemple du SQL généré par l'application pour effectuer une recherche:
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)
Vous pouvez voir dans cet exemple que j'utilise des intersections en essayant les autres comme mentionné ne donne pas tout à fait les résultats que j'attends, d'où la raison pour laquelle je pose la question.
Veuillez noter que je ne suis pas particulièrement préoccupé par les méthodes réelles plus rapides / autres pour le moment, MAIS si vous trouvez une meilleure façon, n'hésitez pas à crier :-)
Pour l'instant, tout ce que j'essaie principalement de comprendre, c'est les différences entre chacune des opérations.
Quant à le faire plus rapidement / mieux, j'ai l'intention d'ouvrir une question différente pour cela à une date ultérieure.
Pour plus de référence, le moteur Spatial contre lequel il fonctionne est Spatilite 2.3.0, et je ne peux pas le mettre à niveau car les appareils sur lesquels il fonctionne n'ont pas de version plus à jour pour cela (Windows CE)
Je vais choisir la réponse de mintix'es ici car cela a fourni une grille super facile à comprendre et une description de toutes les différentes opérations, ce qui a répondu à ma question.
Je suis toujours confronté à l'amélioration des performances des routines, mais j'ai maintenant quelques stratégies pour essayer celle-là, je peux toujours demander des conseils au groupe ici à ce sujet.
@Vince mérite également un crédit, car ce livre blanc est certainement la réponse définitive, mais il est également très difficile à lire (j'ai dû le lire plusieurs fois), pour tous ceux qui veulent le vrai, je suis sur ces opérations Le papier Clementini est le chemin à parcourir, si vous avez besoin d'un aperçu facile à comprendre lors du développement de solutions, le lien FME doit être ouvert dans un autre onglet du navigateur.