【问题标题】:Wrong result using ST_Intersection with postgis使用带有 postgis 的 ST_Intersection 的错误结果
【发布时间】:2020-02-19 10:40:38
【问题描述】:

我正在尝试与 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

表名: 山地自行车路面温度2 public.mountainbike_strecken_temp2

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

【问题讨论】:

  • 您可以添加您从查询中获得的确切结果集吗?
  • 您能补充一下您是如何在 ArcGIS 中计算此长度的吗?可能是您使用不同的参考系统吗?在 WGS84 和 geography 中使用 geometry 我无法获得您期望的值,但是 ~180
  • 参考系统始终相同,EPSG:31254。
  • 当我在一个几何图形周围只使用一点缓冲区时,我得到了正确的交集(您可以在两个字段中看到不同的长度):select ST_Intersection(ST_Buffer(t2.wkb_geometry, 0.00001), t1.wkb_geometry), t2.sde_id as s_sde, t2.mtb_id, ST_Length(ST_Intersection(ST_Buffer(t2.wkb_geometry, 0.00001), t1.wkb_geometry)), 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;
  • 这很奇怪。难道他们在这最后的 7m 中确实没有重叠吗?使用缓冲区,预计将找到与它重叠的任何内容。 WITH j AS ( SELECT ST_Dump('SRID=31254;MULTILINESTRING((your very long geom))') as r ) SELECT ST_AsText((j.r).geom), ST_AsText(t2.wkb_geometry), ST_Length(ST_Intersection(t2.wkb_geometry,(j.r).geom)) FROM j, mountainbike_pavement_temp2 t2

标签: postgresql geometry postgis intersection


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的分析。您正在使用哪个程序?没有我的程序(QGis,ArcGis)我能够检测到这个差距。即使使用 postgis-database 工具,我也找不到它。我将前 15 个顶点转储到一个单独的表中,并计算了每个顶点到 mountainbike_strecken-line 的距离。输出全为 0。这是我用来计算距离的代码:select ST_Distance(t1.geom1, t2.wkb_geometry), t1.order1 from public.mountainbike_pavement_points t1 inner join public.mountainbike_strecken t2 on t2.mtb_id = 20162;
  • 你能计算出到线的距离吗?
  • @user7882389 我认为您无法解决这种差异。请务必注意,您的点具有非常高的精度。我对这个参考系统不是很熟悉,但我猜它正在进入显微镜领域;)+1 到 dr_jts 以获得详细答案!
  • 是的,我拥有的工具似乎没有解决方案。让我感到有点紧张的事实是,即使使用数据库工具,我也没有任何机会找出路面上的所有点是否与 strekcen-line 一致。
  • @user7882389 降低几何精度可能是一个好的开始。高精度的线/点的精确重叠可能会很烦人.. :)
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多