Задать вопрос
@victor-ponamariov

Как узнать регион по широте и долготе?

У меня есть координата нахождения пользователя и мне по ней нужно узнать к какому региону РФ принадлежит эта точка. Как это сделать проще всего?

Плюс мне нужно в зависимости от региона прикрутить логику. То есть, у меня будет таблица в БД со всеми регионами, и к каждому дополнительная инфа, которой я потом воспользуюсь.

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

Посоветовали посмотреть в сторону OpenStreetMaps, но остановился на том что pear install http_request2 не устанавливается на homestead-е, на котором у меня проект, а эта зависимость нужна https://github.com/pear/Services_Openstreetmap/

В общем, не совсем знаю в какую сторону рыть: чтобы было быстро, без гемора и правильно :)
  • Вопрос задан
  • 917 просмотров
Подписаться 2 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 3
shurshur
@shurshur
Сисадмин, просто сисадмин...
1. Качаем local.osm.pbf с gis-lab

2. Извлекаем границы:

mkdump:
spoiler
osmosis \
  --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:
spoiler
node,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. Теперь можно запросом выяснить принадлежность любой точки:

spoiler
local=> 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)


Если данные загрузить в ту же базу - то можно одним запросом извлекать данные, принадлежащие нужной области.
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Запросом к API Яндекс Карты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы