Amostragem de pontos ao longo de uma costa envolvente com PostGIS


11

Estou trabalhando em uma tarefa que exige que eu obtenha pontos de amostra a cada 1000 km ao longo da costa e tenha um problema com a Antártica. Pelo que sei, parece haver um problema com o uso da geometria nas funções, quando realmente acho que a geografia deve ser usada para esta operação.

Usando a função de esta questão muito semelhante , eu sou capaz de produzir um resultado parecido com este: resultado ruim.

Como você pode ver, ST_AddMeasure()e ST_LocateAlong()não parece tratar a geometria esfericamente, o que resulta em muitos pontos no Pólo Sul. Um ponto foi adicionado ao clipe ao longo da linha da data (lado esquerdo). De acordo com a documentação dessas duas funções, somente a geometria pode ser usada.

O código usado para gerar o polígono e os pontos pode ser encontrado aqui , mas este é o SQL usado para gerar os pontos:

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;

Como posso gerar pontos a cada 1000 km ao longo deste litoral?


Você já experimentou ST_Segmentize? Ele também pode funcionar apenas em geometrias, mas pelo menos parece uma maneira mais rápida de gerar os pontos. Enfim, por que não apenas remover pontos no poste? Parece mais um efeito colateral da projeção usada do que um bug.
Lynxlynxlynx

5
Na sua foto, parece que você tem sua geometria no EPSG: 4326. A Antártica é mais adequada a uma projeção estereográfica polar como EPSG: 3031. Mesmo assim, parece que você precisará lidar com uma linha de corte para o mastro e para trás, ao longo da linha de data.
perfil completo de Toby Speight

Respostas:


3

Como sugerido em um dos comentários, primeiro eu transformaria a geometria de entrada em uma projeção estereográfica polar.

Além disso, convém usá ST_Buffer-lo (com uma quantidade de 0) para se livrar da linha de corte resultante.

Portanto, isso obteria o resultado desejado:

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

Observe que esta consulta pressupõe que haja apenas uma linha na line_sample_testtabela; portanto, ajuste conforme necessário para seus dados reais de entrada.


Eu não sabia o ST_Buffer(geom, 0)truque para eliminar a linha de corte - isso é útil!
perfil completo de Toby Speight
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.