Lấy mẫu điểm dọc theo đường bờ biển bao quanh với PostGIS


11

Tôi đang thực hiện một nhiệm vụ đòi hỏi tôi phải lấy điểm mẫu sau mỗi 1000 km dọc theo bờ biển, và đã gặp phải vấn đề với Nam Cực. Từ những gì tôi có thể nói, dường như đó là một vấn đề với việc sử dụng hình học trong các chức năng, khi tôi thực sự nghĩ rằng nên sử dụng địa lý cho hoạt động này.

Sử dụng hàm từ câu hỏi tương tự này , tôi có thể tạo ra một kết quả trông như thế này : kết quả xấu.

Như bạn có thể thấy, ST_AddMeasure()ST_LocateAlong()dường như không xử lý hình học theo hình cầu, điều này dẫn đến nhiều điểm nằm ở Nam Cực. Một điểm thậm chí đã được thêm vào clip dọc theo dòng ngày (bên trái). Theo tài liệu của hai chức năng này, chỉ có thể sử dụng hình học .

Mã được sử dụng để tạo đa giác và các điểm có thể được tìm thấy ở đây , nhưng đây là SQL được sử dụng để tạo các điểm:

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;

Làm cách nào tôi có thể tạo điểm tại mỗi 1000 Km dọc theo bờ biển này?


Bạn đã thử ST_Segmentize chưa? Nó cũng chỉ có thể hoạt động trên hình học, nhưng ít nhất có vẻ như là một cách nhanh hơn để tạo điểm. Dù sao, tại sao không chỉ loại bỏ điểm ở cực? Nó trông giống như một tác dụng phụ của phép chiếu được sử dụng hơn là một lỗi.
lynxlynxlynx

5
Từ hình ảnh của bạn, có vẻ như bạn có hình học của mình trong EPSG: 4326. Nam Cực phù hợp hơn với phép chiếu lập thể cực như EPSG: 3031. Thậm chí sau đó, có vẻ như bạn có thể cần phải xử lý một đường cắt tới cực và quay lại, dọc theo Đường ngày.
Toby Speight

Câu trả lời:


3

Như được đề xuất trong một trong các ý kiến, trước tiên tôi sẽ chuyển đổi hình dạng đầu vào thành hình chiếu lập thể cực.

Ngoài ra, bạn sẽ muốn sử dụng ST_Buffernó (với một lượng 0) để thoát khỏi đường cắt kết quả.

Vì vậy, điều này sẽ nhận được kết quả mong muốn của bạn:

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

Lưu ý rằng truy vấn này giả định rằng chỉ có một hàng trong line_sample_testbảng, vì vậy hãy điều chỉnh khi cần thiết cho dữ liệu đầu vào thực sự của bạn.


Tôi không biết ST_Buffer(geom, 0)mẹo để loại bỏ đường cắt - điều đó hữu ích!
Toby Speight
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.