#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
точек.