Unir líneas de intersección con PostGIS

15

Esto es algo que casi me da vergüenza preguntar, pero parece que no puedo hacer que funcione para mí.

Tengo una capa de carretera con segmentos, cada segmento tiene un Road IDy un segmento type.

Me gustaría unir todos los segmentos juntos, para cada Road IDuno en una cadena lineal, pero solo cuando son iguales typey están en contacto (todas las líneas están unidas).

ingrese la descripción de la imagen aquí

Road ID - Type
   1       L
   1       L
   1       T
   1       L
Nathan W
fuente

Respuestas:

11

Creo que el siguiente código es una solución un poco más limpia que la respuesta seleccionada por un par de razones. Primero, no se necesitan uniones de tabla y, por lo tanto, no se necesita un anexo a la cláusula 'ON' para cada uno de los atributos de la calle, y en segundo lugar, la metodología anterior puede potencialmente producir cadenas de líneas múltiples si hay grupos de calles múltiples y no contiguas que tienen todos los mismos valores de atributo, mientras que ST_Dump se ocupa de ese problema en esta solución.

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union
Grant Humphries
fuente
Mi geometría no se fusiona con ninguna consulta
Luffydude
@Luffydude, ¿quieres proporcionar más información? Es posible que la geometría con la que está trabajando no esté alineada de manera que sea posible fusionarla
Grant Humphries
Esto funcionó de maravilla para fusionar un conjunto de datos de carretera basado en la identificación de la carretera. Esto manejaba las carreteras con huecos maravillosamente (sin líneas a través de las secciones de huecos). No soy OP, pero esta es una gran respuesta. Esta debería ser la respuesta aceptada. Gracias.
jbalk
¡Esta es la mejor respuesta!
aborruso
6

Parece que esto funciona

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"
Nathan W
fuente
0

Solo escupo pero puedo pensar en algunas otras soluciones. No sé si son mejores o peores, solo que son otros.

Primero, si solo hay unos pocos tipos de carreteras, puede ir tipo por tipo con algo como:

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

También podría usar la mayoría de los anteriores con Road_Type como la variable en un bucle FOR si hay un montón de tipos.

Mi último pensamiento consistió en fusionar todas las geometrías, luego llamar a los tipos de carreteras con la función ST_Line_Substring ( Link-Link ), pero eso no funcionará en absoluto.

Mucha suerte con eso, Rob

rec.thegeom
fuente