为什么 ST_Equals 对于相同的几何 returns 错误?
Why ST_Equals for same geometries returns false?
为什么 ST_Equals 用于相同的对象(一个来自几何列,另一个来自从同一几何列提取的 geojson)returns 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
st_asGeoJson 默认将坐标小数位数减少到 9 位。如果源几何有更多数字,则转换后的几何因此不同。
几何也使用双精度保存,有 15 位有效数字。如果您的数据(输入)较少,剩余的数字仍会被设置,但可以被视为噪音......但是这种噪音是 exported/imported 回来的,并且可能与输入略有不同。
克服此问题的最简单方法是 snap 将坐标设置为网格,其大小为您的输入精度。您应该在源几何体上进行捕捉(将数据添加到数据库时),以及在读取 geojson
时
st_equals(ST_SnaptoGrid(geom,5),ST_SnaptoGrid(st_setsrid(st_geomfromgeojson(st_asgeojson(ST_SnaptoGrid(geom,5))), 2180),5))
为什么 ST_Equals 用于相同的对象(一个来自几何列,另一个来自从同一几何列提取的 geojson)returns 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
st_asGeoJson 默认将坐标小数位数减少到 9 位。如果源几何有更多数字,则转换后的几何因此不同。
几何也使用双精度保存,有 15 位有效数字。如果您的数据(输入)较少,剩余的数字仍会被设置,但可以被视为噪音......但是这种噪音是 exported/imported 回来的,并且可能与输入略有不同。
克服此问题的最简单方法是 snap 将坐标设置为网格,其大小为您的输入精度。您应该在源几何体上进行捕捉(将数据添加到数据库时),以及在读取 geojson
时st_equals(ST_SnaptoGrid(geom,5),ST_SnaptoGrid(st_setsrid(st_geomfromgeojson(st_asgeojson(ST_SnaptoGrid(geom,5))), 2180),5))