получить название города по широте и долготе из данных OSM, хранящихся в Postgres

Я знаю, что есть много похожих вопросов, но после долгого поиска ни один из них не помог мне, поэтому я публикую,

Я хочу получить название города с широтой и долготой из таблицы planet_osm_polygon, где хранятся многоугольники, включая многоугольники городов, вот мой код:

SELECT name
  FROM planet_osm_polygon
  where place = 'city'
 and ST_CONTAINS(ST_Transform(way,4326), ST_SetSRID(ST_Point(41.693459100461496,44.8014495),4326));

(логика такая ... если многоугольник содержит заданную точку, вернуть ее имя, если это город)

В чем проблема? Я преобразовал обе геометрии в 4326, но все еще не работал. P.S "путь" - это столбик геометрии (многоугольник).

Запрос всегда возвращает пустой результат

Изменить

Город не пропущен в planet_osm_polygon, и его столбец геометрии действительно является типом многоугольника, вот некоторые результаты запроса:

Запрос городов

В программе просмотра геометрии это выглядит правильно


person Martian    schedule 07.01.2020    source источник
comment
Я не очень хорошо знаком со структурой базы данных. Узел города openstreetmap.org/node/1614277087, вероятно, не содержится в planet_osm_polygon, поскольку это узел, а не многоугольник. Или это должно возвращать соответствующее отношение openstreetmap.org/relation/1996871?   -  person scai    schedule 07.01.2020
comment
Можете ли вы поделиться 1) образцами данных, 2) полученной ошибкой и 3) ожидаемым результатом?   -  person Jim Jones    schedule 07.01.2020
comment
@scai, спасибо, что нашли время мне помочь, я обновил пост и добавил еще несколько деталей.   -  person Martian    schedule 07.01.2020
comment
@JimJones, я обновил пост, зацените   -  person Martian    schedule 07.01.2020
comment
@Martian, было бы неплохо увидеть геометрию в более удобном формате, например. WKT SELECT name,ST_AsText(way) FROM planet_osm_polygon - и, пожалуйста, опубликуйте результат в виде текста, а не в виде скриншота :)   -  person Jim Jones    schedule 07.01.2020


Ответы (1)


Я считаю, что вы переключаете x и y в своих парах координат. WGS84 ожидает longitude, latitude, а не наоборот:

SELECT name
FROM planet_osm_polygon
WHERE place = 'city'
AND ST_Contains(ST_Transform(way,4326), ST_SetSRID(ST_MakePoint(44.80,41.69),4326));

На заметку: подумайте об уменьшении точности ваших координат. С таким количеством десятичных чисел вы попадаете в сферу микроскопии -> 41.693459100461496

Образец данных

CREATE TEMPORARY TABLE planet_osm_polygon (name TEXT, way GEOMETRY,place TEXT);
INSERT INTO planet_osm_polygon 
VALUES ('Georgia',ST_SetSRID('POLYGON((43.87 42.22,45.43 42.22,45.43 41.50,43.87 41.50,43.87 42.22))'::GEOMETRY,4289),'city');

Координаты соответствуют следующему BBOX в SRS 4289:

введите здесь описание изображения

Запрос - точка внутри BBOX, установка либо BBOX и заданная точка на WGS84

SELECT name
FROM planet_osm_polygon
WHERE place = 'city'
AND ST_Contains(ST_Transform(way,4326), ST_SetSRID(ST_MakePoint(44.80,41.69),4326));

  name   
---------
 Georgia
(1 Zeile)

введите здесь описание изображения

person Jim Jones    schedule 07.01.2020
comment
да, я копировал - вставлял координаты из карт Google для тестирования и забыл переключить координаты, спасибо. - person Martian; 07.01.2020