Estou usando o Postgis para:
- calcule a distância acumulada em metros ao longo da linha
- armazene a distância acumulada em "m"
Eu tenho uma tabela com pontos nesta linha e cada linha contém coordenadas lat e lon. O valor "m" é 0 para todas as linhas.
O código a seguir me dá bem a distância entre o primeiro ponto e o próximo.
SELECT a.geom
FLOOR(
ST_Distance(ST_Transform(a.geom, 3857), ST_Transform(b.geom, 3857)) * cosd(42.3521))
AS dist
FROM line a
LEFT JOIN line b
ON a.id = b.id + 1
no entanto, não soma um total nem atualiza o valor "m" ainda.
Eu tentei um conjunto de permutações do seguinte, mas nenhum deles armazena uma soma cumulativa do valor da linha anterior para "m" mais o cálculo da distância entre este ponto e o anterior.
WITH next AS (
SELECT
ST_Distance(ST_Transform(a.geom, 3857), ST_Transform(b.geom, 3857)) * cosd(42.3521)
AS dist,
a.id AS rowid,
FROM line a
JOIN line b
ON a.id = b.id + 1
)
UPDATE line a
SET m = FLOOR(next.m + next.dist)
FROM next
WHERE a.id = next.rowid
RETURNING a.m, next.dist;
ou
update line a
set m = FLOOR(a.m + prev.dist)
from (select
l.*,
ST_Distance(ST_Transform(
lag(geom) over (order by l.id asc)
, 3857), ST_Transform(geom, 3857)) * cosd(42.3521) as dist
from line l
) AS prev
where prev.id = a.id - 1
returning prev.m, prev.dist, a.m
Alguma ideia?
Brincar
cosd()
é bobagem, especialmente quando você não sabe a latitude real. ST_Distance pode calcular o valor desejado diretamente se você fornecer valores geográficos; se você tiver geometrias lon/lat, você pode simplesmente lançá-las.Para somar os comprimentos passo a passo, use um CTE recursivo: