Использование обратной функции с преобразованием геометрии в координаты приводит к смешанной ошибке SRID

#postgresql #postgis

#postgresql #postgis

Вопрос:

Я использую postgres с расширением postig. У меня есть координаты, которые я ввел в следующую функцию postgis:

 select ST_SetSRID(ST_point(18.533935546875, 48.23199134320962),4674) 
  

В результате я получаю тип геометрии: 01010000204212000000000000B08832402D0570E4B11D4840

Когда я хочу выполнить обратное действие

 select st_x(st_transform(way,4326)), st_y(st_transform(way,4326)) from planet_osm_point where way ='01010000204212000000000000B08832402D0570E4B11D4840'
  

Я получаю ошибку:

 ERROR:  Operation on mixed SRID geometries
********** Error **********
ERROR: Operation on mixed SRID geometries
SQL state: XX000
  

В чем может быть проблема?

Ответ №1:

Проблема несколько описана в сообщении об ошибке: вы пытаетесь найти одинаковые геометрии в planet_osm_point.way , но они имеют другой SRID, чем 4674. Фактически это:

 SELECT ST_SetSRID(ST_Point(0, 0), 4674) = ST_SetSRID(ST_Point(0, 0), 4326);
  

Поэтому вам нужно будет выбрать общий SRID и преобразовать один в другой, т.Е.

 SELECT ST_SetSRID(ST_Point(0, 0), 4674) =
                      ST_Transform(ST_SetSRID(ST_Point(0, 0), 4326), 4674);
  

за исключением того, что я не рекомендую использовать =(geometry, geometry) оператор, поскольку он требует идентичной геометрии, что не очень часто встречается с ошибками с плавающей запятой после преобразования.

Лучший подход — найти все way геометрии с небольшим пределом погрешности, используя ST_DWithin:

 select st_x(st_transform(way,4326)), st_y(st_transform(way,4326))
from planet_osm_point
where ST_DWithin(
         way,
         ST_Transform(
           ST_SetSRID(ST_Point(18.533935546875, 48.23199134320962), 4674),
           <way_SRID>),
         1e-6);
  

Здесь он преобразует точку в SRID way (вы никогда не указывали, поэтому обновите <way_SRID> ), затем найдите что-нибудь на расстоянии 1e-6 градусов (около 10 см). Увеличьте его, если хотите собрать больше близлежащих way точек.