简体   繁体   English

为什么相同几何的 ST_Equals 返回 false?

[英]Why ST_Equals for same geometries returns false?

Why ST_Equals for same objects (one from geometry column and another from geojson extracted from the same geometry column) returns false?为什么相同对象的ST_Equals (一个来自几何列,另一个来自从同一几何列提取的 geojson)返回 false?

Ex.:前任。:

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

Definition of column geom is:几何的定义是:

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

EDIT:编辑:

Query with st_asgeojson(geom, 999999999) also not working使用 st_asgeojson(geom, 999999999) 查询也不起作用

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

EDIT2:编辑2:

Reproducible example:可重现的例子:

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 reduces coordinates decimals to 9 digits by default. st_asGeoJson 默认将坐标小数减少到 9 位。 Should the source geometry have more digits, the transformed geometry is therefore different.如果源几何具有更多数字,则转换后的几何因此不同。

Also geometries are saved using double precision, with 15 significant digits.几何图形也使用双精度保存,有效数字为 15。 If your data (input) has less, the remaining digits are still set but can be considered as noise... however this noise is exported/imported back, and can be slightly different than the input.如果您的数据(输入)较少,剩余的数字仍然被设置,但可以被视为噪声......但是这种噪声被导出/导入回来,并且可能与输入略有不同。

The simplest to overcome this is to snap the coordinates to a grid, whose size is your input precision.最简单的解决方法是将坐标捕捉到网格,其大小是您的输入精度。 You should do the snap on the source geometry (when adding the data to your DB), and when reading the geojson您应该在源几何体上进行捕捉(将数据添加到数据库时)以及读取 geojson 时

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM