Heim > Backend-Entwicklung > Python-Tutorial > Vollständige Lösung zur Geokodierung in Python

Vollständige Lösung zur Geokodierung in Python

WBOY
Freigeben: 2023-04-14 16:55:03
nach vorne
1226 Leute haben es durchsucht

译者 | 崔皓

审校 | 孙淑娟

1、简介

 大家在处理机器学习的大型数据集时,是否会遇到如下的地址栏?

Vollständige Lösung zur Geokodierung in Python

上面的位置数据非常混乱,难以处理。对地址进行编码是很困难的,因为它们具有非常高基数。如果你试图用单次编码技术来对某列进行编码,就会导致高维度的结果,这会导致机器学习模型表现欠佳。解决问题的最简单方法就是对列进行地理编码。

2、什么是地理编码?

地理编码是将地址转换为地理坐标,这意味着将把原始地址转化为经度/纬度的方式。

3、Python中的地理编码

有许多不同的库可以帮助你用Python进行地理编码。最快的是谷歌地图提供的API,如果有超过1000个地址需要在短时间内转换,我推荐你使用。然而,谷歌地图的API并不是免费的,你需要为每1000个请求支付约5美元。

谷歌地图API的免费替代品是OpenStreetMap API。然而,OpenStreetMap API的速度比起谷歌地图来说要慢得多,而且准确性也稍差。

在这篇文章中,我将指导你使用上述两个API完成地理编码过程。

4、谷歌地图API

让我们首先使用谷歌地图API将地址转换成精度/纬度。首先需要创建一个谷歌云账户,并输入信用卡信息。虽然这是一项付费服务,但当你第一次创建谷歌云账户时,谷歌会给你200美元的免费信用。这意味着,在你被收费之前,你可以用他们的地理编码API进行大约40,000次调用。只要你没有达到这个限制,你的账户就不会被收费。

首先,在谷歌云上建立一个免费账户。然后,一旦你建立了一个账户,你就可以按照这个教程来获得你的谷歌地图API密钥。

一旦你收到API密钥,就可以开始编码了!

(1)前提条件

在本教程中使用Zomato餐厅Kaggle数据集。确保在你的路径中安装了该数据集。然后,用这个命令安装googlemaps API包。

pip install -U googlemaps
Nach dem Login kopieren

(2)读取数据集

现在,让我们读取数据集并检查数据帧的头部。

data = pd. read_csv('zomato.csv',encoding="ISO-8859-1")
df = data.copy()
df.head()
Nach dem Login kopieren

Vollständige Lösung zur Geokodierung in Python

这个数据集合有21列,9551行。

只需要针对地址列来进行地理编码,所以去掉所有其他的列。然后,再去掉重复记录,最后只得到地址列信息。

df = df[['地址']]
df = df. drop_duplicates()
Nach dem Login kopieren

再看一下数据框架的头部,在处理之后就只看到地址信息了。

Vollständige Lösung zur Geokodierung in Python

接下来,就可以开始地理编码了。

(3)地理编码

首先,用Python访问我们的API密钥,运行下面几行代码来完成这个任务。

gmaps_key = googlemaps.Client(key="your_API_key")
Nach dem Login kopieren

现在,让我们先尝试对一个地址进行地理编码,并看看输出结果。

add_1 = df['地址'][0]
g = gmaps_key. geocode(add_1)
lat = g[0]["geometry"]["location"]["lat"]
long = g[0]["geometry"]["location"]["lng"]
print('Latitude: '+str(lat)+', Longitude: '+str(long))
Nach dem Login kopieren

运行上述代码,得到类似如下的输出结果。

Vollständige Lösung zur Geokodierung in Python

如果你得到上述输出,很好!表示一切顺利。我们可以针对整个数据集应用类似的处理,过程如下:

def geocode(add):
g = gmaps_key. geocode(add)
lat = g[0]["geometry"]["location"]["lat"]
lng = g[0]["geometry"]["location"]["lng"]
return(lat, lng)。
df['geocoded'] = df['Address']. apply(geocode)
Nach dem Login kopieren

再次检查数据集合的头部,看看代码是否生效。

df.head()
Nach dem Login kopieren

Vollständige Lösung zur Geokodierung in Python

如果输出类似上面的截图,恭喜你!你已经成功地对整个数据框架中的地址进行了地理编码。

5、OpenStreetMap API

OpenStreetMap API是完全免费的,但与谷歌地图API相比,速度较慢,精确度较低。这个API无法定位数据集中的许多地址,所以这次我们将使用地点栏来代替。在开始学习教程之前,让我们先看看地址栏和位置栏的区别。运行下面几行代码来完成这个任务。

print('Address: '+data['Address'][0]+'nnLocality: '+data['Locality'][0] )
Nach dem Login kopieren

Vollständige Lösung zur Geokodierung in Python

地址栏(Address)比地点(Locality)栏细化得多,它提供了餐厅的确切位置,包括楼层号。这可能是地址不被OpenStreetMap API识别,而地点却被识别的原因。

让我们对第一个Locality进行地理编码,看看输出结果。

地理编码

运行以下几行代码。

Import url
Import requests

data = data[['Locality']]

url = 'https://nominatim.openstreetmap.org/search/' + urllib. parse. quote(df['Locality'][0]) +'?format=json' 。
response = requests.get(url).json()
print('Latitude: '+response[0]['lat']+', Longitude: '+response[0]['lon'] )
Nach dem Login kopieren

左右滑动查看完整代码

上述代码的输出与谷歌地图API生成的结果非常相似。

Vollständige Lösung zur Geokodierung in Python

现在,让我们创建一个函数来寻找整个数据集合的坐标。

def geocode2(locality):
url = 'https://nominatim.openstreetmap.org/search/' + urllib. parse. quote(locality) +'?format=json'
response = requests.get(url).json()
if (len(response)!=0)。
return(response[0]['lat'], response[0]['lon'] )
else:
return('-1')

data['geocoded'] = data['Locality']. apply(geocode2)
Nach dem Login kopieren

很好!现在,让我们来看看数据集合的头部。

Data.head(15)
Nach dem Login kopieren

请注意,这个API无法为数据集合中的一些地方提供坐标。

虽然它是谷歌地图API的免费替代品,如果用OpenStreetMap进行地理编码,有可能会失去大量的数据。本教程到此结束!希望你从这里学到了一些新的东西,并对处理地理空间数据有了更好的理解。

原文链接:https://www.kdnuggets.com/2022/11/geocoding-python-complete-guide.html

译者介绍

崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。

Das obige ist der detaillierte Inhalt vonVollständige Lösung zur Geokodierung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:51cto.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage