DevGang
Авторизоваться

Геокодирование с использованием 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<br>
GeoDataFrame

Класс геокода возвращает GeoDataFrame, который имеет два столбца.

  1. геометрия - содержит широту и долготу данной адресной строки.
  2. адрес - полный адрес, полученный из базы данных.

Поскольку он похож на фрейм данных pandas, мы можем легко управлять им с помощью функций индексации pandas.

Доступ к значениям широты и долготы:

#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')
 
point = location.geometry.iloc[0]
print('Name: '+ loc )
print('complete address: '+ location.address.iloc[0])
print('longitude: {} '.format(point.x))
print('latitude: {} '.format(point.y))
Координаты Мачу-Пикчу<br>
Координаты Мачу-Пикчу

2. Использование класса Geocode с Pandas DataFrame

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

#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({'wonders' : wonders})
 
#function to unzip latitude and longitude from GeoDataFrame
def custom_geocoder(address):
    dataframe = geocode(address , provider="nominatim" , user_agent = 'my_request')
    point = dataframe.geometry.iloc[0]
    return pd.Series({'Latitude': point.y, 'Longitude': point.x})
 
#Applying function to the dataframe
df[['latitude' , 'longitude']]= df.wonders.apply( lambda x: custom_geocoder(x))
 
df
DataFrame с широтой и долготой<br>
DataFrame с широтой и долготой

здесь мы определили пользовательскую функцию с именем custom_geocoder, которая принимает строку адреса и геокодирует ее, возвращая значения широты и долготы как серии pandas.

Используя метод pandas.apply, мы применили нашу настраиваемую функцию к столбцу, содержащему названия семи чудес, добавив соответствующие значения широты и долготы в DataFrame.

Построение результатов

# 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
Места на карте<br>
Места на карте

Вывод

Эта статья была посвящена использованию Geopandas для геокодирования строки адресов. Мы также применили геокодирование к фрейму данных pandas с названиями семи чудес света и визуализировали результаты на карте с помощью Folium.

Источник:

#Python #Pandas
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

В подарок 100$ на счет при регистрации

Получить