Вибір точок вздовж узбережжя, що обертає полюси, за допомогою PostGIS


11

Я працюю над завданням, яке вимагає, щоб я отримував вибіркові бали кожні 1000 км уздовж берегової лінії, і у мене виникли проблеми з Антарктидою. З того, що я можу сказати, видається, що проблема використання геометрії у функціях, коли я дійсно думаю, що географія повинна використовуватися для цієї операції.

Використання функції від цього дуже подібного питання , я можу отримати результат , який виглядає наступним чином : поганий результат.

Як бачите, 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;

Як я можу генерувати очки на кожні 1000 км уздовж цієї берегової лінії?


Ви пробували ST_Segmentize? Він також може працювати лише на геометрії, але, принаймні, здається, що це швидший спосіб генерування очок. У будь-якому випадку, чому б просто не зняти точки на полюсі? Це більше схоже на побічний ефект використовуваної проекції, ніж на помилку.
lynxlynxlynx

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.