Геокодирование с использованием 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
Класс геокода возвращает GeoDataFrame, который имеет два столбца.
- геометрия - содержит широту и долготу данной адресной строки.
- адрес - полный адрес, полученный из базы данных.
Поскольку он похож на фрейм данных 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))
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
здесь мы определили пользовательскую функцию с именем 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
Вывод
Эта статья была посвящена использованию Geopandas для геокодирования строки адресов. Мы также применили геокодирование к фрейму данных pandas с названиями семи чудес света и визуализировали результаты на карте с помощью Folium.