使用 ST_Intersection 与 postgis 的错误结果

Wrong result using ST_Intersection with postgis

我想用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计算(见下面的注释)。所以我假设,有一个交叉点。

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

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

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