Ok, eu tenho que admitir, eu realmente não me aprofundo muito na semântica da lista de operadores espaciais abaixo, sou mais usuário, escrevo software para conduzir o SQL na maioria das vezes e realmente não penso sobre isso demais.
No entanto, eu tenho uma situação em que uma operação espacial que estou realizando está indo devagar, em uma tabela que possui ótimos índices e que nunca causou um problema até agora.
Como resultado, estou tentando descobrir qual das seguintes opções é a minha melhor aposta para usar, que me dará o melhor desempenho; no entanto, às vezes, acho que minhas pesquisas não retornam nada quando eu sei que devem, e às vezes devolver coisas quando não deveriam.
SO, estou entrando em contato para perguntar se alguém pode me fornecer a definição real, como critérios a serem correspondidos, totalmente dentro da geometria delimitadora ou dentro do anel externo, etc, etc, de cada uma das seguintes operações:
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
Se você puder dar um exemplo concreto de quando eles também não corresponderão, isso seria ótimo.
Para referência, estou pesquisando em uma tabela de cadeias de linhas, usando um polígono retangular, girado para apontar na direção da viagem (faz parte de um aplicativo de gerenciamento de tráfego)
Para referência adicional, veja uma amostra do SQL que o aplicativo gera para realizar uma pesquisa:
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)
Você pode ver neste exemplo que estou usando interseções tentando os outros, conforme mencionado, não fornece os resultados esperados, portanto, por que estou fazendo a pergunta.
Observe que não estou particularmente preocupado com as maneiras mais rápidas e reais de fazer isso no momento, mas se você encontrar uma maneira melhor, sinta-se à vontade para gritar :-)
Por enquanto, tudo o que estou tentando entender são as diferenças entre cada uma das operações.
Quanto a fazê-lo mais rápido / melhor, pretendo abrir uma pergunta diferente para isso em uma data posterior.
Para obter mais referência, o mecanismo espacial com o qual está trabalhando é o Spatilite 2.3.0, e não posso atualizá-lo devido aos dispositivos em que ele está sendo executado por não ter uma compilação mais atualizada (Windows CE)
Vou escolher a resposta mintix aqui, pois isso fornece uma grade e uma descrição super fáceis de entender de todas as várias operações, que responderam à minha pergunta.
Ainda estou enfrentando dificuldades para obter desempenho nas rotinas, mas agora tenho algumas estratégias para testar essa. Ainda posso procurar aqui o conselho do grupo em relação a isso.
O @Vince também merece algum crédito, já que esse white paper é definitivamente a resposta definitiva, mas também é bastante desafiador de ler (eu tive que ler várias vezes), para quem quer o verdadeiro eu nessas operações. O artigo de Clementini é o caminho a percorrer, se você precisar de uma visão geral fácil de entender ao desenvolver soluções, no entanto, o link do FME deve ser aberto em outra guia do navegador.
fonte
Respostas:
Você está procurando o "Dimensionally Extended 9 Intersection Matrix" ou o DE-9IM para abreviar.
DE-9IM by FME
Esse link FME tem ótimos exemplos dos operadores espaciais listados acima. Ele divide-o em uma matriz verdadeira / falsa de 3x3, com exemplos e descrições de cada atributo de predicado.
fonte
O trabalho de referência que utilizo para as expectativas dos operadores espaciais é o artigo de Clementini ("Um pequeno conjunto de relações topológicas formais adequadas para a interação do usuário final", Eliseo Clementini, Paolino Di Felice e Peter van Oosterom, 1993). Ele expõe a teoria por trás dos operadores em relação a interiores, exteriores e dimensionalidades, o que elimina a suposição de quais relacionamentos são capturados por quais operadores entre quais tipos.
Infelizmente, outra questão é se todas as implementações respeitam todos os aspectos dos operadores da Clementini.
fonte