温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh
⛳ Stata 系列推文:
作者: 曹昊煜 (兰州大学)
邮箱: caohy19@lzu.edu.cn
编者按:本文内容参考自下文,特此致谢!
Source:Xue Y, Li C. Extracting Chinese geographic data from Baidu Map API[J]. Stata Journal , 2020, 20(4): 805-811. -Link1- -Link2-
目录
在空间计量经济学中,空间权重矩阵的合理性直接决定了模型结果的有效性。同时,根据地理学第一定律,个体间距离越近,相关性也就越强。因此,学者通常会构造基于地理距离的空间权重矩阵。但是,上述目标的实现有赖于个体经纬度数据。
批量获取经纬度的方法有多种,例如,范巧老师曾在连享会直播课上推荐使用 XGeocoding 软件,但由于某些原因,该软件目前已不能正常使用。在随后的学习中,我们发现获取经纬度是一个普遍的问题,并且仍有学员在连享会课程群中询问有关 XGeocoding 软件的问题。
当然,连享会也推出了如何获取经纬度的相关推文,详见「Stata:我和她离多远?基于百度地图API的地理距离计算」和「Python 调用 API 爬取百度 POI 数据」,但是对初学者或不懂 Python 的人并不是太友好。为此,本文将进一步介绍两种使用 Stata 批量获取经纬度的方法。
在工作开始之前,我们需要申请百度地图的秘钥,并且每位开发者可申请多个秘钥,每个秘钥每天都有访问限制。具体申请过程如下:
在本节正式介绍之前,需要先了解一些 “正则表达式” 相关的知识,具体可参考连享会推文「Stata: 正则表达式和文本分析」和「Stata爬虫-正则表达式:爬取必胜客」。
经纬度信息主要从如下网址获取:
http://api.map.baidu.com/geocoding/v3/?address=address&output=json&ak=BaiduKey
其中,需要修改的参数有两处:
以 “兰州大学” 为例,访问网址为:
http://api.map.baidu.com/geocoding/v3/?address=兰州大学&output=json&ak=CH8eakl6UTlEb1OakeWYvofh
若出现如下结果,则说明网址设定正确。其中,lng 对应经度,lat 对应维度。需要注意的是,这里的秘钥需要修改为自己申请的秘钥。
首先生成示例数据,具体代码如下:
clear all
input str15 Prov str15 City str15 Dis str60 Address str100 FullA str100 Location
"湖北省" "武汉市" "" "南湖大道182号中南财经政法大学" "中国湖北省武汉市南湖大道182号中南财经政法大学" "湖北省武汉市南湖大道182号中南财经政法大学"
"湖北省" "武汉市" "洪山区" "华中科技大学" "湖北省武汉市洪山区珞喻路1037号" "湖北省武汉市洪山区华中科技大学"
"湖北省" "" "" "武汉大学" "" "湖北省武汉大学"
"" "" "" "" "湖北省武汉市华中农业大学" "湖北省武汉市华中农业大学"
end
list Prov-Location
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Prov City Dis Address FullA Location |
|------------------------------------------------------------------------------------------------------------------------------------------------------|
1. | 湖北省 武汉市 南湖大道182号中南财经政法大学 中国湖北省武汉市南湖大道182号中南财经政法大学 湖北省武汉市南湖大道182号中南财经政法大学|
2. | 湖北省 武汉市 洪山区 华中科技大学 湖北省武汉市洪山区珞喻路1037号 湖北省武汉市洪山区华中科技大学|
3. | 湖北省 武汉大学 湖北省武汉大学|
4. | 湖北省武汉市华中农业大学 湖北省武汉市华中农业大学|
+------------------------------------------------------------------------------------------------------------------------------------------------------+
然后,批量爬取经纬度信息,具体代码如下:
gen websource = "" //生成保存网页的变量
local baidukey = "CH8eakl6UTlEb1OakeWYvofh" //修改为自己的秘钥
local n = _N
*循环爬取地址的网页信息
forvalues i = 1/`n'{
local address = Location[`i']
copy "http://api.map.baidu.com/geocoding/v3/?address=`address'&output=json&ak=`baidukey'" "`i'.txt", replace
replace websource = fileread("`i'.txt") in `i'
erase `i'.txt
}
gen longitude = ustrregexs(1) if ustrregexm(websource, "(?<=lng.:)(\d+.\d+)") //正则表达匹配经度,这里使用到了零宽断言
gen latitude = ustrregexs(0) if ustrregexm(websource, "(?<=lat.:)(\d+.\d+)") //正则表达匹配纬度
gen confidence= ustrregexs(1) if ustrregexm(websource, "(?<=nce.:)(\d+)") //定位精度
keep if longitude != ""
drop websource
destring longitude lati confidence, force replace // 将爬取结果转换为数字格式
list Location longitude latitude confidence
+--------------------------------------------------------------------------+
| Location longitude latitude confidence |
|--------------------------------------------------------------------------|
1. | 湖北省武汉市南湖大道182号中南财经政法大学 114.39224 30.480519 70|
2. | 湖北省武汉市洪山区华中科技大学 114.41983 30.518754 70|
3. | 湖北省武汉大学 114.37292 30.543803 70|
4. | 湖北省武汉市华中农业大学 114.36371 30.48178 70|
+--------------------------------------------------------------------------+
cngcode
命令由李春涛老师团队开发,可以获取个体不同层级的经纬度信息。
cngcode
命令安装:
ssc install cngcode, replace
cngcode
命令语法:
cngcode, baidukey(string) [options]
其中,必选项是 baidukey
,括号中需要填入有效的百度地图开放平台秘钥。其他选项包括以下内容:
province
:指定省份名称;city
:指定城市名称;district
:指定区县名称;address
:除省、市、区县以外的其他地址,具体到需要定位的名称;fulladdress
:指定完整的名称,该变量可以包含前面四个变量的所有信息,但也允许与分开的地址有所差异;latitude
:设定保存纬度的变量名称;longtitude
:设定保存经度的变量名称;coordtype
:设定返回的经纬度类型,可以使用 GCJ-02 经纬度、BD-90 经纬度、BD-90 坐标三类结果。这里使用同样的范例数据,cngcode
命令能够以三种方式批量获取地理信息,分别是使用分割的地址信息、完整的地址信息和二者结合的地址信息。
local baidukey = "CH8eakl6UTlEb1OakeWYvofh" //修改为自己的秘钥
*基于分割地址的经纬度获取结果
cngcode, baidukey(`baidukey') province(Prov) city(City) district(Dis) ///
address(Address) longitude(lon1) latitude(lat1)
*基于完整数据的经纬度获取结果
cngcode, baidukey(`baidukey') fulladdress(FullA) ///
longitude(lon2) latitude(lat2)
*基于二者联合的经纬度获取结果
cngcode, baidukey(`baidukey') province(Prov) city(City) district(Dis) ///
address(Address) fulladdress(FullA) longitude(lon3) latitude(lat3)
list lon1-lat3
+-----------------------------------------------------------------------+
| lon1 lat1 lon2 lat2 lon3 lat3 |
|-----------------------------------------------------------------------|
1. | 114.39224 30.480519 114.39224 30.480519 114.39224 30.480519 |
2. | 114.41983 30.518754 114.4199 30.513473 114.41983 30.518754 |
3. | 114.37292 30.543803 . . 114.37292 30.543803 |
4. | . . 114.36371 30.48178 114.36371 30.48178 |
+-----------------------------------------------------------------------+
从 cngcode
命令的结果上看,同一地址的不同描述方法可能导致结果的微小差异。因此,在使用 cngcode
命令时,通常可以采用分割地址信息和完整地址信息相结合的方式,cngcode
命令会比较两种地理信息的获取结果,保留代表性更强的地理信息。
Note:产生如下推文列表的 Stata 命令为:
lianxh 地理 距离 空间 正则, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh