Unir linhas de interseção com o PostGIS


15

Isso é algo que tenho quase vergonha de perguntar, mas não consigo fazê-lo funcionar pela minha vida.

Eu tenho uma camada de estrada com segmentos, cada segmento tem um Road IDe um segmento type.

Gostaria de unir todos os segmentos, para cada Road IDum em uma cadeia de linhas, mas apenas quando são iguais typee estão tocando (todas as linhas são encaixadas).

insira a descrição da imagem aqui

Road ID - Type
   1       L
   1       L
   1       T
   1       L

Respostas:


11

Acredito que o código abaixo é uma solução um pouco mais limpa que a resposta selecionada por alguns motivos. Primeiro, nenhuma junção de tabela é necessária e, portanto, um adendo à cláusula 'ON' não é necessário para cada um dos atributos das ruas, e segundo a metodologia acima pode potencialmente produzir várias cadeias de linhas se houver vários grupos de ruas não contíguos que tenham todos os mesmos valores de atributo, enquanto ST_Dump cuida desse problema nesta solução.

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

Meu geometria não se confunde com qualquer consulta
Luffydude

@Luffydude se preocupa em fornecer mais informações? É possível que a geometria você está trabalhando com não está alinhado de tal forma que é possível para que possa ser fundida
Grant Humphries

Isso funcionou perfeitamente para mesclar um conjunto de dados de estrada com base no ID da estrada. Isso lidava com as estradas com espaços maravilhosos (sem linhas nas seções). Eu não sou OP, mas esta é uma ótima resposta. Essa deve ser a resposta aceita. Obrigado.
jbalk

Esta é a melhor resposta!
aborruso

6

Parece que isso 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"

0

Apenas cuspir, mas posso pensar em algumas outras soluções. Não sei se são melhores ou piores, apenas que são outros.

Primeiro, se houver apenas alguns tipos de estradas, você poderá digitar por tipo com 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);

Você também pode usar a maioria dos itens acima com Road_Type como a variável em um loop FOR se houver vários tipos.

Meu último pensamento envolveu mesclar todas as geometrias e, em seguida, chamar tipos de estradas com a função ST_Line_Substring ( Link-Link ), mas isso não funcionará.

Boa sorte com isso, Rob

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.