Доброго времени суток.
Имеется база openstreetmap одной страны. Как узнать город(не поселок, область, а именно город) из координаты lat long в postgres-postgis?
Api никакого нет(nominatim не пойдет), собираюсь писать свою прослойку. БД состоит из таблиц: line, nodes, point, polygon, rels, roads, ways с префиксом planet_osm.
я могу узнать область по координате, а вот как сделать в одном запросе чтобы город выдавало - непонятно.
К примеру:
select name, admin_level,place from planet_osm_polygon
INNER JOIN (SELECT ST_TRANSFORM(ST_SetSRID(ST_POINT(51.521120,47.400039), 4326), 3857) AS point ) AS p
ON ST_Within(point, way)
Выдаст "Атырауская область", но города Атырау нет в результате. Если поставить координату 51.883669,47.108317, то можно сделать выборку по place = 'city', только вот для предыдущей координаты результат пустой.
Oleg: тогда я вас очень очень огорчу (сам уже прошел этот путь)
Текущие данные в базе сырые и без индексации. Быстро и эффективно искать не получится.
Если хочется делать по нормальному, то придется запустить индексацию через nominatin/osm2pgsql, которая создаст новую структуру (старые таблицы можно будет удалить), где все объекты проиндексированы и легко найти что угодно и где угодно
Fixid: импорт в postgres делал именно через osm2pgsql. Теперь нужно делать индексацию? были ворнинги на индексацию при импорте, но их никак решить не удалось. На счет place - понял.
Oleg: индексация обычно делается автоматически сразу после импорта, рекомендую взять nominatim с гита и импортировать базу с помощью него, апач и прочее ставить не обязательно. Там есть правильные бинарники osm2pgsql
Индексация может занимать очень очень много времени (до месяца). Но если это только одна страна и есть 4 нормальных ядра и ssd, то хватит и 3-4 часа
Oleg: там уже искать будет очень просто, placex будет каталогом с полигонами и названиями городов. Если что, то там будут импортированы функции мультиязыкового поиска с приоритетом