【发布时间】: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,结果相同。
表格和数据可以在这里找到:
表名: 山地自行车路面温度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