Définir les opérateurs spatiaux (égal, disjoint, toucher, intérieur, chevauchements, croisements, intersections, contient, relier)?

9

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.

shawty
la source
Accélération possible - peut-être tester l'intersection de la boîte englobante avec " MbrIntersects " avant de tester que la géométrie se croise?
user2856
Salut Luke. À l'origine, j'ai essayé d'utiliser un MBR, mais j'ai réalisé que je ne pouvais pas le faire pivoter. Malheureusement, je dois faire pivoter la boîte pour pointer dans la direction d'un relèvement GPS, il doit donc s'agir d'un polygone. Merci pour la suggestion.
shawty
la suggestion n'était pas d'utiliser un test MBRIntersects uniquement. Il s'agissait d'utiliser MbrIntersects pour réduire le nombre de géométries contre lesquelles la fonction Intersects teste. Limiter la recherche de cette façon est une méthode assez standard pour accélérer les superpositions.
user2856
Ah oui, maintenant je relis ça, je comprends ce que tu veux dire.
shawty
S'il y a beaucoup de lignes dans la grille de lignes et que vous n'allez pas en toucher la plupart, un index spatial pourrait vous aider.
BradHards

Réponses:

16

Vous recherchez la "matrice d'intersection à 9 dimensions étendues" ou DE-9IM pour faire court.

DE-9IM par FME

Ce lien FME contient d'excellents exemples des opérateurs spatiaux que vous avez répertoriés ci-dessus. Il le décompose en une matrice 3x3 vrai / faux avec des exemples et des descriptions de chaque attribut de prédicat.

Mintx
la source
SENSATIONNEL!! Le lien est super utile, a eu un scan rapide, va le lire plus en détail un peu plus tard.
shawty
Le lien est rompu.
alphabetasoup
9

Le travail de référence que j'utilise pour les attentes des opérateurs spatiaux est l'article de Clementini ("Un petit ensemble de relations topologiques formelles adaptées à l'interaction avec l'utilisateur final", Eliseo Clementini, Paolino Di Felice et Peter van Oosterom, 1993). Il expose la théorie derrière les opérateurs en ce qui concerne les intérieurs, les extérieurs et la dimensionnalité, ce qui élimine la conjecture de quelles relations sont capturées par quels opérateurs entre quels types.

La question de savoir si toutes les implémentations respectent tous les aspects des opérateurs Clementini est, malheureusement, un autre problème.

Vince
la source
Oui, je vous entends là-bas ... le monde de l'informatique est plein de normes que personne ne semble jamais honorer, merci pour l'info, je vais chercher une copie du document.
shawty