Использую базу
geonames.
Нужно по координатам пользователя находить ближайший город. Для этого я залил все города в mongodb и создал географический индекс. Возникла проблема: по точке, находящейся на севере Санкт-Петербурга находится ближайшая точка - посёлок Бугры (пригород питера), потому что точка ближе к пригороду, чем к центру питера.
В базе geonames есть также районы города (с координатами), если я ищу также по ним, то находится к моей точке ближе находится район "Гражданка", который является районом питера, и это увеличило бы точность определения города до необходимой мне, но проблема в том, что в базе geonames он почему то указан как район посёлка Бугры. Такая же проблема с другими районами питера, они в базе почему-то указаны как районы других пригородов. Есть мнение, что такая же проблема и с районами других городов.
Сейчас я вижу два варианта решения проблемы:
1) выкачать базу
osm и вытащить из неё координаты границ всех городов.
2) используя api osm пройтись по базе районов (около 100к) в geonames и исправить привязку районов к городам (по координатам района из базы geonames получить город в osm)
Использовать всегда чужое апи (osm, googlemaps) для геокодинга не хочется, потому что ожидается большая нагрузка, а самые лучшие условия - это 1 запрос в секунду в у osm (а у гугла только 2500 запросов в день).
Установить на сервере
Nominatim не вариант, потому что у него слишком большие требования (сотни гигабайт на жёстком диске и десятки гигабайт оперативной памяти), а мне со всей этой базы нужны только границы городов, мне не нужны улицы, дома и дороги и т.д.
Какие есть ещё варианты?