
为了让大家更好的理解本文内容沪深配沪深配,欢迎各位培训班会员参加明晚 8 点的直播课:「使用 Stata 进行地理编码:地址解析经纬度、坐标转换 & 根据经纬度判断所处的省市区县」
由于高德地图接口的更新,之前的代码不再适用了,主要是两个更新:
高德地图的接口会根据一个地址返回多个结果;高德地图不再建议一次解析多个地址了,会返回混乱的结果;Stata 中可以使用 parallel 进行多线程解析,大大提高解析速度;如果需要进行大量的解析,可以联系李老师帮忙,费用参考这个:https://rstata.duanshu.com/#/course/6b44ce2712af47b6ba7b2a2fd74a4e68之前给大家讲解过根据地址解析经纬度并根据经纬度判断所处的省市区县的方法,不过那个方法效率较低,面对数百万地址的工作就显得力不从心了。今天再给大家介绍一套无比高效的解析流程。
这套工作流程包含下面几个过程:
使用高德地图地理编码接口解析(含多线程内容);反复重复上述过程,直到筛选出那些无法使用高德地图地理编码接口解析成功的地址;然后使用百度地图地理编码接口解析上面的操作没有成功的部分;合并所有的解析结果;GCJ02 坐标转换成 WGS84 坐标;使用地理计算根据经纬度判断所处的省市区县。下面就让我们以金融机构网点数据的地理编码为例进行讲解。
图片
读取并处理数据首先我们读取 xlsx 文件并选择前 10000 个观测值:
*- 设定工作目录 cd '~/Desktop/使用Stata进行地理编码:高德与百度接口/' import excel using '金融机构网点数据.xlsx', clear first foreach i of varlist _all { cap format `i' s}*- 选择前 1000 个keep in 1/1000save '金融机构网点数据', replace *- 生成 id 变量来标识观测值 use 金融机构网点数据, clear gen id = _n order id *- 选择感兴趣的变量keep id 机构名称 机构所在地 机构地址 地址代码申请高德地图和百度地图的密钥高德地图文档:https://lbs.amap.com/api/webservice/guide/api/georegeo百度地图文档:https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-base高德地图的 city 参数既可以是城市名称也可以是城市区划代码,百度地图的 city 参数只能是城市名称,所以我们需要准备两个 city 变量。
gen address = 机构地址gen citygd = 地址代码 gen citybd = 机构所在地 format address city* sreplace citybd = ustrregexs(1) if ustrregexm(citybd, '-(.*)')keep id 机构名称 address citybd citygd*- 地址里面不能出现 # 符号,替换掉replace address = subinstr(address, '#', '号', .)replace address = subinstr(address, ' ', '', .)save dfsim, replace使用高德地图解析
在这套工作流程中我们会优先使用高德地图地理编码接口进行解析,因为高德地图支持更高的 QPS(每秒请求的次数)。不过不幸运的是现在的高德和百度都只提供每日 5000 次的免费额度,难以进行大量的解析。
这里插播一条广告。如果大家需要大量的解析沪深配,可以考虑联系李老师帮忙解析。费用可以参考这个:https://rstata.duanshu.com/#/course/6b44ce2712af47b6ba7b2a2fd74a4e68
例如解析北京的十条地址:
use dfsim, clear keep if citygd == '1100'local address = ''forval i = 1/10{ local address = '`address'|`=address[`i']''}di '`address''local address = substr('`address'', 2, .)di '`address''*- URL 转码: percentencode.adopercentencode `address'*> 北京市丰台区南四环西路*> > 186号一区1号楼5层中国农业%E*> > 5亿策略提示:文章来自网络,不代表本站观点。