【发布时间】:2016-12-07 05:05:51
【问题描述】:
使用 Postgres 9.2
我有一个奇怪的问题。为了简化它:
我有一些带有线点的数据。有问题的查询使用 st_intersects 来确定线点是否与多边形重叠。线和多边形都以 3d 表示形式存储,z 轴为 0。这是用于地理空间数据。
在这种情况下,我有一个起点和终点是相同值的线点。两条记录的值看似相同,起点和终点的 X、Y、Z 分量相同。用=~比较两点,它们是相等的。使用 =,它们是相等的。使用 st_equals,结果为 false,但比较构成线条的组件,值似乎都相等,包括通过目测比较二进制表示。
当我执行 st_intersects(my_line, some_polygon) 时,一条记录返回 true,另一条返回 false,即使两条记录的 line 值看起来相同。我没有创建原始值,所以我不知道它们最初是如何创建的。每条记录都有一辆车,无论出于何种原因,其中一辆车的多条记录都存在此问题。
如果我将函数从 st_intersects 更改为可能更昂贵的 st_3dintersects,它们都会按预期返回 true,问题就会消失。被比较的多边形非常大,这会影响具有不同点的多个记录,因此我们不太可能遇到任何类型的边缘舍入误差。使用 st_force2d 也不起作用。
任何想法为什么我可能会看到我正在看到的行为?
这是线路的 EWKT,坐标已更改:
SRID=4326;LINESTRING(-85.6600021 30.7976979 0,-85.6600021 30.7976979 0)
两条记录的 ST_AsEWKT 值完全相同,但其中一条记录为 st_intersects(my_line, the_poly) 返回 false,另一条记录为 st_intersects(my_line, the_poly) 返回 true。即使我对 EWKT 值进行硬编码,我仍然会看到这种差异:
ST_Intersects(
ST_GeomFromEWKT('SRID=4326;LINESTRING(-85.6600021 30.7976979 0,-85.6600021 30.7976979 0)')),
x.geom
)
似乎它总是影响结果集中的第一条记录,而没有影响其他记录。如果我更改了查询中的其他所有内容,则第一条记录总是返回 false,所有后续记录返回 true。
编辑: 更多调查,似乎线串无效,开始和结束都是相同的值。铸造 st_makevalid 通过使它成为一个点来修复它。显然无效线串的评估不一致。
【问题讨论】:
-
为您要发送到
ST_Equals的两个内容提供ST_AsEWKT()。 -
你说的是什么意思当我做st_intersects(my_line, some_polygon)时,一个返回true,另一个false还有什么?
-
这对于gis.stackexchange.com 来说可能是一个更好的问题(如果需要,您可以标记它并要求将其移动)
-
我做了更多的研究,发现带有这个特定行字符串的第一条记录如果返回第一条记录,则对于 st_intersects 总是返回 false,对于所有后续记录,总是返回 true。这似乎表明它是gis中的一个错误?
-
不知道你在说什么不知道问题是什么,没有样本数据。
标签: postgresql postgis