Postgis空间查询

问题描述

我正在尝试创建一个查询,该查询将返回不与直线相交的点的列表。在大多数情况下,它运行良好且非常快。但是我想知道最近的线有多远。

我尝试使用st_distance函数,但是它返回null。有人有任何提示或指导来帮助我解决这个问题吗?

到目前为止,这是我的sql语句:

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');

解决方法

我相信您正在寻找子查询:

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');

此查询应返回所有点和线相交的记录,并且还将返回距离到最近的线。

,

因此,一个多小时后,我决定中止尝试另一种方法。 相反,我创建了两个视图:

create view pylon_temp as SELECT p.objectid,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','544');
create view pylon_errors as
select p.objectid,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.geom
order by distance desc;

这可能不是解决问题的最优雅的方法,但是它非常快,我可以在Web应用程序/ GIS应用程序中使用该视图。