python
February 25

Получение адреса по координатам с помощью Python

Получение адреса по координатам, довольно полезная функция, которую можно использовать в различных целях. Например, вам скинули геолокацию. Можно сделать телеграм-бота, отправить ему полученные данные и в ответ получить адрес. Данный функционал можно реализовать на Python. Давайте посмотрим, как это можно сделать.

Для получения адреса по геолокации будем использовать библиотеку geopy. В ней реализованы классы для работы с сервисами геокодирования, такими как OpenStreetMap Nominatim, Google Geocoding API (V3) и многими другими. В нашем коде мы будем использовать OpenStreetMap, так как его использование бесплатно и не требует получения дополнительных ключей.

Установка библиотеки

Для установки библиотеки пишем в терминале команду:

pip install geopy

Импорт модулей в скрипт

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

from geopy.exc import GeocoderUnavailable
from geopy.geocoders import Nominatim

Получаем адрес по координатам. Обратное геокодирование

Создадим функцию get_addr(location: list) -> str, которая на входе получаем широту и долготу в виде списка, а возвращает адрес в виде строки. В случае ошибки будет возвращен текст «Unknown».

def get_addr(location: list) -> str:
    try:
        geo_loc = Nominatim(user_agent="GetLoc")
        loc_name = geo_loc.reverse(location)
        return loc_name.address
    except GeocoderUnavailable:
        return 'Unknown'

После этого инициализируем класс Nominatim и передаем в него user_agent. Здесь использование какого-то специализированного агента не принципиально и можно просто передать «GetLoc». Если мы заглянем в параметры данного класса, то увидим, что в него, кроме user_agent можно передать таймаут, прокси и еще множество других параметров, которые в данном случае не принципиальны.

Обратимся к инициализированному классу и его методу reverse, в который передадим координаты в виде списка с широтой и долготой. В ответ мы получим адрес, который и возвратим из функции, обратившись к методу address.

Запрос координат у пользователя. Вывод полученного адреса в терминал

Создадим функцию main(), в которой будем запрашивать широту и долготу у пользователя. После передадим их в функцию get_addr и выведем полученный результат в терминал. Здесь необходимо немного обработать полученные данные, так как они возвращаются в обратном порядке, начиная с номера дома и заканчивая страной. Поэтому, добавлена обратная сортировка, разбиение строки по запятой в список и обратное его объединение.

def main() -> None:
    latitude = input("Введите широту: ")
    longitude = input("Введите долготу: ")
    print(",".join(reversed(get_addr([latitude, longitude]).split(","))).strip())


if __name__ == "__main__":
    main()

Тестирование функции

Протестируем написанный код. Возьмем произвольные координаты объекта с Яндекс.Карты и введем в запросе скрипта. В ответе мы видим полученный адрес, который совпадает с тем, что указан на Картах.

Итог

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

Наш телеграм канал с бесплатными курсами по программированию и полезными статьями, подпишись!