Перейти к содержимому

Geopy python как пользоваться

  • автор:

Как получить адрес объекта 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

В итоге получается следующий 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 , который предлагает функции для геокодирования.

Классу геокода требуются следующие входные аргументы:

  1. адрес в виде строки Python.
  2. Поставщик геокодирования, который мы собираемся использовать.

Однако услуги геокодирования либо платные, либо бесплатные, поэтому перед выбором услуги ознакомьтесь с их условиями использования, квотами, ценами, базой геоданных и т.д. мы будем использовать геокодер 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 

GeoDataFrame</p>
<p>» /></p>
<p>Класс геокода возвращает GeoDataFrame, который имеет два столбца.</p>
<ol>
<li>геометрия — содержит широту и долготу данной адресной строки.</li>
<li>адрес — полный адрес, полученный из базы данных.</li>
</ol>
<p>Поскольку он похож на фрейм данных pandas, мы можем легко управлять им с помощью функций индексации pandas.</p>
<p>Доступ к значениям широты и долготы:</p>
<pre><code >#import requires modules from geopandas.tools import geocode #address we need to locate loc = 'Machu Picchu' #finding the location location = geocode(loc, provider= '.format(point.x)) print('latitude: <> '.format(point.y))

Координаты Мачу-Пикчу</p>
<p>» /></p>
<h4>2. Использование класса Geocode с Pandas DataFrame</h4>
<p>Давайте создадим фрейм данных с названиями семи чудес света, и мы геокодируем информацию, чтобы определить их широту и долготу.</p>
<pre><code >#Importing the requires modules import folium import pandas as pd from geopandas.tools import geocode #Creating a DataFrame wonders = ['Taj Mahal', 'Colosseum','Machu Picchu','Christ the Redeemer','Chichen Itza','petra'] df = pd.DataFrame() #function to unzip latitude and longitude from GeoDataFrame def custom_geocoder(address): dataframe = geocode(address , provider=

DataFrame с широтой и долготой</p>
<p>» /></p>
<p>здесь мы определили пользовательскую функцию с именем custom_geocoder , которая принимает строку адреса и геокодирует ее, возвращая значения широты и долготы как серии pandas.</p>
<p>Используя метод pandas.apply, мы применили нашу настраиваемую функцию к столбцу, содержащему названия семи чудес, добавив соответствующие значения широты и долготы в DataFrame.</p>
<pre><code ># Make sure you run the above code first to plot the results mapit = folium.Map( location=[0, 0], zoom_start=1 ) for lat , lon in zip(df.latitude , df.longitude): folium.Marker( location=[ lat,lon ], fill_color='#43d9de', radius=8 ).add_to( mapit ) mapit</code> </pre>
<p><img decoding=Win tab как отключить историю

  • X96 max plus как удалить приложение
  • Как установить polybar i3wm
  • Почему происходит корректировка стоимости списания при закрытии месяца
  • Добавить комментарий

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