¿Definición de operadores espaciales (iguales, disjuntos, toques, dentro, superposiciones, cruces, intersecciones, contenidos, relación)?

9

Ok, tengo que admitir que realmente no profundizo demasiado en la semántica de la lista de operadores espaciales a continuación, soy más un usuario, escribo software para manejar el SQL la mayor parte del tiempo y realmente no pienso sobre eso demasiado.

Sin embargo, tengo una situación en la que una operación espacial que estoy haciendo es lenta, en una tabla que tiene excelentes índices y nunca antes ha causado un problema.

Como resultado, estoy tratando de averiguar cuál de las siguientes opciones es la mejor opción para usar, que me dará el mejor rendimiento, sin embargo, a veces encuentro que mis búsquedas no devuelven nada cuando sé que deberían hacerlo, y otras veces devolver cosas cuando no deberían.

Así que me estoy acercando, para preguntar si alguien puede darme la definición real, como los criterios para que coincidan, completamente dentro de la geometría envolvente, o dentro del anillo exterior, etc. de cada una de las siguientes operaciones:

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 puede dar un ejemplo concreto de cuándo coincidirán o no, eso sería genial.

Como referencia, estoy buscando en una tabla de cadenas de líneas, usando un polígono rectangular, girado para apuntar en la dirección del viaje (es parte de una aplicación de gestión de tráfico)

Para mayor referencia, aquí hay una muestra del SQL que la aplicación genera para realizar una búsqueda:

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)

Puede ver en este ejemplo que estoy usando intersecciones probando los otros como se mencionó, no da los resultados que esperaba, por lo tanto, estoy haciendo la pregunta.

Tenga en cuenta que no estoy particularmente preocupado por las formas más rápidas / otras de hacer esto en este momento, PERO si encuentra una mejor manera, no dude en gritar :-)

Por ahora, todo lo que intento entender es la diferencia entre cada una de las operaciones.

En cuanto a hacerlo más rápido / mejor, tengo la intención de abrir una pregunta diferente para eso en una fecha posterior.

Para más referencia, el motor espacial con el que está trabajando es Spatilite 2.3.0, y no puedo actualizarlo debido a que los dispositivos en los que se está ejecutando no tienen una compilación más actualizada (Windows CE)


Voy a elegir la respuesta de mintix aquí, ya que proporcionó una cuadrícula súper fácil de entender y una descripción de todas las diversas operaciones, que respondieron a mi pregunta.

Todavía me enfrento a mejorar el rendimiento en las rutinas, pero ahora tengo algunas estrategias para probar, todavía puedo buscar el consejo del grupo con respecto a eso.

@Vince también merece algo de crédito, ya que ese documento técnico es definitivamente la respuesta definitiva, pero también es bastante difícil de leer (tuve que leerlo varias veces), para cualquiera que quiera lo real que estoy en estas operaciones. El documento de Clementini es el Sin embargo, si necesita una descripción general fácil de entender al desarrollar soluciones, el enlace FME debe abrirse en otra pestaña del navegador.

ricura
fuente
Posible aceleración: ¿quizás probar la intersección del cuadro delimitador con " MbrIntersects " antes de probar que la geometría se cruza?
usuario2856
Hola Luke. Originalmente intenté usar un MBR, pero luego me di cuenta de que no puedo rotarlo. Desafortunadamente, tengo que girar la caja para apuntar en la dirección de un rumbo GPS, por lo que tiene que ser un polígono. Gracias por la sugerencia sin embargo.
Shawty
la sugerencia no era usar solo una prueba MBRIntersects. Fue para usar MbrIntersects para reducir el número de geometrías con las que la función Intersects prueba. Limitar la búsqueda de esta manera es un método bastante estándar para acelerar las superposiciones.
user2856
Ah sí, ahora releí eso, entiendo lo que quieres decir.
Shawty
Si hay muchas filas en la cuadrícula de líneas, y no va a golpear la mayoría de ellas, un índice espacial podría ayudar.
BradHards

Respuestas:

16

Está buscando la "Matriz de intersección 9 dimensionalmente extendida" o DE-9IM para abreviar.

DE-9IM por FME

Ese enlace FME tiene excelentes ejemplos de los operadores espaciales que enumeró anteriormente. Lo divide en una matriz 3x3 verdadero / falso con ejemplos y descripciones de cada atributo predicado.

Menta
fuente
¡¡GUAU!! El enlace es muy útil, tenía un escaneo rápido, lo leeré con más detalle un poco más tarde.
Shawty
El enlace está roto.
alphabetasoup
9

El trabajo de referencia que uso para las expectativas de los operadores espaciales es el artículo de Clementini ("Un pequeño conjunto de relaciones topológicas formales adecuadas para la interacción del usuario final", Eliseo Clementini, Paolino Di Felice y Peter van Oosterom, 1993). Establece la teoría detrás de los operadores con respecto a interiores, exteriores y dimensionalidad, lo que elimina la conjetura de qué relaciones son capturadas por qué operadores entre qué tipos.

Lamentablemente, si todas las implementaciones respetan todos los aspectos de los operadores de Clementini es otro problema.

Vince
fuente
Sí, te escucho allí ... el mundo de TI está lleno de estándares que nadie parece respetar, gracias por la información. Iré a buscar una copia del documento.
Shawty