PostGISを使用したポールラップ海岸線に沿ったポイントサンプリング


11

私は、海岸線に沿って1000 kmごとにサンプルポイントを取得する必要があるタスクに取り組んでおり、南極大陸の問題に遭遇しました。私が知ることができることから、実際にこの操作に地理を使用すべきだと思うとき、それは関数での幾何学の使用に関する問題のようです。

このよく似た質問の関数を使用して、次のような結果を生成できます悪い結果

あなたが見ることができる、通りST_AddMeasure()ST_LocateAlong()南極の上に座って、多くの点でその結果、球状ジオメトリを扱うようには見えません。日付線(左側)に沿ってクリップにポイントが追加されました。これら2つの関数のドキュメントに従って、ジオメトリのみを使用できます。

ポリゴンとポイントの生成に使用されるコードはここにありますが、これはポイントの生成に使用される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;

この海岸線に沿って1000 Kmごとにポイントを生成するにはどうすればよいですか?


ST_Segmentizeを試しましたか?また、ジオメトリでのみ機能しますが、少なくともポイントを生成するより迅速な方法のようです。とにかく、なぜポールでポイントを削除しないのですか?これは、バグというよりは使用済みの投影の副作用のようです。
lynxlynxlynx

5
写真から、EPSG:4326にジオメトリがあるように見えます。南極大陸は、EPSG:3031などの極立体投影に適しています。それでも、日付変更線に沿って、ポールへのカットラインとバックへの対応が必要なようです。
トビースパイト

回答:


3

コメントの1つで示唆されているように、最初に入力ジオメトリをポーラーステレオグラフィック投影に変換します。

さらに、その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テーブルに行が1つしかないことを前提としているため、実際の入力データに必要に応じて微調整することに注意してください。


ST_Buffer(geom, 0)カットラインをなくすコツは知りませんでした-それは便利です!
トビー・スペイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.