【问题标题】:Postgis Spatial QueryPostgis 空间查询
【发布时间】:2020-08-11 13:04:10
【问题描述】:

我正在尝试创建一个查询,该查询将返回不与线相交的点列表。在大多数情况下,它工作得很好而且非常快。不过我想知道最近的线路有多远。

我尝试使用 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');

【问题讨论】:

  • 您好,您能提供一些数据样本吗?
  • 首先,st_distance 返回null,因为你的左连接返回所有的null 记录。此外,您正在将所有几何转换为地理,这会减慢速度。你会用地理吗?

标签: sql postgresql postgis


【解决方案1】:

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

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

这个查询应该返回点和线相交的所有记录,它还会返回到最近线的距离。

【讨论】:

  • 吉姆,谢谢您的回复。我目前正在运行此查询,并且需要很长时间。我有 381980 个线串和 145020 个点。所以子查询真的让一切都变慢了。
  • @SteveWeeks 我也怀疑过。对于大桌子,这真的应该花点时间。如果您不处理动态数据:您可以选择计算这些值并将其预先存储在列中吗?
  • 吉姆,数据每天更新。如果查询完成,我将让查询运行并稍后再次评论。感谢您的帮助和建议。
  • 我认为 SELECT DISTINCT ON 可能比子查询方式更快,但我们可能需要找到一种方法来停止获取最近的相交线...
【解决方案2】:

所以一个多小时后,我决定中止并尝试不同的方法。 相反,我创建了两个视图:

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;

这可能不是最优雅的方式,但它非常快,我可以在我的网络应用程序/GIS 应用程序中使用视图。

【讨论】:

  • 您可以在第二个视图中选择不同的(p.objectid)objectid(其他列)而不是group by pylon_temp p, vo_line l order by p.objectid, st_distance(p.geom ::geography, l.geom::geography)
  • 最近的线也可能是与另一点相交的线。我不知道这是否是一个问题。
  • @mlinth 我尝试了你的方法,与我创建的第二个视图相比它太慢了。最好优化第一个 sql 查询,这样我就不必创建两个视图了。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 2018-11-20
  • 2013-10-14
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多