【问题标题】:PostGIS: Two equal geometries are not equal?PostGIS:两个相等的几何图形不相等?
【发布时间】:2020-12-21 12:21:51
【问题描述】:

我在不同的表中有两个几何图形,它们看起来相同,但一个有效,另一个无效。我查了一下:

select  ST_IsValid(_s.geom) as _gvalid, 
        ST_IsValid(s.geom) as gvalid,
        _s.geom = s.geom as  geom_bin_equal, 
        ST_SRID(_s.geom)=ST_SRID(s.geom) as srid_equal, 
        ST_EQUALS(_s.geom, s.geom), 
        ST_AsText(_s.geom) = ST_AsText(s.geom) as text_equal 
from _spatial_object _s, spatial_object s
where _s.id_spatial_object = 314 and s.id_spatial_object = 314

在这里输出:

这到底是怎么回事?

实际上,这两个几何图形都应该是无效的(内部在点 58.182000000000002 51.457000000000001 或附近断开)

几何:

POLYGON((58.169 51.456,58.176 51.458,58.18 51.458,58.182 51.457,58.183 51.456,58.182 51.453,58.184 51.451,58.182 51.449,58.183 51.448,58.181 51.445,58.179 51.443,58.177 51.444,58.179 51.445,58.178 51.446,58.178 51.448 ,58.178 51.448,58.177 51.448,58.173 51.447,58.17 51.449,58.173 51.45,58.174 51.451,58.178 51.451,58.178 51.452,58.178 51.452,58.176 51.452,58.173 51.451,58.169 51.456),(58.169 51.456,58.1732222222222 51.4569444444444,58.182 51.457,58.169 51.456 ))

select ST_ISValid(geom), ST_IsValid(ST_GeomFromText(ST_AsText(geom))) from _spatial_object

输出

真假

【问题讨论】:

  • 根据经验,永远不要使用无效的几何图形,因为某些(大多数?)函数会返回不可靠的结果。
  • 您使用的是哪个版本的 PostGIS? 2.4版=changed的定义(从边界框相等到完全相等)
  • @JGH POSTGIS="2.1.8 r13780" GEOS="3.5.0-CAPI-1.9.0 r4090" PROJ="Rel. 4.8.0,2012 年 3 月 6 日" GDAL="GDAL 1.11 .1,发布于 2014 年 9 月 24 日" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER
  • 啊,那就这样吧,我加个答案
  • 我主要担心的是验证给出了错误的结果

标签: postgresql geometry postgis


【解决方案1】:

在 2.4 版之前,使用 = 的相等性仅依赖于边界框比较,因此两个非常不同的几何图形仍然可以被视为相等。

使用ST_Equals 时,两个几何图形必须“看起来”相同(但顶点顺序无关紧要)。但是,文档指出

[重要]

如果任一几何无效,此函数将返回 false,除非 在它们二进制相等的情况下。

但也提到了

已更改:2.2.0 即使是无效几何也返回 true,如果它们是 二进制相等

所以因为你使用的是旧版本,所以结果不可靠/错误。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多