Estoy buscando una manera eficiente de agrupar líneas independientes de su dirección. Eso significa que una línea entre Nueva York y Los Ángeles debe estar en el mismo grupo que una línea en la otra dirección entre Los Ángeles y Nueva York. Las ubicaciones de los puntos de inicio / finalización deben ser similares (es decir, San Diego a Long Island deben estar en el mismo grupo que LA-NY pero probablemente no desde San Francisco a Boston) y no hay puntos intermedios. Los datos de entrada serían similares a este ejemplo:
(Por Cassiopeia sweet en Wikipedia japonesa GFDL o CC-BY-SA-3.0 , a través de Wikimedia Commons)
Anteriormente he tratado de ordenar las líneas por adelantado, por ejemplo, para que todas corran de oeste a este, pero esto no resuelve el problema de las líneas que van de norte a sur y viceversa.
¿Conoces algún algoritmo que aborde este problema? He estado buscando, pero además del algoritmo para calcular la dirección promedio de segmentos no dirigidos, no he encontrado nada remotamente útil, por lo que debo estar usando los términos de búsqueda incorrectos.
fuente
Respuestas:
Si te entiendo bien, quieres agrupar líneas que sean más o menos iguales sin importar la dirección.
Aquí hay una idea que creo que podría funcionar.
dividir las líneas en el punto inicial y final
Agrupe los puntos y obtenga la identificación del clúster
Encuentre líneas con la misma combinación de ID de clúster. Esos son un racimo
Esto debería ser posible en PostGIS (por supuesto :-)) versión 2.3
No he probado la función ST_ClusterDBSCAN, pero debería hacer el trabajo.
Si tiene una tabla de líneas como esta:
Y desea crear el clúster donde los puntos de inicio y finalización estén separados por un máximo de 10 km. Y debe haber al menos 2 puntos para ser un clúster, entonces la consulta podría ser algo como:
Al unirse con
a.cluster_id<b.cluster_id
usted obtiene una identificación de clúster comparable, independiente de la dirección.fuente
¿Realmente desea agruparse únicamente por dirección, sin tener en cuenta el origen o el destino? Si es así, hay algunas formas muy simples. Quizás lo más fácil es calcular la demora de cada línea, duplicarla y trazarla como un punto en un círculo. Dado que los rodamientos hacia adelante y hacia atrás difieren en 180 grados, difieren en 360 grados después de duplicarse y, por lo tanto, se trazan exactamente en el mismo lugar. Ahora agrupa los puntos en el plano usando cualquier método que desees.
Aquí hay un ejemplo de trabajo en
R
, con su salida que muestra las líneas coloreadas de acuerdo con cada uno de los cuatro grupos. Por supuesto, es probable que use un SIG para calcular los rodamientos: utilicé rodamientos euclidianos por simplicidad.fuente
Su aclaración de la pregunta indica que le gustaría que la agrupación se base en los segmentos de línea reales , en el sentido de que dos pares de origen-destino (OD) deben considerarse "cercanos" cuando ambos orígenes están cerca y ambos destinos están cerca , independientemente de qué punto se considere origen o destino .
Esta formulación sugiere que ya tiene una idea de la distancia d entre dos puntos: podría ser la distancia a medida que el avión vuela, la distancia en el mapa, el tiempo de viaje de ida y vuelta o cualquier otra métrica que no cambie cuando O y D son cambiado. La única complicación es que los segmentos no tienen representaciones únicas: corresponden a pares desordenados {O, D} pero deben representarse como pares ordenados , ya sea (O, D) o (D, O). Por lo tanto, podríamos tomar la distancia entre dos pares ordenados (O1, D1) y (O2, D2) como una combinación simétrica de las distancias d (O1, O2) yd (D1, D2), como su suma o el cuadrado raíz de la suma de sus cuadrados. Escribamos esta combinación como
Simplemente defina la distancia entre pares desordenados para que sea la menor de las dos distancias posibles:
En este punto, puede aplicar cualquier técnica de agrupación basada en una matriz de distancia.
Como ejemplo, calculé las 190 distancias punto a punto en el mapa para 20 de las ciudades más pobladas de EE. UU. Y solicité ocho grupos utilizando un método jerárquico. (Para simplificar, utilicé los cálculos de distancia euclidiana y apliqué los métodos predeterminados en el software que estaba usando: en la práctica, querrá elegir distancias y métodos de agrupamiento adecuados para su problema). Aquí está la solución, con grupos indicados por el color de cada segmento de línea. (Los colores se asignaron aleatoriamente a los grupos).
Aquí está el
R
código que produjo este ejemplo. Su entrada es un archivo de texto con los campos "Longitud" y "Latitud" para las ciudades. (Para etiquetar las ciudades en la figura, también incluye un campo "Clave").fuente