PostGIS에서 중심선을 따라 평행선 계산


10

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 :

위 코드의 실제 출력은 다음과 같습니다.

code_output

위의 출력에서 ​​노란색 평행선 (거리의 양쪽에서 가장 가까운 다각형에 대한 오프셋 곡선) 만 필요합니다.

실제 출력에 필요한 라인

누구든지 원하는 출력을 얻는 방법을 제안 할 수 있습니까?


실제 출력의 이미지도 추가 할 수 있습니까? 문제를 이해하는 데 도움이됩니다.
기울이기

@ 틸트 : 질문을 편집했습니다. 실제 출력에 실제 출력과 필요한 병렬 라인을 추가했습니다.
khajlk

문제는 생각보다 복잡합니다. 갈증은 거리의 어느 쪽에서 집들이 있는지 알아 내야합니다. 그런 다음에야 당신의 가장 가까운 찾을 수 있습니다 양쪽 측면. 다음은 올바른면을 찾는 예제 코드가있는 게시물입니다. gis.stackexchange.com/questions/156578/…
tilt

실제로 건물이 한쪽에만있는 경우가있을 수 있습니다 (예외라고 부릅니다). 원하는 출력에 도달하면 예외를 처리하도록 코드를 수정할 수 있습니다. 위에서도 양쪽에 다각형을 작성하는 것을 볼 수 있습니다. 이 시점에서 필자의 요구 사항은 거리의 양쪽에 평행선을 얻는 것입니다 (그림에 표시된 것과 같이). 귀하의 링크와 관련하여 예제 코드를 사용하여 위의 코드를 나중에 개선 할 수 있습니다.
khajlk

내가 보는 한 가지는 버퍼가 중복된다는 것입니다. stdwithin을 사용하고 거리로 50을 사용할 수 있습니다. (선택 거리, 건물 st_dwithin (거리, 건물, 50))
jbalk

답변:


1

거리 CTE를 다음과 같이 수정 한 경우 :

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

각 거리에 대해 가장 짧은 거리 만 반환되며 해당 거리에 한 쌍의 오프셋 선이 생성됩니다.


제안 해 주셔서 감사합니다. 테스트하고 예상 결과가 나오는지 확인합니다. 이 문제를 해결하기 위해 파고 들었습니다. 거리에서 1m 버퍼로 시작하고 프로그래밍 방식으로 버퍼를 늘리고 건물 수가 2가 될 때까지 양쪽에서 건물을 검색하려면이 버퍼 거리를 거리 너비로 반환하십시오. 위의 모든 운동의 궁극적 인 목표.
khajlk

제안을 사용하여 한 쌍의 오프셋 만 생성되는 것은 사실입니다. 그러나, 노란색 paralle 라인은 여전히 :( 누락 위의 도시
khajlk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.