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: .
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?
fonte
Respostas:
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 de0
) para se livrar da linha de corte resultante.Portanto, isso obteria o resultado desejado:
Observe que esta consulta pressupõe que haja apenas uma linha na
line_sample_test
tabela; portanto, ajuste conforme necessário para seus dados reais de entrada.fonte
ST_Buffer(geom, 0)
truque para eliminar a linha de corte - isso é útil!