PostgreSQL 데이터베이스에 거리 (도로 중심선)와 건물 다각형 테이블이 있습니다. 샘플 시나리오는 다음과 같습니다.
문제:
거리와 가장 가까운 건물 다각형 주위의 50 미터 버퍼 교차로에서 거리를 따라 평행선을 계산해야합니다. 원하는 출력 시나리오는 다음과 같습니다.
내가 시도한 것 :
내 접근 방식은 다음과 같습니다.
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
내 시도는 다음과 같습니다.
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
위의 코드의 문제점은 원하는 출력에 따라 평행선을 반환하지 않는다는 것입니다. 즉, 가장 가까운 다각형의 교차점 대신 모든 다각형 교차점에 평행선이 생성됩니다.
EDIT_1 :
위 코드의 실제 출력은 다음과 같습니다.
위의 출력에서 노란색 평행선 (거리의 양쪽에서 가장 가까운 다각형에 대한 오프셋 곡선) 만 필요합니다.
누구든지 원하는 출력을 얻는 방법을 제안 할 수 있습니까?
실제 출력의 이미지도 추가 할 수 있습니까? 문제를 이해하는 데 도움이됩니다.
—
기울이기
@ 틸트 : 질문을 편집했습니다. 실제 출력에 실제 출력과 필요한 병렬 라인을 추가했습니다.
—
khajlk
문제는 생각보다 복잡합니다. 갈증은 거리의 어느 쪽에서 집들이 있는지 알아 내야합니다. 그런 다음에야 당신의 가장 가까운 찾을 수 있습니다 양쪽 측면. 다음은 올바른면을 찾는 예제 코드가있는 게시물입니다. gis.stackexchange.com/questions/156578/…
—
tilt
실제로 건물이 한쪽에만있는 경우가있을 수 있습니다 (예외라고 부릅니다). 원하는 출력에 도달하면 예외를 처리하도록 코드를 수정할 수 있습니다. 위에서도 양쪽에 다각형을 작성하는 것을 볼 수 있습니다. 이 시점에서 필자의 요구 사항은 거리의 양쪽에 평행선을 얻는 것입니다 (그림에 표시된 것과 같이). 귀하의 링크와 관련하여 예제 코드를 사용하여 위의 코드를 나중에 개선 할 수 있습니다.
—
khajlk
내가 보는 한 가지는 버퍼가 중복된다는 것입니다. stdwithin을 사용하고 거리로 50을 사용할 수 있습니다. (선택 거리, 건물 st_dwithin (거리, 건물, 50))
—
jbalk