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.
fuente
Respuestas:
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.
fuente
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.
fuente