postgis를 사용하여 아이소 라인을 아이소 폴리곤으로 변환하는 방법은 무엇입니까?


9

다음과 같이 정의 된 isgiline의 postgis 테이블이 있습니다.

CREATE TABLE myisolines
(
  gid serial NOT NULL,
  isotime timestamp without timezone,
  val numeric(10,4),
  geom geometry(LineString,4326)
);

시각적 으로이 줄 문자열 객체는 다음과 같습니다.

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

내 데이터의 공간 범위를 알고 있으므로 Bbox를 추가하여 LineStrings를 닫을 수 있습니다.

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

I는 isopolygons의 테이블을 만들 myisopolygons에서 myisolines없는 오버랩하지만 연속적인 표면을 생성하고 열 가질 것, 다각형, 테이블 val최저와 val다각형이 형성되는, 등각의이. 나는 그것이 자기 폐쇄 isoline (island) 또는 bbox로 닫힌 isoline으로 형성 될 수 있음을 이해합니다.이 경우 val특정 isoline에서 가져와야합니다. 시각적으로 다음과 같아야합니다.

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

어떻게 든 토폴로지를 만든 다음면을 다각형으로 변환 할 수 있다고 생각했지만 제대로 수행하는 방법을 이해하지 못합니다. 이것을 어떻게 할 수 있습니까?

또 다른 옵션은 bbox와 각 생성 된 다각형 사이에 차등 함수를 재귀 적으로 사용하는 것이지만 그것이 올바른 방법이 아니며 전혀 빠르지는 않습니다.


ST_Split 또는 ST_BuildArea는 문제의 좋은 후보입니다.
nickves

답변:


3

다음을 사용하는 솔루션이 ST_Polygonize있습니다. 각 경계에 대해 다각형을 생성하고 다각형이 포함하는 최소 및 최대 고도를 제공합니다. 알고리즘은 피크와 디프레션을 구분할 수 없으며이 경우 최소값과 최대 값 모두에 대해 동일한 고도를 반환합니다.

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

WITH쿼리의 절은 기존의 윤곽의 약간-계약 범위로를 unioning으로 열려있는 윤곽을 "종료". (의 범위는를 사용하여 발생하는 모든 반올림 오차를 씻기 위해 계약되며 ST_Extent, 이로 인해 단 정밀도 상자가 생성 ST_Polygonize됩니다. 등고선이 이미 닫힌 경우 (즉, 섬을 사용하는 경우)이 단계를 생략 할 수 있습니다.


0

나는 매우 예리하지는 않지만 함수 기하학 ST_MakePolygon (형상 outerlinestring, geometry [] interiorlinestrings);


그것은 실제로 질문에 완전히 대답하지는 않습니다.
존 파월

0

bbox를 사용하고 각 등고선을 반복하면 ST_ConcaveHull각 영역을 다각형으로 변환 하는 데 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.