Как получить адрес объекта location

Получаю следующие значения а необходимо полный адрес местонахождения. Как получить адрес в нормальном виде? Возможно ли это? Получаю следующие значения а необходимо полный адрес местонахождения
Отслеживать
32.2k 15 15 золотых знаков 61 61 серебряный знак 93 93 бронзовых знака
задан 2 фев 2020 в 21:06
1 1 1 бронзовый знак
приведите пример Вашего кода. Вы можете использовать Геокодер
2 фев 2020 в 22:27
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Необходимо использовать модуль geopy:
pip install geopy
from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="specify_your_app_name_here") location = geolocator.reverse("52.509669, 13.376294")
Объект location будет содержать всю необходимую информацию – адрес и т.д.
Координатный квест: как найти координаты и расстояния без регистраций и смс
Хочу поделиться своим опытом решения одной интересной задачки и описать весь проделанный путь.
Был обычный денёк, сидел я на работе и занимался своими айтишными делами. Ко мне пришел руководитель и сказал: «Нужно рассчитать дистанцию до границы регионов для этих адресов». При этом без всяких платных сервисов и 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'region':>
В итоге получается следующий 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’)
Геокодирование с использованием Geopandas
Каждую точку на Земле можно определить по ее координатам, т.е. по широте и долготе. Большая часть адресов, которые мы получаем из реального мира, находится в текстовой форме, из-за чего трудно получить доступ к идеальному местоположению данного адреса на карте.
Геокодирование — это метод, при котором мы представляем строку адресов в соответствующие значения широты и долготы, что позволяет удобно находить и наносить данный адрес на карту.
Geopandas расширяет свои функциональные возможности для геокодирования с помощью GeoPy, который является дополнительной зависимостью Geopandas.
В этой статье мы будем использовать Geopandas для получения координат заданных адресов в текстовой форме.
Сервис геокодирования и Geopy
Скорее всего, вы использовали геокодер раньше, даже не осознавая, например, выполняя поиск местоположения с помощью текстового описания на картах Google. такие сервисы, как Bing Maps, Google Maps и т. д., являются популярными сервисами геокодирования.
GeoPy — это не сервис геокодирования, а просто клиент Python для нескольких популярных веб-сервисов геокодирования. Он использует сторонние геокодеры и другие источники данных для поиска геокода адреса. Геокодирование предоставляется рядом различных сервисов. Эти сервисы предоставляют API, библиотека GeoPy предоставляет реализацию этих API в одном пакете.
Вы можете получить описание всех сервисов геокодирования, включенных в GeoPy, здесь.
Geopandas использует библиотеку GeoPy для реализации геокодирования.
Реализация с помощью Geopandas
Geopandas содержит класс geocode , который предлагает функции для геокодирования.
Классу геокода требуются следующие входные аргументы:
- адрес в виде строки Python.
- Поставщик геокодирования, который мы собираемся использовать.
Однако услуги геокодирования либо платные, либо бесплатные, поэтому перед выбором услуги ознакомьтесь с их условиями использования, квотами, ценами, базой геоданных и т.д. мы будем использовать геокодер Nominatim, так как он не требует использования ключа API.
1. Использование класса geocode
#import requires modules from geopandas.tools import geocode #address we need to locate loc = 'Machu Picchu' #finding the location location = geocode(loc, provider="nominatim" , user_agent = 'my_request') location
'.format(point.x)) print('latitude: <> '.format(point.y))
Win tab как отключить историю