Geopy.geocoders.Nominatim.geocode: примеры (PYTHON)

Геокодирование адресов с помощью функции Nominatim.geocode в Python
Раздел: Геокодирование, Координаты
geopy.geocoders.Nominatim.geocode(query: str, exactly_one: bool=True, timeout: int=10, limit: int=None, addressdetails: bool=False, language: str=None, geometry: str=None, extratags: bool=False, country_codes: list=None, viewbox: list=None, bounded: bool=False, featuretype: str=None, name): geopy.location.Location or list

Основы функции Nominatim.geocode

Функция geocode принадлежит классу Nominatim модуля geopy.geocoders. Она применяется для прямого геокодирования – преобразования текстового описания места (адреса, названия) в географические координаты (широту и долготу). Основу составляет использование бесплатного сервиса Nominatim на основе данных OpenStreetMap.

Подробное описание аргументов функции:

  • query (обязательный) – строка или словарь, описывающий место для геокодирования. Например, 'Москва, Красная площадь' или {'city': 'Москва', 'street': 'Тверская'}.
  • exactly_one (по умолчанию True) – флаг, указывающий возвращать один результат или список возможных совпадений.
  • timeout (по умолчанию 10) – время ожидания ответа от сервера в секундах.
  • limit – максимальное количество возвращаемых результатов. Актуально при exactly_one=False.
  • addressdetails (по умолчанию False) – запрашивать ли детализированную информацию об адресе (страна, регион, город и т.д.).
  • language – язык, на котором возвращаются результаты (например, 'ru', 'en').
  • viewbox – область для приоритетного поиска в формате ((долгота_юго-запада, широта_юго-запада), (долгота_северо-востока, широта_северо-востока)).
  • country_codes – список кодов стран для ограничения поиска (например, ['ru', 'by']).

Функция возвращает объект geopy.location.Location или список таких объектов. Каждый объект содержит атрибуты address (строка с адресом), latitude, longitude и raw (полный JSON-ответ от сервера). При отсутствии результатов возвращается None или пустой список.

Базовые примеры использования

Пример простого геокодирования адреса:

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent='my_app')
location = geolocator.geocode('Москва, Красная площадь')
print(location.address)
print((location.latitude, location.longitude))
Красная площадь, Китай-город, Тверской район, Москва, Центральный федеральный округ, 109012, Россия
(55.7537223, 37.6208003)

Пример запроса нескольких результатов с деталями адреса:

locations = geolocator.geocode('Ленина', exactly_one=False, limit=3, addressdetails=True)
for loc in locations:
    print(loc.address, loc.raw.get('address').get('city', ''))
улица Ленина, Советский район, Орёл, городской округ Орёл, Орловская область, Центральный федеральный округ, 302030, Россия Орёл
Площадь Ленина, Центр, Тула, городской округ Тула, Тульская область, Центральный федеральный округ, 300012, Россия Тула
улица Ленина, Заводской район, Саратов, городской округ Саратов, Саратовская область, Приволжский федеральный округ, 410005, Россия Саратов

Похожие функции в Python

Библиотека geopy предоставляет другие геокодеры, аналогичные по назначению:

  • GoogleV3 – использует API Google Maps. Обладает высокой точностью и скоростью, но имеет коммерческие ограничения и требует API-ключ.
  • Photon – геокодер на основе данных OpenStreetMap, как и Nominatim, но часто работает быстрее и имеет более простой API. Не требует указания user_agent.
  • Yandex – использует API Яндекс.Карт. Хорошо распознает адреса на русском языке, но также требует ключ и имеет лимиты.
  • ArcGIS – геокодер от Esri. Мощный инструмент с большими лимитами бесплатного использования.

Nominatim предпочтительнее для бесплатных, некоммерческих проектов с умеренным количеством запросов (не более 1 в секунду). Для коммерческих или высоконагруженных проектов стоит рассмотреть платные альтернативы.

