Как получить координаты по адресу python
Перейти к содержимому

Как получить координаты по адресу python

  • автор:

API: обратное геокодирование (адрес по координатам)

Находит ближайшие адреса (дома, улицы, города) по географическим координатам. Только для России.

Это документация для разработчиков. Определить адрес в демоформе, посмотреть сценарии использования и варианты подключения сервиса можно на странице «Найти адрес по координатам»

Как вызвать

Чтобы вызвать метод, зарегистрируйтесь и подтвердите почту.

curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -H "Authorization: Token $" \ -d '< "lat": 55.878, "lon": 37.653 >' \ https://suggestions.dadata.ru/suggestions/api/4_1/rs/geolocate/address
// https://github.com/hflabs/dadata-csharp var token = "$"; var api = new SuggestClientAsync(token); var result = await api.Geolocate(lat: 55.878, lon: 37.653);

JavaScript

var url = "https://suggestions.dadata.ru/suggestions/api/4_1/rs/geolocate/address"; var token = "$"; var query = < lat: 55.878, lon: 37.653 >; var options = < method: "POST", mode: "cors", headers: < "Content-Type": "application/json", "Accept": "application/json", "Authorization": "Token " + token >, body: JSON.stringify(query) > fetch(url, options) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log("error", error));
// https://github.com/hflabs/dadata-php $token = "$"; $dadata = new \Dadata\DadataClient($token, null); $result = $dadata->geolocate("address", 55.878, 37.653);
# https://github.com/hflabs/dadata-py from dadata import Dadata token = "$" dadata = Dadata(token) result = dadata.geolocate(name="address", lat=55.878, lon=37.653)

Укажите при вызове:

  • Content-Type: application/json .
  • Accept: application/json .
  • $ — API-ключ.

Тело запроса передавайте в кодировке UTF-8 .

Параметры запроса

Название Тип Обяз.? По умолч. Описание
lat number Географическая широта
lon number Географическая долгота
count number 10 Количество результатов (максимум — 20)
radius_meters number 100 Радиус поиска в метрах (максимум – 1000)
language string ru На каком языке вернуть результат (ru / en)

Пример запроса с ограничением по радиусу в 50 м:

Что в ответе

Адреса в ответе идут в порядке удаления от заданных координат.

У адреса обычный набор полей, но некоторые из них не заполняются:

city_area city_district* flat_* timezone beltway_hit beltway_distance metro

Покрытие координат

«Дадата» берет координаты домов и улиц из OpenStreetMap.

Покрытие по домам:

  • Москва — 97%,
  • Санкт-Петербург — 91%,
  • другие города-миллионники — 69%,
  • остальная Россия — 47%.
  • Москва — 95%,
  • Санкт-Петербург — 94%,
  • другие города-миллионники — 81%,
  • остальная Россия — 70%.

Примеры вызова

Ограничения

Длина запроса (параметр query ) — не более 300 символов.

Количество запросов в день — в соответствии с тарифным планом.

Максимальная частота запросов — 30 в секунду с одного IP-адреса.

Максимальная частота создания новых соединений — 60 в минуту с одного IP-адреса.

Стоимость

Метод бесплатный до 10 000 запросов в день. Больше — в составе годовой подписки.

О сервисе

Как определить координаты места по его адресу в Python?

координаты места по его адресу

координаты места по его адресу

Привет всем! Этот пост является логическим продолжением вот этого поста, посвященного определению расстояния между двумя точками на карте по координатам GPS. Сегодня мы разберемся, как определить координаты места по его адресу в Python.

На помощь (в который раз!) приходят библиотеки. Сегодня — библиотека geopy. Работает она с помощью ряда публично-доступных API, среди которых имеются OpenStreetMap Nominatim и Google Geocoding API, благодаря чему вы можете искать GPS-координаты по адресу или названию интересующешго вас места. Больше того! С помощью этой библиотеки вы можете определить дистанцию между двумя интересующими вас точками! А значит — никакой больше формулы Хаверсина — просто библиотека, и две строки кода. Пример — как всегда — ниже:

from geopy.geocoders import Nominatim #Подключаем библиотеку geolocator = Nominatim(user_agent="Tester") #Указываем название приложения (так нужно, да) adress = str(input('Введите адрес: \n')) #Получаем интересующий нас адрес location = geolocator.geocode(adress) #Создаем переменную, которая состоит из нужного нам адреса print(location) #Выводим результат: адрес в полном виде print(location.latitude, location.longitude) #И теперь выводим GPS-координаты нужного нам адреса

