【问题标题】:Why ST_Equals for same geometries returns false?为什么相同几何的 ST_Equals 返回 false?
【发布时间】:2020-05-06 09:12:45
【问题描述】:

为什么 ST_Equals 对于相同的对象(一个来自几何列,另一个来自从同一几何列提取的 geojson)返回 false?

例如:

select st_equals(geom, st_setsrid(st_geomfromgeojson(st_asgeojson(geom)), 2180)) from city

geom的定义是:

ALTER TABLE city ADD COLUMN geom geometry(MultiPolygon,2180);

编辑:

使用 st_asgeojson(geom, 999999999) 查询也不起作用

select st_equals(geom, st_setsrid(st_geomfromgeojson(st_asgeojson(geom, 999999999)), 2180)) from city

EDIT2:

可重现的例子:

SELECT st_equals(geom, st_setsrid(st_geomfromgeojson(st_asgeojson(geom, 999999999)), 2180))
FROM
  (SELECT st_geomfromewkb(decode('AQYAACCECAAABAAAAAEDAAAAAQAAAAsAAAAPqGkZxtsfQR+Tq/icNydBNwTIEZsUIEF/uKr0AfIm
QTsvQxUcvB9Bdw1O9C7IJkEVnpoEBD0fQcFK5/MexSZBwMHT9KXEHkFNt8zxIdwmQezy8+91nx5B
JW6L+tkeJ0G68RXtlYkeQdnY3QSabSdB7MjG/EsBH0FuiKD6qpQnQczdMBNOrB9BK783BvmeJ0GO
URITcx4gQbSMcQaieSdBD6hpGcbbH0Efk6v4nDcnQQEDAAAAAQAAAAUAAABERDkK5GcfQdNUQuem
ZCZBkJbI/psQH0FUMIjfsikmQQDtYP3jBR9BVr0n5jpcJkHS02H+iw0fQQL74OyGjyZBREQ5CuRn
H0HTVELnpmQmQQEDAAAAAQAAAAUAAAAkHKMesHYgQTy3RfkU7iZBi9UrHiJzIEG7SVjr0oMmQR/r
kBTaKSBBH3xW6YJ0JkHnHCARmg8gQbVkpO76nCZBJByjHrB2IEE8t0X5FO4mQQEDAAAAAQAAAAUA
AAA8b3IhIIwgQcCpIQq1bidBINh3JxC6IEFwnmYBGSwnQYN91h44eCBB6PT+/2AhJ0HeIjUWYDYg
QQi4hQfNWidBPG9yISCMIEHAqSEKtW4nQQ==', 'base64')) geom) a

【问题讨论】:

    标签: sql postgresql gis postgis


    【解决方案1】:

    st_asGeoJson 默认将坐标小数减少到 9 位。如果源几何有更多的数字,那么转换后的几何就会不同。

    几何图形也使用双精度保存,有效数字为 15。如果您的数据(输入)较少,剩余的数字仍然设置但可以被视为噪声......但是这种噪声被导出/导入回来,并且可能与输入略有不同。

    解决这个问题的最简单方法是将snap 坐标转换为网格,其大小是您的输入精度。您应该在源几何体上进行捕捉(将数据添加到数据库时)以及读取 geojson 时

    st_equals(ST_SnaptoGrid(geom,5),ST_SnaptoGrid(st_setsrid(st_geomfromgeojson(st_asgeojson(ST_SnaptoGrid(geom,5))), 2180),5))
    

    【讨论】:

    • 我知道,但几何没有更多的数字,我也尝试使用函数 st_asgeojson(geom, 999999999) 提取几何,但仍然无法正常工作。
    • @TarasMelon 有一个可重现的例子会有所帮助。不要忘记坐标被保存为不精确的浮点数。所以即使你没有设置它们,仍然可以在小数中找到噪音
    • 请参阅EDIT2,我添加了一个可重现的示例@JGH
    • @TarasMelon 使用超过 15 个有效数字是没有意义的。查看使用 st_SnapToGrid 的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2014-11-17
    • 2014-03-11
    • 2019-07-12
    • 2012-08-24
    • 2013-03-08
    相关资源
    最近更新 更多