PostGIS를 사용하여 폴 랩핑 해안선을 따라 포인트 샘플링


11

해안선을 따라 1000km마다 샘플 포인트를 가져와 남극 대륙에 문제가 발생하는 작업을 수행하고 있습니다. 내가 알 수있는 것은 실제로이 작업지리를 사용해야 한다고 생각할 때 함수에서 기하학 을 사용하는 데 문제가있는 것 같습니다 .

이 매우 비슷한 질문 의 함수를 사용하면 다음과 같은 결과를 얻을 수 있습니다 나쁜 결과.

당신이 볼 수있는 것처럼 ST_AddMeasure()ST_LocateAlong()남극에 앉아 많은 점에서 어떤 결과, 구면 형상을 취급하지 않는 것. 날짜 선을 따라 클립에 포인트가 추가되었습니다 (왼쪽). 이 두 함수의 문서에 따라 지오메트리 만 사용할 수 있습니다.

다각형과 점을 생성하는 데 사용되는 코드 는 여기 에서 찾을 수 있지만 점을 생성하는 데 사용되는 SQL입니다.

CREATE TABLE atest AS WITH line AS 
  (SELECT
      id,
      ST_ExteriorRing((ST_Dump(geom)).geom) AS geom
    FROM line_sample_test),
linemeasure AS
    (SELECT
        ST_AddMeasure(line.geom, 0, (ST_Length(line.geom))::int) AS linem,
    generate_series(0, (ST_Length(line.geom))::int, 10) AS i
FROM line),

geometries AS (
    SELECT
        i,
        ST_LocateAlong(linem, i) AS geom 
    FROM linemeasure)

SELECT
    * from geometries;

이 해안선을 따라 1000km마다 포인트를 어떻게 생성 할 수 있습니까?


ST_Segmentize를 사용해 보셨습니까? 또한 지오메트리에서만 작동 할 수 있지만 적어도 포인트를 생성하는 더 빠른 방법처럼 보입니다. 어쨌든 극점을 제거하는 것이 어떻습니까? 버그보다는 사용 된 투영의 부작용처럼 보입니다.
lynxlynxlynx 2018 년

5
그림에서 EPSG : 4326의 형상이있는 것 같습니다. 남극 대륙은 EPSG : 3031과 같은 극좌표 입체 투영에 더 적합합니다. 그럼에도 불구하고 날짜 줄을 따라 기둥에 대한 컷 라인을 처리해야 할 수도 있습니다.
Toby Speight

답변:


3

의견 중 하나에서 제안했듯이 먼저 입력 지오메트리를 극좌표 입체 투영으로 변환합니다.

또한 결과 절단 선을 제거하기 위해 ST_Buffer(의 양으로 0)을 사용하고 싶을 것 입니다.

따라서 원하는 결과를 얻을 수 있습니다.

-- ST_Transform(geom,3031) reprojects to south polar stereographic,
-- in meters.  ST_Buffer(...) doesn't change the shape, but removes
-- the cut line to the pole (at 180 degrees).
WITH line AS (
    SELECT ST_ExteriorRing(
        ST_Buffer(ST_Transform(geom, 3031), 0)
    ) AS geom
    FROM line_sample_test
),

-- This just generates a table of numbers.  In this case, from 0
-- to the geometry length, counting by 1,000,000 (1000 km).
linemeasure AS (
    SELECT generate_series(0, ST_Length(geom)::int, 1000000) AS i
    FROM line
),

-- Convert those values to a fraction of the overall length (for
-- use as input to ST_LineInterpolatePoint)
linefraction AS (
    SELECT i / ST_Length(geom) AS fraction
    FROM line, linemeasure
),

-- Do the interpolation
geometries AS (
    SELECT ST_LineInterpolatePoint(l.geom, lf.fraction) AS geom
    FROM linefraction lf, line l
),

-- Convert back to EPSG:4326 (i.e. lat/lon coords)
geometries_4326 AS (
    SELECT ST_Transform(geom, 4326) AS geom FROM geometries
)
SELECT * FROM geometries_4326

이 쿼리는 line_sample_test테이블에 행이 하나만 있다고 가정 하므로 실제 입력 데이터에 필요한만큼 조정하십시오.


ST_Buffer(geom, 0)컷 라인을 제거 하는 트릭을 몰랐습니다 . 유용합니다!
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.