高德地图的 city 参数既可以是城市名称也可以是城市区划代码,百度地图的 city 参数只能是城市名称,所以我们需要准备两个 city 变量。
gen address = 机构地址 gen citygd = 地址代码 gen citybd = 机构所在地 format address city* %20s replace citybd = ustrregexs(1) if ustrregexm(citybd, "-(.*)") keep id 机构名称 address citybd citygd
*- 准备空变量 clear gen str100 formatted_address = "" gen str100 province = "" gen str100 citycode = "" gen str100 city = "" gen str100 district = "" gen str100 adcode = "" gen str100 location = "" gen str100 level = "" *- 处理 json 数据 insheetjson formatted_address province citycode city district adcode location level using "temp.json", columns("formatted_address""province""citycode""city""district""adcode""location""level") tableselector("geocodes") compress
clear gen str100 formatted_address = "" gen str100 province = "" gen str100 city = "" gen str100 district = "" gen str100 location = "" gen str100 level = "" gen str100 id = "" *- 循环 json1 文件夹下的所有文件 local files: dir"json1" files "*.json" localn: word count`files'
foreach i in`files' { insheetjson formatted_address province city /// district location level using "json1/`i'", /// columns("formatted_address""province"/// "city""district""location""level") /// tableselector("geocodes") offset(`=_N') replace id = "`i'"ifmi(id) }
compress
foreach i of varlist _all { capformat`i' %10s }
order id replace id = subinstr(id, ".json", "", .) destring id, replace
和原始数据匹配:
mergem:1 id using dfsim keepif _m == 3 drop _m order id 机构名称 address citygd citybd
*- 根据经纬度可以判断所处的省市区县,所以这里先删去省市区县信息 keep id location save"解析结果1", replace
没有成功的:
use dfsim, clear merge 1:1 id using 解析结果1 keepif _m == 1 drop _m
使用百度地图地理编码接口解析
剩下的这些使用百度地图地理编码接口解析:
use dfsim, clear merge 1:1 id using 解析结果1 keepif _m == 1 drop _m replace address = address + 机构名称 drop location compress save dfsim2, replace
use dfsim2, clear capmkdir"json2" forvalg = 1/`=_N' { percentencode `=address[`g']' local add = "`r(percentencode)'" percentencode `=citybd' local cty = "`r(percentencode)'" local url = "https://api.map.baidu.com/geocoding/v3/?address=`add'&output=json&ak=h4jN43d3ajnnXGzBHmIowERWwM2o6PIe&ret_coordtype=gcj02ll&city=`cty'" copy"`url'""json2/`=id[`g']'.json" }
*- 看起来都成功了 clear gen str100 lng = "" gen str100 lat = "" gen str100 precise = "" gen str100 confidence = "" gen str100 comprehension = "" gen str100 level = "" gen str100 id = ""
*- 循环 json2 文件夹下的所有文件 local files: dir"json2" files "*.json" localn: word count`files' foreach i in`files' { insheetjson lng lat precise confidence /// comprehension level /// using "json2/`i'", table("result") /// columns("location:lng""location:lat""precise"/// "confidence""comprehension""level") offset(`=_N') replace id = "`i'"ifmi(id) } compress order id replace id = subinstr(id, ".json", "", .) destring id, replace gen location = lng + "," + lat
*- 这里也可以根据数据中的变量判断解析情况。 keep id location save"解析结果2", replace
合并所有的成功结果
use 解析结果1, clear append using 解析结果2 gsort id unique id split location, parse(,) drop location ren location1 经度 ren location2 纬度 destring 经度 纬度, replace
GCJ02 坐标转换成 WGS84 坐标
附件中的 gcj02towgs84.ado 命令可以直接完成这个操作:
gcj02towgs84, lon(经度) lat(纬度) save finalresult, replace
根据经纬度判断所处的省市区县
之前介绍过这个操作,不过不是 Stata 完成的,最近发现原来 Stata 中也有这种命令:geoinpoly。
安装:
ssc install geoinpoly
把 shp 文件转换成 dta 文件:
shp2dta using 2021行政区划/县.shp, database(county_db) coordinates(county_coord) genid(ID) replace
然后就可以使用该命令进行经纬度判断省市区县的操作了:
use finalresult, clear geoinpoly 纬度_WGS84 经度_WGS84 using county_coord.dta ren _ID ID mergem:1 ID using county_db keepif _m == 3 drop _m foreach i of varlist _all { capformat`i' %10s } *- 这样我们就完成了判断所处省市区县的操作 save finalresult2, replace
评论