这次的内容是无意之间想到要做的,因为本人在自学Python,学习到pandas模块的时候就想着怎么样可以将学习获得的知识应用起来,于是就有了今天这个实战内容。
①Python 3.x及以上的运行环境
②导入pandas模块
③导入geopy模块,可以直接pip install geopy获得
④导入warnings模块,用于过滤无用的警告信息
其中geopy作为一个地理位置相关的库,提供了一系列方便的调用其他地图api的方法,其中就包括了:1、通过地名(如建筑物)获取详细地理位置;2、通过给定的经纬度获取详细的地址这两种实用方法。具体请参考官方文档,地址:欢迎使用Geopy文档! — GeoPy 2.2.0 文档
由于使用的是pandas模块,所以按照以往的经验,我选择使用csv文件保存经纬度数据,通过python程序生成指定数目和范围的随机数用来模拟实际中的经纬度数据,效果如下(注:这里只生成了东经0-180°的,实际上应该还包括西经0-180°):
然后通过pandas的read_csv()方法得到一个DataFrame对象。到这里思路就很清晰了,即通过某种方式我们可以方便地获取每一行的经度和纬度信息并进行处理,这种方式就是行/列切片。
geopy提供了一系列方便的调用其他地图api的方法,考虑到某些api的调用需要用户注册并生成密钥才可以使用,我选择无需注册的Nominatim的api,官网:Nominatim
结合上一步,将每次切片得到的经纬度数据分别填充,调用reverse()函数后得到较为准确的位置信息。关键部分如下——
data="{}, {}".format(str(longtitude),str(latitude))
geolocator = Nominatim(user_agent=username)
location = geolocator.reverse(data,zoom=18)
location | 输出一个对应经纬度的大致地理位置,比如说精确到街道 |
location.address | 输出一个对应经纬度的详细地理位置,包括是什么建筑物 |
location.raw | 输出一个对应经纬度的原始信息,貌似默认是json格式 |
其中的none是因为经纬度坐标在水系或者无人区中,无法确定地理位置。
from geopy.geocoders import Nominatim
import warnings as bill_warn
import pandas as pd1
def locate_address(urlname,username):
bill_warn.filterwarnings(action="ignore",message="whatever")
geo_frame=pd1.DataFrame(pd1.read_csv(urlname))
for i in range(0,len(geo_frame)):
longtitude = geo_frame.iloc[i,1]
latitude = geo_frame.iloc[i,2]
data="{}, {}".format(str(longtitude),str(latitude))
geolocator = Nominatim(user_agent=username)
location = geolocator.reverse(data,zoom=18)
print("The information to this set of data:")
print(location)
print("Transform successfully conducted!!!")
locate_address("location.csv","myuseragent")
① 如果遇到下列的异常
问题就是在于初始化Nomitanim的时候,没有指定user_agent的名字,而是调用了默认的user_agent,解决办法就是在构造函数改为你想要的任何的名字
geolocator = Nominatim(user_agent=“你想要的名字”)
②Nominatim的调用也有一定的数量限制,所以请合理使用!
本篇完