Definindo operadores espaciais (iguais, disjuntos, toques, dentro, sobreposições, cruzamentos, interseções, contém, relacionar)?


9

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.


Possibilidade de acelerar - talvez teste a interseção da caixa delimitadora com " MbrIntersects " antes de testar se a geometria se cruza?
usar o seguinte comando

Oi Luke. Inicialmente, tentei usar um MBR, mas depois percebi que não podia girá-lo. Infelizmente, eu tenho que girar a caixa para apontar na direção de um rolamento GPS, para que ele tenha que ser um polígono. Obrigado pela sugestão embora.
shawty

a sugestão não era usar apenas um teste MBRIntersects. Era para usar o MbrIntersects para reduzir o número de geometrias com as quais a função Intersects testa. Reduzir a pesquisa dessa maneira é um método bastante padrão para acelerar sobreposições.
usar o seguinte comando

Ah sim, agora reli isso, entendo o que você quer dizer.
shawty

Se houver muitas linhas na grade de linhas e você não atingir a maioria delas, um índice espacial pode ajudar.
217 BradHards

Respostas:


16

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.


UAU!! O link é super útil, fez uma varredura rápida, indo para ler com mais detalhes um pouco mais tarde.
quer

Link quebrado.
alphabetasoup

9

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.


Sim, eu ouvi você lá ... o mundo da TI está cheio de padrões que ninguém parece honrar, obrigado pela informação, vou procurar uma cópia do artigo.
quer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.