查看原文
其他

Stata:批量获取经纬度数据

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会 · 因果推断实用计量方法

作者: 曹昊煜 (兰州大学)
邮箱: 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-

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

  • 1. 申请百度地图的秘钥

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

    • 2.1 测试网页

    • 2.2 经纬度批量获取

  • 3. 经纬度获取—cngcode 命令

    • 3.1 cngcode 命令

    • 3.2 Stata 范例

  • 4. 相关推文



在空间计量经济学中,空间权重矩阵的合理性直接决定了模型结果的有效性。同时,根据地理学第一定律,个体间距离越近,相关性也就越强。因此,学者通常会构造基于地理距离的空间权重矩阵。但是,上述目标的实现有赖于个体经纬度数据。

批量获取经纬度的方法有多种,例如,范巧老师曾在连享会直播课上推荐使用 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

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」

  • 专题:Stata命令
    • Stata:空间计量之用-spmap-绘制地图.md
  • 专题:倍分法DID
    • 倍分法(DID)的标准误:不能忽略空间相关性
  • 专题:空间计量
    • Stata:我和她离多远?基于百度地图API的地理距离计算
    • Stata空间计量:STAR-时空自回归模型
    • Stata:一文遍览Stata官方空间计量命令:sp系列命令
    • 刘迪:Stata空间溢出效应的动态图形-空间计量
    • 空间面板数据模型及Stata实现
    • 空间计量溢出效应的动态GIF演示
    • 空间权重矩阵的构建
    • 空间计量:地理加权归回模型-(GWR)-参数估计
    • 直播课 - 空间面板模型及动态设定
  • 专题:文本分析-爬虫
    • Stata爬虫-正则表达式:爬取必胜客
    • Stata: 正则表达式和文本分析
    • 在 Visual Studio (vsCode) 中使用正则表达式
    • 正则表达式语言 - 快速参考
  • 专题:Python-R-Matlab
    • Python: 使用正则表达式从文本中定位并提取想要的内容
    • Python 调用 API 进行地理编码
    • Python 调用 API 进行逆地理编码

课程推荐:因果推断实用计量方法
主讲老师:邱嘉平教授
🍓 课程主页https://gitee.com/lianxh/YGqjp

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存