Tengo datos de puntos a lo largo de las calles, me gustaría convertir esos puntos en líneas de colores simples. ¿Algún indicador de cómo se puede llamar este problema o algún algoritmo que pueda ayudarme a resolver esto?
Esperaba usar PostGIS
funciones para hacer esto, pero estoy abierto a sugerencias, estos son datos de un .shp
archivo.
Edit1: se actualizó la imagen para demostrar la solución ideal de este problema.
Dibujar la línea se basaría puramente en la distancia entre esos puntos, no hay nada más que pueda usar para agruparlos. Idealmente, ¿serían puntos a la distancia máxima especificada a lo largo de la línea proyectada? Y por línea proyectada me refiero a encontrar el primer punto, luego el próximo más cercano a él, luego proyectar una línea y verificar si hay puntos en esta línea a una distancia máxima de cualquiera de los que ya están en la línea.
Respuestas:
Puede usar una consulta recursiva para explorar el vecino más cercano de cada punto a partir de cada extremo de líneas detectado que desea construir.
Prerrequisitos : prepare una capa postgis con sus puntos y otra con un solo objeto Multi-linetring que contenga sus carreteras. Las dos capas deben estar en el mismo CRS. Aquí está el código para el conjunto de datos de prueba que creé, modifíquelo según sea necesario. (Probado en postgres 9.2 y postgis 2.1)
Aquí están los pasos :
Genere para cada punto la lista de cada vecino y su distancia que cumpla estos tres criterios.
La distancia no debe exceder una relación definida por el usuario de la distancia desde el vecino más cercano (esto debería acomodarse mejor a la digitalización irregular que la distancia fija)Esta parte fue realmente demasiado difícil de implementar, pegada al radio de búsqueda fijoLlamemos a esta tabla "el gráfico"
Seleccione el punto de final de línea uniéndose al gráfico y manteniendo solo el punto que tenga exactamente una entrada en el gráfico.
Llamemos
fácil a esta tabla "eol" (final de línea) ? que la recompensa por hacer un gran gráfico pero que las cosas se vuelvan locas en el próximo paso
Configure una consulta recursiva que irá en ciclo de vecinos a vecinos a partir de cada eol
Llamemos a esta tabla "recurse_eol"
Mantenga solo la línea más larga para cada punto de inicio y elimine todas las rutas duplicadas exactas Ejemplo: las rutas 1,2,3,5 Y 5,3,2,1 son la misma línea descubierta por sus dos "finales de línea" diferentes
Comprueba manualmente los errores restantes (puntos aislados, líneas superpuestas, calles con formas extrañas)
Actualizado como se prometió, todavía no puedo entender por qué a veces la consulta recursiva no da exactamente el mismo resultado al comenzar desde el extremo opuesto de una misma línea, por lo que puede haber algún duplicado en la capa de resultados a partir de ahora.
Siéntase libre de preguntar, entiendo totalmente que este código necesita más comentarios. Aquí está la consulta completa:
fuente
Como señala @FelixIP, el primer paso es encontrar los puntos que formarán cada línea. Puede hacerlo llamando a ST_ClusterWithin con su distancia de separación máxima:
Luego, necesitará usar algo de heurística para construir una línea a través de todos los puntos en cada grupo. Por ejemplo, si puede suponer que las líneas deseadas son monótonas en Y, puede ordenar los puntos en cada grupo y alimentarlos en ST_MakeLine . Combinar eso todos juntos se vería así:
fuente