Python批处理 |利用天地图的地理编码api将文字地址解析成经纬度
今天碰巧看到政府公共数据网,发现有很多不错的对工作有很大用处的数据。以前没用过这些数据,不知道怎么样,所以试着下载到了一些表格数据,基本上是很标准很规范的,表的情况都有一些说明,非常好理解,就是都是文本格式。其他属性信息倒是不影响,但是里面的地址都是“某某省某某市某某县某某村几号”类似的东西,作为一名GISer,看起来很别扭,既然都有地址说明了,那就直接出经纬度,然后展示在地图上,那做做基于位置的数据分析工作岂不方便多了去了。
所以考虑一下得想办法把这些表格数据弄成能作为地图显示的矢量数据,核心就是将这些文字描述的地址信息转为经纬度数据。
记得天地图服务里面有个地理编码功能不错,然后今天正好有一点点闲时间,就搞一搞试试,目标就是将原始的文字表格弄成地图显示,经过2个多小时的摸索尝试,成功实现了在地图上的显示,具体请参考下面的说明。
一、做好准备:VScode,Python3(pandas,xlrs,xlmt),ArcGIS10.2,
二、注册天地图,申请key。
点击这篇→如何申请个人天地图API密钥?
三、下载官方数据。
从政府公共数据网站找到感兴趣的数据,下载excel表格数据。(具体可到各地公共数据开放网查看)
四、python代码
from encodings import utf_8
import requests
import pandas as pd
application_key='自己申请的天地图key'(注意是浏览器端的)
input_filename ="下载的数据.xls"
output_filename="result.xls"
txt = pd.read_excel(input_filename,engine="xlrd")
def getParam(searchWord):
url = 'http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"'+searchWord+'"}&tk='+application_key
try:
response = requests.request('GET',url)
response.encoding = 'utf-8'
location = response.json()
#print(location)
return location['location']
except Exception as ex:
print(ex)
csvFile = open('error.csv','a',encoding='utf-8')
csvFile.write(url+',')
return ''
shp_lat_list = []
shp_lon_list = []
for address in txt.values:
shape = getParam(address[4].strip())
#print(shape)
shp_lat_list.append(shape['lat'])
print(shp_lat_list)
shp_lon_list.append(shape['lon'])
txt['lat'] = shp_lat_list
txt['lon'] = shp_lon_list
txt.to_excel(output_filename)
里面某些参数或者变量需要结合自己的数据和表格情况进行适当的修改,以满足各自不同要求。
五、运行,批量获取坐标并存到表格里。
六、在ArcGIS中加载表格,添加xy事件,导出shp数据,进行后续分析。
总体来说,经过尝试,非常方便的将官方发布的文字记录搞成易于进行空间分析的空间数据,为下一步的数据分析做好了数据上的准备,分享给大家使用,不是啥宝贝,不喜勿喷。
七、注意:Pandas写入csv的那个函数不知道为什么一直异常,总是写的乱七八糟,乱码、列窜位等等,后来读取和写入我都换成了excel对应的函数就好用多了,我没有研究是为啥,不太关心那个,能完成我的目标就好,各位如果会搞的话可以自己再试试csv格式。
八、ArcGIS字段计算器的扩展:
理论上讲也可以直接在arcgis字段计算器中写入代码,直接进行计算获取经纬度数据。
基本思路:以文字地址字段为参数,循环request天地图服务地址,获取json对象,解析出lon和lat,然后赋值到经纬度字段。不过arcgis的字段计算器比较弱,可能有点麻烦,我就不试了,各位有兴趣自己试试。
- END -