Почему ST_Equals для одинаковой геометрии возвращает false? - PullRequest
0 голосов
/ 06 мая 2020

Почему ST_Equals для одних и тех же объектов (один из столбца геометрии, а другой из столбца geo json извлечен из того же столбца геометрии) возвращает 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);

EDIT:

Запрос с st_asgeo json (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

1 Ответ

2 голосов
/ 06 мая 2020

st_asGeo Json уменьшает десятичные знаки координат до 9 цифр по умолчанию. Если исходная геометрия имеет больше цифр, преобразованная геометрия будет другой.

Также геометрия сохраняется с использованием двойной точности с 15 значащими цифрами. Если ваших данных (входных) меньше, оставшиеся цифры все еще установлены, но их можно рассматривать как шум ... однако этот шум экспортируется / импортируется обратно и может немного отличаться от входного.

Самый простой чтобы преодолеть это, нужно привязать координаты к сетке, размер которой соответствует вашей точности ввода. Вы должны сделать привязку к исходной геометрии (при добавлении данных в вашу БД) и при чтении гео json

st_equals(ST_SnaptoGrid(geom,5),ST_SnaptoGrid(st_setsrid(st_geomfromgeojson(st_asgeojson(ST_SnaptoGrid(geom,5))), 2180),5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...