API Яндекс-геокодера

Перед использованием получите API ключ в кабинете разработчика:

screenshot

Самые важные ответы на вопросы:

  • В открытом. Ваш код будет публично опубликован, это открытая система
  • В бесплатном. Вы пишете код в образовательных целях
  • Буду отображать данные на карте. По шагам урока вам предстоит это сделать

Что дальше?

Мы уже сами написали для вас функцию, которая получит координаты места по его названию, осталось ей воспользоваться. Для её работы нужно установить библиотеку requests==2.*

import requests

def fetch_coordinates(apikey, address):
    base_url = "https://geocode-maps.yandex.ru/1.x"
    response = requests.get(base_url, params={
        "geocode": address,
        "apikey": apikey,
        "format": "json",
    })
    response.raise_for_status()
    found_places = response.json()['response']['GeoObjectCollection']['featureMember']

    if not found_places:
        return None

    most_relevant = found_places[0]
    lon, lat = most_relevant['GeoObject']['Point']['pos'].split(" ")
    return lon, lat

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

apikey = '41f31cb9-8414-4c9a-bd82-79ec5d22b8ec'  # ваш ключ

coords = fetch_coordinates(apikey, "Внуково")
print(coords)  # ('37.295014', '55.608562')

coords = fetch_coordinates(apikey, "Серпуховская")
print(coords)  # ('37.624992', '55.726872')

coords = fetch_coordinates(apikey, "Красная площадь")
print(coords)  # ('37.621031', '55.753595')

coords = fetch_coordinates(apikey, "UNEXIST")
print(coords)  # None

Частые проблемы

Порой Яндекс-геокодер отказывается принимать новые ключи. При вызове функция fetch_coordinates ломается с такой ошибкой:

Traceback (most recent call last):
  File "main.py", line 22, in <module>
    coords = fetch_coordinates(apikey2, address)
  File "main.py", line 12, in fetch_coordinates
    response.raise_for_status()
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://geocode-maps.yandex.ru/1.x?geocode=Moscow&apikey=41f31cb9-8414-4c9a-bd82-79ec5d22b8ec&format=json

Здесь самая важная часть сообщения находится в последней строке:

HTTPError: 403 Client Error: Forbidden for url ...

Ошибка с кодом403 означает, что сервер отказывается работать с указанным ключом API.

Проблема исчезает сама примерно за полчаса. Столько времени требуется серверам Яндекса на то, чтобы узнать о регистрации нового ключа.


Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.