А теперь давайте определим дистанцию между двумя интересующими нас точками:

from geopy.geocoders import Nominatim #Подключаем библиотеку from geopy.distance import geodesic #И дополнения geolocator = Nominatim(user_agent="Tester") #Указываем название приложения address_1 = str(input('Введите город 1: \n')) #Получаем название первого города address_2 = str(input('Введите город 2: \n')) #Получаем название второго города location_1 = geolocator.geocode(address_1) #Получаем полное название первого города location_2 = geolocator.geocode(address_2) #Получаем полное название второго города print('Город 1: ', location_1) #Выводим первичные данные print('Город 2: ', location_2) #Выводим первичные данные print('Координаты города 1: ', location_1.latitude, location_1.longitude) #Выводим координаты первого города gps_point_1 = location_1.latitude, location_1.longitude #Выводим координаты первого города gps_point_2 = location_2.latitude, location_2.longitude #Выводим координаты второго города print('Координаты города 2: ', location_2.latitude, location_2.longitude) #Выводим общие данные print('Дистанция между городом', location_1, 'и городом ', location_2, ': ', geodesic(gps_point_1, gps_point_2).kilometers, ' километров') #Выводим полученный результат в километрах

Блин, все реально очень просто, я просто в восторге.
Как всегда — в случае возникновения вопросов пишите на почту, или в Телеграм.

Как в Python определить координаты города?

Прошу совета каким модулем воспользоваться для решения моей тривиальной задачи.
Все просто — при вводе названия города на английском “Voronezh”, а в идеале и на русском, я бы получил его координаты, вида:

'latitude': 33.91640090942383, 'longitude': -118.40399932861328,

Каким модулем пользуетесь, что посоветуете?

Рассматривал сервис от Яндекса https://tech.yandex.ru/maps/doc/geocoder/desc/conc. но так и не смог распарсить его, ибо опыта мало.

  • Вопрос задан более трёх лет назад
  • 9010 просмотров

1 комментарий

Оценить 1 комментарий

Координатный квест: как найти координаты и расстояния без регистраций и смс

Хочу поделиться своим опытом решения одной интересной задачки и описать весь проделанный путь.

Был обычный денёк, сидел я на работе и занимался своими айтишными делами. Ко мне пришел руководитель и сказал: «Нужно рассчитать дистанцию до границы регионов для этих адресов». При этом без всяких платных сервисов и API онлайн карт, и своими усилиями. Айтишник понял, айтишник принял, айтишник получил свою заветную эксельку и пошёл работать.

Вступление

Из школьных уроков географии я помнил, что для определения километража требуется знать координаты (широту и долготу) двух точек. И исходя из этого, я разделил задачу на 4 части:

  • поиск координат границы;
  • предобработка данных;
  • поиск координат адресов;
  • непосредственный расчёт расстояний между координатами.

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

В качестве основного инструмента для парсинга, обработки и расчётов я использовал Python. Средой разработки выступали Jupyter Notebook (Anaconda), PyCharm и DataSpell от компании JetBrains (дело вкуса). При работе с данным проектом использовал библиотеки Numpy, Pandas, Plotly, Geopy, Selenium.

На этом прелюдия заканчивается, переходим к сути.

Начало начал

Для расчёта дистанции до границы нужны координаты, что неудивительно, самой границы. Вручную прокликивать точки на карте мне не очень хотелось, а попытка поиска готовых координат полностью провалилась. К счастью, удалось найти json‑файл с положением границ субъектов России, среди которых и находятся нужные точки.

Для начала достаю нужные области. Импортирую библиотеки для дальнейшей работы, сохраняю данные файла в словарь (dict) и смотрю на содержимое объекта:

#Библиотека для работы с «.json»-файлами import json #Библиотека для обработки и анализа данных import pandas as pd #Библиотека для работы с многомерными массивами import numpy as np # Считываем файл с координатами всех регионов with open(‘data//gadm41_RUS_1.json’, encoding = ‘utf-8’) as js: dict_coordin_border = json.load(js)

Словарь с данными из файла

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

  • dict_coordin_border[‘features’] [‘properties’][‘NL_NAME_1’] — название субъекта федерации;
  • dict_coordin_border[‘features’] [‘geometry’][‘coordinates’] — координаты границ субъектов.

Выделяю из данного словаря только нужные пять областей, и записываю в pandas.DataFrame данные, где:

  • region — название региона;
  • lon — долгота точки границы;
  • lat — широта точки границы;
  • sequence_number — порядковый номер записи;
  • color — цвет региона.

