Определение города по координатам?

Использую базу geonames.
Нужно по координатам пользователя находить ближайший город. Для этого я залил все города в mongodb и создал географический индекс. Возникла проблема: по точке, находящейся на севере Санкт-Петербурга находится ближайшая точка - посёлок Бугры (пригород питера), потому что точка ближе к пригороду, чем к центру питера.

В базе geonames есть также районы города (с координатами), если я ищу также по ним, то находится к моей точке ближе находится район "Гражданка", который является районом питера, и это увеличило бы точность определения города до необходимой мне, но проблема в том, что в базе geonames он почему то указан как район посёлка Бугры. Такая же проблема с другими районами питера, они в базе почему-то указаны как районы других пригородов. Есть мнение, что такая же проблема и с районами других городов.

Сейчас я вижу два варианта решения проблемы:
1) выкачать базу osm и вытащить из неё координаты границ всех городов.
2) используя api osm пройтись по базе районов (около 100к) в geonames и исправить привязку районов к городам (по координатам района из базы geonames получить город в osm)

Использовать всегда чужое апи (osm, googlemaps) для геокодинга не хочется, потому что ожидается большая нагрузка, а самые лучшие условия - это 1 запрос в секунду в у osm (а у гугла только 2500 запросов в день).
Установить на сервере Nominatim не вариант, потому что у него слишком большие требования (сотни гигабайт на жёстком диске и десятки гигабайт оперативной памяти), а мне со всей этой базы нужны только границы городов, мне не нужны улицы, дома и дороги и т.д.

Какие есть ещё варианты?
  • Вопрос задан
  • 6672 просмотра
Пригласить эксперта
Ответы на вопрос 2
@ErshKUS
А требуется именно локальный поиск, может и использовать api сайта? В принципе это было бы полезно/интересно реализовать в апи OpenStreetMap.RU (совместными усилиями). Опять же, если сервак не будет держать нагрузку, развернуть тоже у себя, но там postgresql (если это проблема)
Ответ написан
Комментировать
@ashkart
Я сделал так:
1. выкачал базу OSM
2. выдрал оттуда координаты населенных пунктов и залил в "свою" базу (вк)
3. использую поиск по заданным координатам из этого руководства

Результат:
тк базы с объектами изначально разные, невозможно было получить координаты для каждого нас. пункта в моей базе из данных OSM. Из 2 млн записей с координатами у меня только 187 тыс. Задача же стояла определить предполагаемый город пользователя, так что мне этой точности оказалось более чем достаточно. Это примерно до поселка городского типа.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы