Чтобы получит полигоны городов из OpenStreetMap можно воспользоваться overpass-turbo.eu (api сайта заблокирован, используйте VPN)
Запрос для Московской области:
[out:xml];
area
(area.region)
["boundary"="administrative"]
["name"="Московская область"]
->.a;
(
node
(area.a)
["place"~"city|town"];
way
(area.a)
["place"~"city|town"];>;
relation
(area.a)
["place"~"city|town"];>;
)->.b;
.b out meta qt;
Результат можно экспортировать в geojson. Эти данные о полигонах
загружать в свою базу и там искать.
Ограничения бесплатного сервера не позволят сделать запрос на всю страну, континент, планету.
Для этого нужно арендовать сервер, установить в него
докер Overpass, импортировать данные
OpenStreetMap для планеты или
меньших частей и уже свой сервер нагружать запросами.
Если требуется искать ближайший центр населённого пункта, то
есть ответ на похожий вопрос. Это
задача поиска ближайшего соседа. Есть готовые
архивы с координатами населенных пунктов.