1. Качаем local.osm.pbf с
gis-lab
2. Извлекаем границы:
mkdump:
spoilerosmosis \
--rb file=local.osm.pbf \
--tf accept-relations boundary=administrative --uw --un \
outPipe.0=rels \
\
--rb file=local.osm.pbf \
--tf accept-ways boundary=administrative --un \
outPipe.0=ways \
\
--merge \
inPipe.0=rels \
inPipe.1=ways \
\
--wb file=local-bounds.osm.pbf
3. Загружаем границы в postgis:
Файл стиля adm.style:
spoilernode,way name:ru text linear
node,way name:en text linear
node,way alt_name text linear
node,way alt_name:ru text linear
node,way official_name text linear
node,way admin_level text linear
node,way boundary text linear
node,way name text linear
node,way ref text linear
node,way place text linear
Загрузка данных (в базу с именем local, префикс таблиц adm_):
osm2pgsql -d local local-bounds.osm.pbf -S adm.style -s -p adm --multi-geometry
4. Теперь можно запросом выяснить принадлежность любой точки:
spoilerlocal=> select osm_id,name,boundary,admin_level from (select ST_Transform(ST_SetSRID(ST_MakePoint(37.6,55.6),4326),3857) as point) a,adm_polygon b where a.point && b.way and ST_Within(a.point,b.way) and boundary='administrative' order by admin_level::INT asc;
osm_id | name | boundary | admin_level
----------+-------------------------------+----------------+-------------
-1029256 | Центральный федеральный округ | administrative | 3
-102269 | Москва | administrative | 4
-1282181 | Южный административный округ | administrative | 5
-950664 | район Чертаново Южное | administrative | 8
(4 rows)
Если данные загрузить в ту же базу - то можно одним запросом извлекать данные, принадлежащие нужной области.