Зачем цвет и порядковый номер? Расскажу далее, а сейчас предлагаю рассмотреть код:

df_coord_reg = pd.DataFrame() sequence_number = 0 for regions in dict_coordin_border[‘features’]: #Ставим условия для поля названия субъектов if regions[‘properties’][‘NL_NAME_1’] in [‘Воронежскаяобласть’, ‘Брянскаяобласть’, ‘Курскаяобласть’, ‘Ростовскаяобласть’, ‘Белгородскаяобласть’]: for list_coordin_lv_1 in regions[‘geometry’][‘coordinates’]: for list_coordin_lv_2 in list_coordin_lv_1: for list_coordin_finish_lvl in list_coordin_lv_2: #Заполняем df: Название региона, координаты точки границы, порядковый номер записи, цвет региона if regions[‘properties’][‘NL_NAME_1’] == ‘Воронежскаяобласть’: color = ‘purple’ elif regions[‘properties’][‘NL_NAME_1’] == ‘Брянскаяобласть’: color = ‘white’ elif regions[‘properties’][‘NL_NAME_1’] == ‘Курскаяобласть’: color = ‘blue’ elif regions[‘properties’][‘NL_NAME_1’] == ‘Ростовскаяобласть’: color = ‘yellow’ elif regions[‘properties’][‘NL_NAME_1’] == ‘Белгородскаяобласть’: color = ‘red’ df_coord_reg = df_coord_reg.append(<'region': regions['properties']['NL_NAME_1'], #Название региона 'lon': list_coordin_finish_lvl[0], #Долгота точки границы 'lat': list_coordin_finish_lvl[1], #Широта точки границы 'sequence_number': str(sequence_number), #Порядковый номер записи 'color': color>, #Цвет региона ignore_index = True) sequence_number += 1

В итоге получается следующий dataframe:

Результат выполнения кода

На данном этапе я получил координаты границ регионов со всех сторон. Но это не совсем нужный результат, требуется только та часть границ, которые не совпадают друг с другом. И здесь я хочу рассказать про библиотеку plotly.

Plotly — это графическая библиотека для интерактивной визуализации данных. С её помощью можно создавать диаграммы, гистограммы, карты распределения, 2D‑диаграммы, 3D‑графики и многое другое. Эта библиотека — сильный «зверь» для визуала, и она поможет расположить полученные точки на карте. Подробнее ознакомиться можно по ссылке.

Код ниже отображает точки на географической карте Европы:

#Импортируем библиотеки для визуализации данных import plotly.graph_objs as go #Визуализируем на карте точки с координатами для проверки и дальнейшего анализа fig = go.Figure(data=go.Scattergeo( #Scattergeo — данные, визуализируемые в виде точек географической карте lon = df_coord_reg[‘lon’], #Долгота точки lat = df_coord_reg[‘lat’], #Широта точки mode = ‘markers’, #Вид точки marker_color = df_coord_reg[‘color’], #Цвет точки text = df_coord_reg[‘region’] + ‘ ‘ + df_coord_reg[‘sequence_number’] #Текст при наведении на точку ), ) fig.update_layout( title = ‘Субъекты РФ ‘, #Задаем название карты geo = dict( scope=’europe’, #Шаблон карты landcolor = «green», #Цвет для стран countrycolor = «black», #Цвет границ между странами ), width=1500, #Ширина карты height=750 #Высота графика )

Результат выполнения кода:

Субъекты РФ

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

Выбираю номера точек, которые находятся на границе, и перезаписываю данные в dataframe:

#Исходя из карты, выбираем следующие срезы df и записываем их в новую переменную df_coord_border = pd.concat([df_coord_reg[11:411], df_coord_reg[1278:1459], df_coord_reg[974:1226], df_coord_reg[3084:3157], df_coord_reg[2004:2413]])

Для проверки повторно визуализирую данные и сохраняю полученные координаты в json‑файл.

#Визуально проверяем полученный dataframe fig = go.Figure(data=go.Scattergeo(lon = df_coord_border[‘lon’], lat = df_coord_border[‘lat’], mode = ‘markers’, marker_color = df_coord_border[‘color’], text = df_coord_border[‘region’] + ‘ ‘ + df_coord_border[‘sequence_number’])) fig.update_layout( title = ‘Субъекты РФ’, geo = dict( scope=’europe’, landcolor = «green», countrycolor = «black», ), width=1500, #Ширина карты height=750 #Высота графика ) #Сохраняем данные в json df_coord_border[[‘lon’, ‘lat’]].to_json(‘data//border.json’)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *