🏆 151 курс за 1 подписку: хватит выбирать — бери все и сразу!

Один клик — 151 возможность. Подпишись на OTUS сейчас!
Техномир мчится вперед, а вместе с ними растут и требования к специалистам. OTUS придумал крутую штуку — подписку на 151 курс по всем ключевым направлениям IT!
-
Почему подписка OTUS меняет правила игры:
- Доступ к 151 курсу от практикующих экспертов
- В 3 раза выгоднее, чем покупать каждый курс отдельно
- До 3 курсов одновременно без дополнительных затрат
- Свобода выбора направления — меняй треки когда угодно
Изучай новое, развивайся в своем темпе, меняй направления — подпишись на OTUS и прокачивай скилы по полной!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576. Erid 2VtzqupFnNL
Когда вы работаете с реальными данными, вы не можете полагаться на то, что в базах содержится вся необходимая информация для реализации вашего проекта Data Science. Чаще всего вы располагаете частичной информацией и должны обогатить данные дополнительными характеристиками.
Может возникнуть ситуация, когда набор данных содержит адрес, но в то же время широта и долгота отсутствуют. В этом случае первым шагом для дополнения данных будет добавление этой пары координат. Мы называем этот процесс преобразования адреса в широту и долготу геокодированием.
Геокодирование востребовано во многих областях, таких как недвижимость, финансы и логистика. Без этой технологии вы не сможете анализировать и визуализировать полученные данные на карте. В этом руководстве мы будем заниматься геокодированием на Python с помощью библиотеки Geopy.
Что такое геокодирование?
Геокодирование – это процесс преобразования адресов (например, «Парковая дорога Амфитеатр, 1600, город Маунтин-Вью, штат Калифорния») в географические координаты (например, широта 37.423021 и долгота -122.083739), которые вы можете использовать для размещения маркеров на карте или позиционирования карты. Проще говоря, это вычислительный процесс преобразования описания физического адреса в местоположение на поверхности Земли.
Процесс геокодирования часто включает в себя интерполяцию пространственных объектов, таких как улицы или земельные участки, в географические границы карты. Полученные данные выводятся в виде числовых координат, пригодных для использования в пространственном анализе или визуализации карт.
При геокодировании используются различные источники данных для преобразования адреса в географическое местоположение. Первичным источником является справочная база данных улиц, содержащая названия и диапазоны адресов в пределах определенного округа или района. Другие источники включают базы данных почтовых индексов, базы данных названий городов и базы данных важных мест (например, парков или достопримечательностей).
Геокодирование – это не только получение координат по заданному адресу. Оно также используется в пространственном анализе, поиске данных и их обработке. К примеру, компании используют геокодирование для анализа демографической информации с целью проведения целевых маркетинговых кампаний или оптимизации маршрутов доставки. В сфере общественной безопасности геокодирование используется для определения местоположения чрезвычайных происшествий, чтобы оперативно направлять ближайшие службы спасения.
В контексте Data Science геокодирование является важным этапом в процессе создания геопространственных визуализаций и может использоваться в различных областях, таких как прогнозирование цен на недвижимость, оптимизация маршрутов доставки и разработка планов реагирования на стихийные бедствия.
Что такое Geopy?

Geopy – это библиотека Python с открытым исходным кодом, специализирующаяся на добавлении местоположения к данным с помощью сервисов геокодирования, таких как Google Maps, Open StreeMap и ArcGIS.
Пример реализации проекта по геокодированию на практике
В этой статье мы проанализируем массив данных канадских музеев с сайта Kaggle. В нем содержится информация о музеях, расположенных в Канаде. Эта подборка музеев может быть полезна для прогнозирования цен на жилье Airbnb в Торонто. Например, вы могли заметить, что стоимость аренды жилья увеличивается с приближением к таким интересным местам, как музеи, рестораны, кафе и так далее.
Давайте посмотрим на таблицу:
import pandas as pd
import geopy
l_cols= ['Name','Street Address','City','State','Zipcode']
df = pd.read_csv('/kaggle/input/canada-museums/museums list CAN.csv', encoding = "ISO-8859-1",usecols=l_cols)
df = df[df.City=='Toronto']
df.head()

На изображении таблицы выше видно, что разные столбцы содержат информацию об объектах, включая название музея, адрес улицы, город, штат и почтовый индекс.
Для дальнейших действий нам понадобится уникальный столбец, который объединит всю информацию из этой таблицы. Как мы можем это сделать? Самый эффективный способ объединить более двух столбцов – это использовать pandas.series.str.cat()
, который дает нам возможность задать нужный разделитель между одним столбцом и другим:
df['Country'] = 'Canada'
l_cols_concat = ['Street Address','City','State','Zipcode','Country']
df['unique_address'] = df['Name'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
df.head()

Мы можем использовать строковую переменную 'address1'
, которая будет содержать уникальный адрес первой строки:
address1 = df['unique_address'].iloc[0]
print(address1)
# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,Canada
Мы будем использовать ее в следующих шагах, чтобы поэкспериментировать с различными сервисами геокодирования по отдельному адресу. Когда станет понятно, как Geopy определяет местоположение, это можно будет применить к целому столбцу DataFrame Pandas. Мы протестируем следующих крупнейших геопровайдеров:
- Google Maps
- OpenStreetMap
- ArcGIS
Геокодирование с помощью Google Maps API

Самый популярный метод преобразования адресов в координаты – это использование Google Maps API.
Хотя Google Maps предоставляет платные услуги, при первом создании аккаунта вы получаете 200 долларов в качестве бонусных кредитов.
Чтобы получить доступ к сервису, необходимо создать новый аккаунт на платформе Google Maps. Здесь вы найдете отличное руководство, которое поможет вам в процессе генерации ключа API.
GM_API_KEY = 'your_api_key'
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)
GoogleV3
– это класс, предназначенный для использования API Google Maps v3. Для начала мы можем попробовать извлечь местоположение из одного адреса:
location = geolocator.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

После этого мы можем попробовать выполнить эту операцию для значения unique_address
, которое мы создали ранее.
def service_geocode(g_locator, address):
location = g_locator.geocode(address)
if location!=None:
return (location.latitude, location.longitude)
else:
return np.NaN
Мы можем использовать функцию apply()
, чтобы применить ее ко всем строкам unique_address
:
df['LAT_LON'] = df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()

Геокодирование с помощью API OpenStreetMap

Поскольку OpenStreetMap – самая большая и свободно редактируемая географическая база данных и проект, API является бесплатным. Чтобы геолоцировать один адрес, достаточно указать в качестве исходных данных для класса Nominatim
электронную почту вашего аккаунта OSM, а не ключ API:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)
print(location)
# None
К сожалению, местоположение, возвращаемое API OpenStreetMap, равно None
, поскольку он не распознает адрес.
Действительно, этот API не может определить местоположение большинства адресов улиц в базе данных, поскольку не имеет достаточного охвата адресов во всех районах.
По этой причине нам необходимо создать еще одно значение unique_address_osm
с меньшим количеством информации:
l_cols_concat = ['City','State','Country']
df['unique_address_osm'] = df['Street Address'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
address1_osm = df['unique_address_osm'].iloc[0]
После этого мы получаем новый адрес и снова пытаемся извлечь широту и долготу из адреса улицы:
address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Как и в предыдущем случае, мы применяем функцию service_geocode()
ко всем столбцам unique_address_osm
:
df['LAT_LON_osm'] = df['unique_address_osm'].apply(lambda x: service_geocode(geolocator,x))
df[['unique_address_osm','LAT_LON','LAT_LON_osm']].head()

Несмотря на то что мы не указали название музея, OpenStreetMap возвращает координаты, аналогичные GoogleMapsAPI.
Геокодирование с помощью ArcGIS API
ArcGIS – это программное обеспечение, позволяющее анализировать и визуализировать геопространственные данные. Оно также предоставляет сервисы определения местоположения, такие как Google Maps и OpenStreetMap.
from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

На этот раз проблем с получением пары координат не возникло. Мы можем продолжить выполнение этой операции для всех адресов:
df['LAT_LON_arcgis'] = df['unique_address'].apply(lambda x: service_geocode(geolocator_arcgis,x))
df[['unique_address','LAT_LON','LAT_LON_osm','LAT_LON_arcgis']].head()

Взглянув на первые строки массива данных, мы видим, что пары координат, полученные с помощью ArcGIS, аналогичны тем, что были получены ранее, присутствует лишь небольшая разница.
Измерение расстояния между двумя пунктами
Еще одна функциональность Geopy – возможность рассчитать расстояние между двумя точками. Для этого используется геодезическое расстояние, полученное между двумя парами (широта и долгота).
from geopy.distance import geodesic
point1 = df.LAT_LON_arcgis.iloc[0]
point2 = df.LAT_LON_arcgis.iloc[1]
distance = geodesic(point1, point2)
print('The distance between {} and {} is {} meters'.format(df.Name.iloc[0],df.Name.iloc[1],distance.meters))

Расстояние между этими двумя музеями составляет около 2-х километров.
Вот и все! Вы узнали три разных способа преобразования адреса в широту и долготу с помощью Geopy. Это лишь отправная точка для более сложного и продвинутого анализа геопространственных данных.
Комментарии