9 votos

Dibujo línea entre puntos a distancia específica en PostGIS?

He de datos de puntos a lo largo de las calles, me gustaría convertir esos puntos en simples líneas de colores. Los punteros lo que este problema puede ser llamado o cualquier algoritmos que me puedan ayudar a resolver esto? Points along the street I would like to turn into lines.

Tenía la esperanza de utilizar PostGIS funciones para hacer esto, pero estoy abierto a sugerencias, este es un de los datos de una .shp archivo.

Edit1: se ha Actualizado la imagen para demostrar la solución ideal a este problema.

Dibujo de la línea sería puramente basado en la distancia entre esos puntos, no hay nada más que puedo usar para el grupo de ellos. Lo ideal sería que se apunta a la máxima distancia especificada a lo largo de la proyección de la línea? Y por proyectada de la línea me refiero a encontrar 1er punto, a continuación, la próxima más cercana, a continuación, el proyecto de una línea y comprobar si hay puntos en esta línea en el máximo de distancia a cualquiera de los ya existentes en la línea.

8voto

MBCook Puntos 8316

Como @FelixIP puntos, el primer paso es encontrar los puntos que componen cada línea. Usted puede hacer esto llamando a ST_ClusterWithin con su máxima distancia de separación:

SELECT
  row_number() OVER () AS cid, 
  (ST_Dump(geom)).geom 
FROM (
  SELECT unnest(st_clusterwithin(geom, 0.05)) AS geom 
  FROM inputs) sq

A continuación, tendrás que usar alguna heurística para construir una línea a través de todos los puntos en cada clúster. Por ejemplo, si puede suponer el deseado de las líneas Y monótona, puedes clasificar los puntos en cada grupo y piensos en ST_MakeLine. La combinación de que todos juntos tendría este aspecto:

SELECT 
  ST_MakeLine(geom ORDER BY ST_Y(geom)) AS geom
FROM (
  SELECT row_number() OVER () AS cid, 
  (ST_Dump(geom)).geom FROM (
    SELECT unnest(st_clusterwithin(geom, 0.05)) AS geom 
    FROM inputs) sq) ssq 
GROUP BY cid

8voto

Sanket Gupta Puntos 21

Puede usar una consulta recursiva a explorar vecino más cercano de cada punto de partida de cada detectado final de líneas que queremos construir.

Aquí están los pasos:

  1. Generar para cada punto de la lista de todos los vecinos y de ellos a distancia que cumplan con las tesis de los tres criterios.

    • Ruta directa no debe cruzar una carretera
    • La distancia no debe exceder de un usuario define el cociente de la distancia del vecino más cercano (esto debería adaptarse mejor a las irregularidades del proceso de digitalización de distancia fija)
    • Incluso para el vecino más cercano, la distancia no debe exceder un umbral definido por el usuario (esto va a evitar la vinculación a punto aislado)

    Vamos a llamar a esta tabla de "el gráfico"

  2. Seleccione el final de la línea de punto de unirse a la gráfica de y mantener único punto que tiene exactamente una entrada en el gráfico. Vamos a llamar a esta tabla de "eol" (final de línea)
    fácil? que la recompensa por hacer un gran gráfico, pero de retención sobre las cosas se vuelven locos en el siguiente paso

  3. Configurar una consulta recursiva que el ciclo de los vecinos de los vecinos a partir de cada una de eol

    • Inicializar la consulta recursiva utilizando eol tabla y adición de un contador para la profundidad, un agregador para la ruta, y una geometría constructor para construir las líneas
    • Mover a la siguiente iteración por el cambio a la del vecino más cercano utilizando el gráfico y la comprobación de que usted nunca ir hacia atrás utilizando la ruta de acceso
    • Después de la iteración es terminado de mantener sólo el camino más largo para cada punto de partida (si el conjunto de datos incluyen el potencial de intersección entre esperar líneas que parte tendría más condiciones)

    Vamos a llamar a esta mesa "recurse_eol"

  4. Eliminar todos los duplicados exactos de ruta Ejemplo : caminos 1,2,3,5 Y 5,3,2,1 son de la misma línea descubierto por dos diferentes "final de línea"

  5. Manualmente cheques restantes errores (puntos aislados, la superposición de líneas, formas extrañas de la calle)


Empecé a construir una consulta que le de la cadena de los pasos 1 a 4, pero esto me tomó más tiempo de lo esperado, sobre todo porque se tomó el tiempo para identificar los criterios descritos en el paso 1. Identificar partido utilizando únicamente la distancia me dio mal resultado causar cualquiera de detectar demasiado vecino (a menudo a través de la calle) o muy pocos (porque he utilizado un hecho a mano conjunto de datos de prueba y me hizo un tanto desordenada de digitalización).

Voy a actualizar respuesta con un ejemplo de consulta más tarde en mi tiempo libre (porque por desgracia no estoy abonado a resolver gistackexchange rompecabezas en mi trabajo), pero si alguien ve un gran error en mi respuesta siéntase libre de decirme ahora, así que no tiene que persistir en un camino equivocado ;)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X