Pengambilan sampel titik di sepanjang garis pantai pembungkus tiang dengan PostGIS


11

Saya mengerjakan tugas yang mengharuskan saya untuk mendapatkan titik sampel setiap 1000 km di sepanjang garis pantai, dan telah mengalami masalah dengan Antartika. Dari apa yang bisa saya katakan, tampaknya ada masalah dengan penggunaan geometri dalam fungsi, ketika saya benar-benar berpikir geografi harus digunakan untuk operasi ini.

Menggunakan fungsi dari pertanyaan yang sangat mirip ini , saya mampu menghasilkan hasil yang terlihat seperti ini: hasil yang buruk.

Seperti yang dapat Anda lihat, ST_AddMeasure()dan ST_LocateAlong()sepertinya tidak memperlakukan geometri secara bulat, yang menghasilkan banyak titik yang berada di Kutub Selatan. Titik bahkan ditambahkan pada klip di sepanjang garis tanggal (sisi kiri). Per dokumentasi dari kedua fungsi ini, hanya geometri yang dapat digunakan.

Kode yang digunakan untuk menghasilkan poligon dan titik dapat ditemukan di sini , tetapi ini adalah SQL yang digunakan untuk menghasilkan titik:

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;

Bagaimana saya bisa menghasilkan poin di setiap 1000 Km di sepanjang garis pantai ini?


Sudahkah Anda mencoba ST_Segmentize? Ini juga hanya dapat bekerja pada geometri, tetapi setidaknya sepertinya cara yang lebih cepat untuk menghasilkan poin. Ngomong-ngomong, mengapa tidak menghilangkan titik di kutub? Itu lebih mirip efek samping dari proyeksi yang digunakan daripada bug.
lynxlynxlynx

5
Dari gambar Anda, sepertinya Anda memiliki geometri di EPSG: 4326. Antartika lebih cocok untuk proyeksi stereografi polar seperti EPSG: 3031. Bahkan kemudian, sepertinya Anda mungkin perlu berurusan dengan garis potong ke kutub dan kembali, di sepanjang Garis Tanggal.
Toby Speight

Jawaban:


3

Seperti yang disarankan dalam salah satu komentar, pertama-tama saya akan mengubah geometri input ke proyeksi stereografi kutub.

Selain itu, Anda ingin menggunakannya ST_Buffer(dengan jumlah 0) untuk menghilangkan garis potong yang dihasilkan.

Jadi ini akan mendapatkan hasil yang Anda inginkan:

-- 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

Perhatikan bahwa kueri ini mengasumsikan bahwa hanya ada satu baris dalam line_sample_testtabel, jadi atur seperlunya untuk data input nyata Anda.


Saya tidak tahu ST_Buffer(geom, 0)trik untuk menghilangkan cut-line - itu berguna!
Toby Speight
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.