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:
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 é:
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 é:
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:
Alguém pode me sugerir como obter a saída desejada?