Computar linhas paralelas ao longo de uma linha central no PostGIS

10

Eu tenho street (line center line) e construindo tabelas de polígonos no meu banco de dados PostgreSQL. O cenário de amostra é o seguinte:

Cenário de amostra

Problema:

Preciso calcular linhas paralelas ao longo da rua no cruzamento de 50 metros de buffer em torno da rua e do polígono de construção mais próximo de ambos os lados. O cenário de saída desejado é:

Cenário de saída desejado

O que eu tentei:

Minha abordagem foi:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

Aqui está a minha tentativa:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

O problema com o código acima é que ele não retorna linhas paralelas de acordo com a saída desejada, ou seja, linhas paralelas em todas as interseções de polígonos estão sendo geradas, em vez de na interseção dos polígonos mais próximos.

EDIT_1:

A saída real do código acima é:

code_output

Enquanto que, na saída acima, apenas linhas paralelas amarelas (curvas de deslocamento para os polígonos mais próximos nos dois lados da rua) são necessárias:

linhas necessárias na saída real

Alguém pode me sugerir como obter a saída desejada?

khajlk
fonte
Você também pode adicionar uma imagem da saída real? Isso ajuda a entender o problema.
incline
@tilt: Eu editei a pergunta. Apenas adicionamos a saída real e as linhas paralelas necessárias na saída real.
Khajlk 29/05
A questão é mais complexa do que você pensa. Você precisa descobrir de que lado da rua estão as casas. Só então você poderá encontrar o mais próximo dos dois lados. Aqui está uma postagem que possui um código de exemplo para encontrar o lado correto: gis.stackexchange.com/questions/156578/…
tilt
Na realidade, pode haver casos em que os edifícios estão apenas de um lado (eu chamaria de exceções). Eu poderia modificar meu código para lidar com exceções quando conseguir atingir minha saída desejada. Acima, você ainda vê polígonos dos dois lados. Neste ponto, meu requisito é obter linhas paralelas nos dois lados da rua (como as que mostrei na figura). Em relação ao seu link, eu poderia usar o código de exemplo para melhorar meu código acima provavelmente mais tarde.
Khajlk 29/05
Uma coisa que vejo é que o buffer é redundante. Você pode simplesmente usar stdwithin e usar 50 como a distância. (Selecione ruas, prédios em que st_dwithin (ruas, prédios, 50))
jbalk

Respostas:

1

Se você modificou a distância CTE da seguinte forma:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

somente a distância mais curta seria retornada para cada rua, e um par de linhas de deslocamento seria gerado nessa distância.

Andy Harfoot
fonte
Obrigado pela sugestão. Vou testá-lo e ver se ele dá o resultado esperado. Eu tenho procurado para resolver esse problema. Eu descobri uma idéia maluca: para começar com 1 m de buffer na rua e incrementar programaticamente o buffer E procurar edifícios em ambos os lados até a contagem de edifícios ser 2, em seguida, retorne essa distância do buffer como largura da rua. O objetivo final de todos os exercícios acima.
precisa saber é o seguinte
É verdade que apenas um par de deslocamento é gerado usando sua sugestão. No entanto, as linhas paralelas amarelas mostradas acima ainda estão faltando :(
khajlk