PostGIS 다각형 모서리 분석 (방향, 모서리 길이)


9

나는 GIS 세계, 특히 PostGIS에 익숙하지 않기 때문에 대답이 분명 해지면 실례합니다.

여러 건물을 분석하고 싶습니다. 내가 관심이있는 것은 정면 방향과 각각의 방향입니다. 아래 그림과 같이 일련의 다각형에서 모든 가장자리의 길이와 (정상) 방향을 원합니다. 이 예에서는 하나의 표면 만 강조했습니다.

여기에 이미지 설명을 입력하십시오

결과 테이블 다음과 같습니다.

building_id | edge_id | orientation | edge_length
-------------------------------------------------
      1     |    1    |     315     |    10.0
      1     |    2    |      45     |     7.0
      1     |   ...   |     ...     |     ...

그러나 추가 처리를 위해 결과를 저장하는 현명한 방법인지 확실하지 않습니다 (예 : 가장자리에서 다음 건물까지의 거리 계산 등). 그래서 내 질문은 두 가지입니다.

  1. 다각형의 가장자리를 분석 할 수있는 효율적인 PostGIS 기능이 있습니까? 네이티브 PostGIS 함수가없는 경우 파이썬 기반 접근 방식에 관심이있을 것입니다.
  2. 다각형의 가장자리 수가 다를 수 있으므로 결과를 PostGIS 테이블에 저장하는 현명한 방법은 무엇입니까?

2
먼저 다각형의 세그먼트를 만듭니다. stackoverflow.com/questions/7595635/… 그런 다음 시작점 및 끝점 좌표는 x1, y1 및 x2, y2와 같은 열과 ST_Azimuth (ST_Startpoint (geometries), ST_Endpoint (geometries))보다 열로 이동해야합니다. . ( postgis.org/docs/ST_Azimuth.html )
Tamas Kosa

1
@TamasKosa : 당신은 좋은 대답의 본질이 있습니다. 왜 하나로 확장하지 않습니까? 또한 법선의 경우 방위각에는 +/- pi / 2가 필요합니다.
Martin F

1
@TamasKosa 이것은 또한 내가 생각했던 접근법입니다. ST_ExteriorRing을 사용 하고 말한대로 방위각을 구하십시오. 건물의 가장자리 수가 다를 수 있으므로 결과를 이상적으로 저장하는 방법은 무엇입니까? 위에서 설명한 테이블에서? MartinF에 동의합니다. 이것은 거의 답입니다.)
n1000

궁금한 점, 왜 노멀을 원하십니까? 태양 노출?
Martin F

1
귀하의 질문의 첫 번째 부분은 ST_Dumppoints 및 ST_Azimuth를 사용할 수 있습니다. 두 번째 부분에서는 출력에 공간 요소가 없기 때문에 내가 찾듯이 polygonID 및 edge_id에 대한 링크를 생각합니다.
존 파월

답변:


10

어제 세부 정보를 만들 시간이 없었습니다 ... 4 단계로 솔루션을 확인하십시오.

CREATE OR REPLACE VIEW bd_segment AS
SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep
    FROM
       -- extract the individual linestrings
       (SELECT (ST_Dump(ST_Boundary(the_geom))).geom
       FROM bd) AS linestrings;

CREATE OR REPLACE VIEW bd_segment_geom AS
SELECT sp, ep, st_makeline(sp, ep) 
FROM bd_segment;

CREATE OR REPLACE view bd_segment_id AS 
SELECT bd.gid, row_number() 
    OVER (order by bd.gid), degrees(st_azimuth(ff.sp, ff.ep)-1.57079633) AS az_deg,
    ST_LENGTH(ff.st_makeline) , ff.st_makeline FROM bd_segment_geom ff
JOIN bd ON st_touches(ff.st_makeline, bd.the_geom)
GROUP BY bd.gid, ff.sp, ff.ep, ff.st_makeline;

UPDATE bd_segment_id
SET az_deg = az_deg + 360
WHERE az_deg < 0;

마지막 쿼리는 st_touches를 사용하여 공간 조인이있는 건물 ID를 제공합니다. 도움이 되길 바랍니다. 업데이트-qgis에서 솔루션은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오


1
감동적인! 나는 그것을 작동시켰다. 정말 고맙습니다! 많은 건물이 있으면 조금 느려집니다. 방위각은 현재 법선이 아닙니다. 또한 그것을 해결하는 방법에 대한 아이디어가 있습니까? 다각형의 "외부"면을 찾는 방법을 잘 모르겠습니다.
n1000

1
다음과 같이 라디안으로 방위각에 90도를 추가합니다 :도 (st_azimuth (ff.sp, ff.ep) +1.57079633). 때로는 360보다 큰 값을 생성하지만 업데이트 쿼리를 사용하면 값을 바꿀 수 있습니다. 정적 뷰로 사용하려면 "CREATE MATERIALIZED VIEW"를 작성하면 처음에는 느리지 않습니다.
Tamas Kosa

2
좀 빠지는. 북쪽이 0 °라고 가정하면 다각형 / 건물 내부 를 향한 법선이 표시됩니다 (스크린 샷에서도 볼 수 있음). 그러나 당신은 옳습니다-간단한 UPDATE트릭을해야합니다. 이 훌륭한 솔루션에 다시 한번 감사드립니다. 수락하기 전에 다른 답변이 표시되면 며칠 더 기다릴 것입니다.
n1000

1
무엇에 대해 ST_ForceRHR? 이 대답은 실제로 괜찮은 것 같습니다.
Jakub Kania

@JakubKania 나는 ST_ForceRHR해결책 을 제시하려고했지만 성공하지 못했습니다. 힌트를 ST_Dump(ST_Boundary(ST_ForceRHR(the_geom)))
주셔서
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.