首页 > 解决方案 > 使用带有 postgis 的 ST_Intersection 的错误结果

问题描述

我正在尝试与 postgis 做一个简单的交集,但我得到的结果是错误的。在地图项的开始处缺少约 7 米的线段。

这是我用于交集的 sql 命令:

select ST_Intersection(t2.wkb_geometry,
                     t1.wkb_geometry), t2.sde_id as s_sde, t2.mtb_id,
ST_Length(ST_Intersection(t1.wkb_geometry,t2.wkb_geometry))
from
public.mountainbike_pavement_temp2 t1 inner join public.mountainbike_strecken_temp2 t2 on
t1.wkb_geometry && t2.wkb_geometry;

结果长度应该是187米左右,但结果长度只有180米左右。我已经尝试了很多,但我找不到任何原因,为什么会发生这种情况,以及如何解决它。

当我在 ArcGis 中进行此交集时,一切都按预期进行。

我用 postgres 9.6.15 和 postgis 2.4 试过这个

并且还与

postgres 12.1 和 postgis 3.0,结果相同。

表格和数据可以在这里找到:

https://pastebin.com/4vHqRYx5

https://pastebin.com/RAfzXXW6

表名:mountainbike_pavement_temp2 public.mountainbike_strecken_temp2

从 mountainbike_pavement_temp2 到 mountainbike_strecken_temp2 的第一个顶点的距离都是 0,用 postgis 中的 ST_Distance 计算(见下面的评论)。所以我会假设,有一个交叉点。

在此处输入图像描述

标签: postgresqlgeometrypostgisintersection

解决方案


问题是pavement线条与线条不完全重合strecken。具体来说,它们包含一个POINT ( -43663.049707713886 245429.5072260416 )不在线strecken串上的顶点。这意味着交点不包括strecken线的整个长度。

下图显示了这一点(放大了点位置以显示差异)。 pavement是红色的,strecken是蓝色的。

这可能在 ArcGIS 中有效,因为它在计算交点时可能会使用一些捕捉启发式。

在此处输入图像描述


推荐阅读