Stata:批量获取经纬度数据-空间计量

发布时间:2021-03-12 阅读 10097

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

⛳ 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 批量获取经纬度的方法。

1. 申请百度地图的秘钥

在工作开始之前,我们需要申请百度地图的秘钥,并且每位开发者可申请多个秘钥,每个秘钥每天都有访问限制。具体申请过程如下:

  • 第二步:将网页下拉至页面最下方,即可看到获取百度地图开放平台密钥的流程。此时,点击 “立即注册” 进入创建应用界面;
  • 第三步:在创建应用界面填写 “应用名称” 和 “IP 白名单”。其中,应用名称可以任意填写,IP 白名单可以限制访问的 IP 地址。如果不想对访问进行限制,可以在 IP 白名单中填写 “0.0.0.0/0”;
  • 第四步:在页面底端,点击 “提交” 获取密钥。

2. 经纬度获取—正则表达式

在本节正式介绍之前,需要先了解一些 “正则表达式” 相关的知识,具体可参考连享会推文「Stata: 正则表达式和文本分析」「Stata爬虫-正则表达式:爬取必胜客」

2.1 测试网页

经纬度信息主要从如下网址获取:

http://api.map.baidu.com/geocoding/v3/?address=address&output=json&ak=BaiduKey

其中,需要修改的参数有两处:

  • 一是在 address 后面填入需要爬取的地址信息;
  • 二是在 ak 后面加入申请的百度地图开放平台密钥。

以 “兰州大学” 为例,访问网址为:

http://api.map.baidu.com/geocoding/v3/?address=兰州大学&output=json&ak=CH8eakl6UTlEb1OakeWYvofh

若出现如下结果,则说明网址设定正确。其中,lng 对应经度,lat 对应维度。需要注意的是,这里的秘钥需要修改为自己申请的秘钥。

2.2 经纬度批量获取

首先生成示例数据,具体代码如下:

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|
     +--------------------------------------------------------------------------+

3. 经纬度获取—cngcode 命令

cngcode 命令由李春涛老师团队开发,可以获取个体不同层级的经纬度信息。

3.1 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 坐标三类结果。

3.2 Stata 范例

这里使用同样的范例数据,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 命令会比较两种地理信息的获取结果,保留代表性更强的地理信息。

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 地理 距离 空间 正则, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh