Estoy tratando de crear una consulta que devolverá una lista de puntos que no se cruzan con una línea. En su mayor parte, funciona muy bien y muy rápido. Sin embargo, me gustaría saber a qué distancia está la línea más cercana.
He intentado usar la función st_distance pero devuelve nulo. ¿Alguien tiene algún consejo o guía para ayudarme a resolver esto?
Esta es mi declaración SQL hasta ahora:
SELECT p.objectid, p.voidentifier, p.featuretypecd, p.heightagl, st_distance(p.geom::geography, l.geom::geography), p.geom FROM vo_point p LEFT JOIN vo_line l ON ST_Intersects(p.geom, l.geom) WHERE l.featureid IS NULL and p.featuretypecd in ('537','538','540','541','542','543','544');Creo que una subconsulta es lo que estás buscando:
SELECT p.objectid, p.voidentifier, p.featuretypecd, p.heightagl, p.geom, (SELECT min(ST_Distance(p.geom::geography, l2.geom::geography)) FROM vo_line l2) FROM vo_point p LEFT JOIN vo_line l ON ST_Intersects(p.geom, l.geom) WHERE l.featureid IS NULL AND p.featuretypecd IN ('537','538','540','541','542','543','544');Esta consulta debe devolver todos los registros donde los puntos y las líneas se cruzan, y también devolverá la distancia a la línea más cercana.
Entonces, después de más de una hora, decidí abortar e intentar un enfoque diferente. En su lugar, creé dos vistas:
create view pylon_temp as SELECT p.objectid, p.voidentifier, p.featuretypecd, p.heightagl, p.geom FROM vo_point p LEFT JOIN vo_line l ON ST_Intersects(p.geom, l.geom) WHERE l.featureid IS NULL and p.featuretypecd in ('537','538','540','541','542','543','544'); create view pylon_errors as select p.objectid, p.voidentifier, p.featuretypecd, p.heightagl, min(st_distance(p.geom::geography, l.geom::geography))as distance, p.geom from pylon_temp p, vo_line l where st_dwithin(p.geom,l.geom,0.001) group by p.objectid, p.voidentifier, p.featuretypecd, p.heightagl, p.geom order by distance desc;Puede que no sea la forma más elegante de hacer esto, pero es muy rápido y puedo usar la vista en mi aplicación web/aplicaciones GIS.