在写论文搞数据的过程中遇到的问题,记录一下小白快速解决办法。
1.如果只需要地址的经纬度数据,直接用这个网站地理编码 (百度) 地址转经纬度 - 批量工具网 (piliang.tech),里面有百度和高德地图编码,个人也用python和高德地图匹配了一遍,结果是靠谱的。
所需工具:网页,将地址从excel里粘贴过来就行。
2.如果需要识别这个地址所在省、市、区以及代码等问题。
方法一(不推荐,存在坐标系转换问题):先用第一步识别出经纬度,然后用Arcgis生成点数据后跟区县数据用identity识别一下就会用点所在区县的信息。
所需工具:Arcgis,带有地理信息的区县地图
步骤:
- 文件>添加数据-把含有经纬度坐标的数据导入Arcgis,如果出现没有注册类等问题,可能是因为excel版本过高,选择97-03版的就好了
- 在表格右键>显示XY数据>X经度,Y纬度
- 对生成的事件右键>数据>导出数据>添加到当前,如果不进行这一步,会没有OID,无法进行标识
- 加载地图>arctoolbox>分析工具>叠加分析>标识
- 新生成的表就包含了标识的内容,右键打开属性表就可以看到
方法二:用python和高德地图直接返回省、市、区等信息
所需工具:高德开放平台 | 高德地图API (amap.com),python(下载Anaconda用spyder,选这个是因为里面含有很多打包好的函数可以直接用,或者熟练运用python的朋友可以随心意)
解决办法主要分为两步
1.从高德地图获取key
2.用python进行地址解析,返回经纬度
- 高德地图API注册,在我的应用里面申请key,选web服务
- 打开spyder,输入以下代码,运行快捷键shift+enter,选中前三行,右下角没有报错就证明可以引用
import requests
import json
import codecs
from openpyxl import Workbook
wb = Workbook()
sheet = wb.active
sheet.title="qiang"
def get_location(address,i):
print(i)
url = "http://restapi.amap.com/v3/geocode/geo"
data = {'key':'*****',#在高德地图获得的key
'address': address
}
r = requests.post(url,data=data).json()
sheet["A{0}".format(i)].value = address.strip('\n')
print(r)
if r['status']=='1':
if len(r['geocodes'])>0:
GPS = r['geocodes'][0]['location']
sheet["B{0}".format(i)].value='['+GPS+']'#这里获取经纬度
citycode = r['geocodes'][0]['citycode']
sheet["E{0}".format(i)].value='['+citycode+']'#这里获取城市行政区划代码
adcode = r['geocodes'][0]['adcode']
sheet["G{0}".format(i)].value='['+adcode+']'#这里获取区县行政区划代码
else:
sheet["B{0}".format(i)].value='[]'
else:
sheet["B{0}".format(i)].value='none'
f=codecs.open(r"D:\import.csv","r","utf-8")#导入文件
i=0
while True:
line=f.readline()
i=i+1
if not line:
f.close()
wb.save(r"D:/results.csv")#导出位置
break
get_location(line,i)
- 导出csv的经纬度坐标为[,]格式,用excel>数据>分列,可以提取出来
注:不论是第一种方法还是第二种方法,都有识别精确度的问题,批量识别以后建议还是浏览一遍有没有异常。咨询过身边的同学老师,普遍是直接用火星坐标系定位到WGS84里面,但是个人认为有些不精准,关于火星坐标系和WGS84的转换另写一篇。