4 votos

Calculando la distancia entre un punto y la línea más cercana, PostGIS

Tengo que agregar una columna a mi tabla de puntos almacenando la distancia (metros) entre cada punto y la línea más cercana. Ambos están en el mismo sistema de coordenadas proyectadas. ¿Cómo puedo hacerlo? He intentado esto pero no funciona:

ALTER TABLE st09_2019_01 ADD coast_dist_M float8;
INSERT INTO st09_2019_01 (coast_dist_M)
VALUES
(SELECT ST_Distance(st09_2019_01.geom, coastline_ln.shape)
FROM st09_2019_01, coastline_ln
ORDER BY ST_Distance(st09_2019_01.geom, coastline_ln.shape)
LIMIT 1)

5voto

mathieu Puntos 53

No puedes INSERTAR en columnas, solo añadir filas a la tabla.

En su lugar, ejecuta un UPDATE:

UPDATE st09_2019_01 AS pt
  SET  coast_dist_m = (
    SELECT ST_Distance(pt.geom, ln.shape)
    FROM   coastline_ln AS ln
    ORDER BY
           pt.geom <-> ln.shape
    LIMIT  1
  )
;

Relacionado:

Información adicional sobre (espacial) (K)NN y el operador <->:

0 votos

¿Qué significa <->?

0 votos

@BERA ¡ja! Te lo diré; si prometes por el dios del conocimiento en cascada que no se lo dirás a nadie, puedes echarle un vistazo a los enlaces súper secretos en la respuesta.

1voto

cmaglie Puntos 11

Ambas tablas necesitan un id. El término "&& ST_Expand(p.geom, 10000))" establece el tamaño de la ventana para el cálculo de la distancia (10km). Puedes cambiarlo o quitarlo. Este código calculará la distancia mínima entre cada punto en st09_2019_01 y el punto más cercano en una característica en la capa coastline_ln.

update st09_2019_01 set coast_dist_M = tmp1.distance from (select tmp.pid, min(ST_distance(ST_closestpoint(tmp.r_geom, tmp.p_geom),tmp.p_geom)) as distance from (select p.id pid, r.id rid, p.geom p_geom, r.geom r_geom from st09_2019_01 as p, coastline_ln as r where ST_closestpoint(r.geom,p.geom) && ST_Expand(p.geom, 10000)) as tmp group by pid ) tmp1 where tmp1.pid=st09_2019_01.id;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X