Альтернативы на других языках программирования

Пример на JavaScript с использованием API Nominatim напрямую через fetch:

async function geocode(query) {
    const response = await fetch(`https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(query)}&format=json&addressdetails=1`);
    return await response.json();
}
geocode('Paris').then(data => console.log(data[0].lat, data[0].lon));
48.8566969 2.3514616

Пример на PHP с использованием file_get_contents:

$query = urlencode('Berlin');
$url = "https://nominatim.openstreetmap.org/search?q=$query&format=json";
$result = json_decode(file_get_contents($url), true);
echo $result[0]['lat'] . ', ' . $result[0]['lon'];
52.5170365, 13.3888599

На других языках, таких как Java, C#, Go, обычно используют HTTP-клиенты для обращения к тому же REST API Nominatim или специфичные SDK картографических сервисов. Главное отличие от Python – отсутствие единой высокоуровневой библиотеки, аналогичной geopy, что требует ручного формирования запросов и разбора ответов.

Распространенные ошибки

Частая ошибка – превышение лимита запросов. Nominatim требует соблюдения политики использования (1 запрос в секунду).

# Многократный вызов в цикле без задержки
for address in list_of_addresses:
    location = geolocator.geocode(address)  # Может привести к блокировке IP

Рекомендуется добавлять задержку time.sleep(1).

Ошибка из-за отсутствия user_agent:

geolocator = Nominatim()  # Не указан user_agent
location = geolocator.geocode('London')
geopy.exc.GeocoderServiceError: HTTP Error 403: Forbidden

Некорректный или неоднозначный запрос может вернуть неожиданный результат или None:

location = geolocator.geocode('абырвалг')
print(location)
None

Изменения в последних версиях

В geopy 2.0 и выше были внесены изменения, касающиеся всех геокодеров, включая Nominatim:

  • Упрощена установка: зависимости стали более актуальными.
  • Введены более строгие требования к параметрам. Например, аргумент timeout теперь обязателен при создании экземпляра геокодера, хотя ему можно передать значение по умолчанию.
  • Улучшена обработка ошибок и исключений, связанных с сетевыми проблемами.
  • В методах geocode и reverse рекомендуется явно указывать параметр language для гарантированного результата на нужном языке.

Рекомендуется использовать актуальную версию geopy и проверять документацию для конкретной версии.

Расширенные и специфичные примеры

Геокодирование с ограничением по стране и языку ответа:

Пример python
location = geolocator.geocode('Moscow', country_codes='ru', language='ru')
print(location.address)
Москва, Центральный федеральный округ, Россия

Использование viewbox для уточнения области поиска (например, ищем 'Варшава' в приоритете по Польше, а не по Беларуси):

Пример python
viewbox = ((14.0, 49.0), (24.0, 54.5))  # Приблизительные границы Польши
location = geolocator.geocode('Варшава', viewbox=viewbox, bounded=True)
print(location.address)
Варшава, województwo mazowieckie, Polska

Получение структурированного адреса для дальнейшего анализа:

Пример python
location = geolocator.geocode('Санкт-Петербург, Невский проспект, 28', addressdetails=True)
addr = location.raw['address']
print(f"Город: {addr.get('city', '')}, Улица: {addr.get('road', '')}, Дом: {addr.get('house_number', '')}")
Город: Санкт-Петербург, Улица: Невский проспект, Дом: 28

Геокодирование по частям адреса, переданным в виде словаря (структурированный запрос):

Пример python
query_dict = {'city': 'Казань', 'street': 'Кремлевская'}
location = geolocator.geocode(query_dict)
print(location.address)
улица Кремлёвская, Вахитовский район, Казань, городской округ Казань, Татарстан, Приволжский федеральный округ, 420111, Россия

питон geopy.geocoders.Nominatim.geocode function comments

En
Geopy.geocoders.Nominatim.geocode Geocode a location string