Точечный отбор вдоль береговой линии обвивания полюсов с помощью 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. Даже тогда, похоже, вам, возможно, придется иметь дело с линией среза к полюсу и обратно вдоль линии даты.
Тоби Спейт

Ответы:


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)хитрости, чтобы устранить линию разреза - это полезно!
Тоби Спейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.