Geopy.geocoders.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 и проверять документацию для конкретной версии.
Расширенные и специфичные примеры
Геокодирование с ограничением по стране и языку ответа:
location = geolocator.geocode('Moscow', country_codes='ru', language='ru')
print(location.address)Москва, Центральный федеральный округ, Россия
Использование viewbox для уточнения области поиска (например, ищем 'Варшава' в приоритете по Польше, а не по Беларуси):
viewbox = ((14.0, 49.0), (24.0, 54.5)) # Приблизительные границы Польши
location = geolocator.geocode('Варшава', viewbox=viewbox, bounded=True)
print(location.address)Варшава, województwo mazowieckie, Polska
Получение структурированного адреса для дальнейшего анализа:
location = geolocator.geocode('Санкт-Петербург, Невский проспект, 28', addressdetails=True)
addr = location.raw['address']
print(f"Город: {addr.get('city', '')}, Улица: {addr.get('road', '')}, Дом: {addr.get('house_number', '')}")Город: Санкт-Петербург, Улица: Невский проспект, Дом: 28
Геокодирование по частям адреса, переданным в виде словаря (структурированный запрос):
query_dict = {'city': 'Казань', 'street': 'Кремлевская'}
location = geolocator.geocode(query_dict)
print(location.address)улица Кремлёвская, Вахитовский район, Казань, городской округ Казань, Татарстан, Приволжский федеральный округ, 420111, Россия
питон geopy.geocoders.Nominatim.geocode function comments
- питон geopy.geocoders.Nominatim.geocode - аргументы и возвращаемое значение
- Функция python geopy.geocoders.Nominatim.geocode - описание
- geopy.geocoders.Nominatim.geocode - примеры
- geopy.geocoders.Nominatim.geocode - похожие методы на python
- geopy.geocoders.Nominatim.geocode на php, c#, sql, java
- geopy.geocoders.Nominatim.geocode изменения python
- Примеры geopy.geocoders.Nominatim.geocode на питон