
New! 搜推文,找资料,用
lianxh
命令:
安装:ssc install lianxh, replace
使用:lianxh 合成控制
lianxh DID + 多期, w


作者:谢嘉伟 (赣南师范大学)
邮箱:1221249017@gnnu.edu.cn
编者按:本文主要内容摘自下文,特此致谢!
Source:Xue, Y., & Li, C. (2020). Extracting Chinese geographic data from Baidu Map API. The Stata Journal, 20(4), 805-811. -Link- -PDF-
- Title:Stata:更适合中国的坐标命令-cngcode-cnaddress
- Keywords:Sata 绘图,cngcode,cnaddress,BD09II,百度地图,中国地理编码
1. 引言
地理信息由于其基本性质,在科学研究中发挥着越来越重要的作用。有时我们需要相关程序处理地理数据,将人类语言转换为地理位置或相反操作。然而,目前大多数地图默认都不是为中文用户设计的,中文地址无法正确处理和及时更新。此外,由于国家安全和意识形态的原因,其中一些电子地图在中国无法访问。而且这些地图服务通常不会以中文显示。由于中国是世界上人口最多的国家,在科研领域有越来越多的人需要处理中文地址或地理位置,这就需要 Stata 中增加新的命令。
本文我们介绍两个新的命令 cngcode
和 cnaddress
,它们可以配合百度地图 API 的应用来填补这一空白。
2. 准备工作
在正式操作前,我们需要了解百度独有的 BD09II 坐标系统和百度地图 API 的获取流程。
2.1 BD09II 大地坐标系
BD09II 是百度专为其在中国的地图和导航服务而开发的大地坐标系统,属于百度开发的 BD09 坐标系统的一部分,通常用于百度地图相关服务和 API 中。BD09II 是 BD09 坐标系的一种内嵌版本,常用于在线地图和 API 数据传输场景。与 BD09 的主要区别在于,BD09II 是一个更加精简的内部实现版本。
BD09II 是 GCJ-02 (火星坐标系) 的一种变换形式,而 GCJ-02 源自 WGS-84 系统。这意味着 BD09II 坐标间接链接到 WGS-84 系统。BD09II 的目标是提高地理空间数据的准确性、确保与百度地图技术的兼容性,并遵守中国政府对地理数据的限制。
加密转换:BD09II 在 GCJ-02 坐标上应用了额外的转换层。此转换涉及复杂的数学算法组合,包括三角运算和指数运算,以混淆精确的地理信息。从 WGS-84 到 GCJ-02,再到 BD09II 的信息混淆转换,既符合中国国家安全需求,也为商业用途提供了精确的地图绘制。
投影系统:BD09II 主要使用墨卡托投影 (Mercator Projection),该投影基于 Web 的地图绘制应用程序。这确保了与全球地图绘制标准的兼容性,同时保持其专有的转换方法。
偏移性质:与 GCJ-02 一样,BD09II 也在地理坐标中引入了偏移。这种偏移确保原始地理数据不能直接使用,除非通过专有转换回 GCJ-02 或 WGS-84。
在实际应用中,BD09II 是百度地图及其相关服务的核心,其提供的精确定位对于需要地理空间数据的 AR 和 VR 应用至关重要。因此,许多集成百度地图的第三方应用程序都依赖 BD09II 来提供精确的位置服务。本文所介绍的命令依赖的 API 正是基于这一坐标系进行运作。
2.2 百度地图 API 获取
cngcode
和 cnaddress
的使用必须获取百度地图 API Key,该 API Key 在百度地图开放平台上注册。以下是具体的申请 API Key 的详细流程。
2.2.1 Step1:注册登录百度账号
首先,用户必须注册一个百度账号。这是百度为所有用户使用百度地图开放平台资源设定的前提条件。具体步骤如下:用户需要访问百度主页,点击右上角的【登录】按钮,在空白处填写账号和密码 (见下图)。

若用户尚未拥有百度账号,可以点击上图主界面右上角的【登录】,并点击弹窗右下角的【立即注册】按钮,进入百度账号注册页面。在百度账号注册页面,用户需要按照页面提示输入所需信息:用户名、手机号、密码和手机验证码等 (见下图)。

注册成功后,用户可以访问官方网站。右上角会自动显示登录信息,表示百度账号已注册成功,可以进行前期工作了 (见下图)。

2.2.2 Step2:开发者认证
要获得 API 额度,用户除了需要百度账号,还需进行开发者身份注册。如上图所示,用户首先点击右上角的【控制台】,进入开发者注册界面。然后,如下图所示,按要求填写姓名、手机号码及验证码、企业名称和邮箱等相关信息。这种注册方式能够提供更多 API 额度。

如果用户希望作为个人开发者注册,则需要在上图的下方点击【我不是企业员工】或【我是学生】按钮来完成注册。以学生身份注册为例,用户需要提供以下信息:姓名、手机号码、个人邮箱、学校名称、专业、毕业日期、身份证号码、认证地址以及学生证的照片等验证材料。此外,还需提交使用 API 的具体原因 (使用场景) (见下图)。在完成所有信息填写并通过人脸识别后,系统会进入审核阶段,此过程可能需要一些时间来生成最终的认证结果。

2.2.3 Step3:申请百度地图 API Key
开发者认证流程完成后,用户可以点击【应用管理】-【我的应用】-【创建应用】来申请新的百度地图 API 密钥供 cngcode
使用 (见下图)。

点击【创建应用】后弹出的 API key 申请表中,【应用类型】默认为【服务端】选项。往下拉界面填写 IP 白名单中的电脑 IP 地址,以确保只有申请者自己才能使用这个 key。如果希望授权后任何 IP 地址的电脑都能使用这个 key,则可以在白名单中填写 0.0.0.0/0 (见下图)。申请 key 完成后,控制台相应页面会显示新的 API key,用户可以将该 key 复制到任何需要使用的地方。

最后,我们可以在控制台的【额度管理】-【我的额度】部分查看各应用每日调用服务次数上限。如下图所示,对于个人开发者用户而言,目前只有部分服务能够免费申请,额度为每日 5,000 次地理编码服务和 5,000 次路由服务,其他服务则需要根据实际需求购买。而对于企业用户,额度为每日 3,000,000 次地理编码服务和 300,000 次路线规划服务。

3. 命令使用说明
在完成前期准备工作并成功获取百度地图 API Key (如:CH8eakl6UTlEb1OakeWYvofh,此密钥仅为示例用途) 后,我们可以开始使用 cngcode
和 cnaddress
了。
需要再次说明的是,由于百度地图网站的源代码是 UTF-8 编码的,因此 cngcode
和 cnaddress
需要 Stata 14 或更高版本。使用 cngcode
将中文地址转换为经纬度定义的位置时,用户可以通过两种方式指定地址:离散模式或完整地址模式。在离散模式下,地址信息被分解为多个变量,包括省、市、区、街道名称和编号。在完整地址模式下,只有一个字符串变量,其中包含上述所有信息。
有时,我们既有离散地址,又有完整地址。在这种情况下,用户可以同时指定两者,即组合模式。但是,当同时使用两者但只有一个地址能返回有意义的位置时,cngcode
将选择有效的那个。如果两个地址都有效但返回的位置略有不同,则 cngcode
的默认选择是使用离散地址产生的位置。用户可以通过使用 ffirst
选项更改此优先级,这样在完整地址和离散地址的位置不同时,它将返回完整地址的位置。
当使用 cnaddress
时,用户将获得以下信息:省份、城市、区、街道、完整地址以及由经度和纬度定义的位置的语义描述。
最后,命令的准确性依赖于百度地图的准确性,而百度地图的准确性又取决于指定地址的方式。如果地址不够具体 (例如,我们指定某所大学的名称,而该大学在不同城市或省份有多个校区),百度地图可能仅返回其中一个校区的位置,这可能不是用户所关心的校区。
4. 语法格式
* 借助百度地图 API 提取中文地址的经纬度
cngcode, baidukey(string) [options]
* cnaddress 是 cngcode 的逆命令。使用百度地图 API 将位置(经度和纬度对)转换为相应的中文地址
cnaddress, baidukey(string) lat(varname) long(varname) [options]
我们先介绍 cngcode
的选项:
baidukey(string)
:为百度地图 API Key,为必填项。province(varname)
:指定包含省份名称的字符串变量。city(varname)
:指定包含城市名称的字符串变量。district(varname)
:指定包含地区名称的字符串变量。address(varname)
:指定包含地址的字符串变量。fulladdress(varname)
:指定包含完整地址的字符串变量。latitude(newvar)
:当用户想要输出包含纬度的变量时,此项是必需的。longitude(newvar)
:当用户想要输出包含经度的变量时,此项是必需的。coordtype(string)
:当用户想要指定输出的坐标类型时,此项是必需的:gcj02ll
:表示获得 GCJ-02 经度和纬度。bd09ll
:表示获得 BD-09 经度和纬度。bd09mc
:表示获得 BD-09 公制坐标。
ffirst
如果组合地址产生的位置与完整地址返回的位置不同,则ffirst
指定完整地址的位置为第一优先级。
5. cngcode 示例
. net get dm0104, from(http://www.stata-journal.com/software/sj20-4) replace
. use example.dta, clear
根据前文,cngcode
有三种方式获取地址:
基于离散的地址变量
. * 基于离散的地址变量
. cngcode, baidukey(CH8eakl6UTlEb1OakeWYvofh) province(Prov) city(City) ///
> district(Dis) address(Address) longitude(lon1) latitude(lat1)
. list lon1 lat1
+-----------------------+
| lon1 lat1 |
|-----------------------|
1. | 114.39979 30.482972 |
2. | 114.42592 30.519116 |
3. | 114.36235 30.558535 |
4. | . . |
+-----------------------+
. * 基于完整的地址变量
. cngcode, baidukey(CH8eakl6UTlEb1OakeWYvofh) fulladdress(FullA) ///
> longitude(lon2) latitude(lat2)
+-----------------------------------------------+
| lon1 lat1 lon2 lat2 |
|-----------------------------------------------|
1. | 114.39979 30.482972 114.39979 30.482972 |
2. | 114.42592 30.519116 114.42016 30.515342 |
3. | 114.36235 30.558535 . . |
4. | . . 114.36371 30.48178 |
+-----------------------------------------------+
. * 将 1 和 2 组合在一行命令中
. cngcode, baidukey(CH8eakl6UTlEb1OakeWYvofh) 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.39979 30.482972 114.39979 30.482972 114.39979 30.482972 |
2. | 114.42592 30.519116 114.42016 30.515342 114.42592 30.519116 |
3. | 114.36235 30.558535 . . 114.36235 30.558535 |
4. | . . 114.36371 30.48178 114.36371 30.48178 |
+-----------------------------------------------------------------------+
在组合地址模式下,cngcode
将尝试为离散地址和完整地址计算两个位置。如果其中一个地址没有产生有意义的位置,它将被自动忽略。然而,如果两个地址都产生有意义的位置,则默认选择是报告从离散地址生成的位置。此外,我们可以使用选项 ffirst
来报告组合模式下完整地址生成的位置。命令指定如下:
. cngcode, baidukey(CH8eakl6UTlEb1OakeWYvofh) province(Prov) city(City) ///
> district(Dis) address(Address) fulladdress(FullA) ffirst ///
> longitude(lon4) latitude(lat4)
. list lon1 - lat2 lon4 lat4
+-----------------------------------------------------------------------+
| lon1 lat1 lon2 lat2 lon4 lat4 |
|-----------------------------------------------------------------------|
1. | 114.39979 30.482972 114.39979 30.482972 114.39979 30.482972 |
2. | 114.42592 30.519116 114.42016 30.515342 114.42016 30.515342 |
3. | 114.36235 30.558535 . . 114.36235 30.558535 |
4. | . . 114.36371 30.48178 114.36371 30.48178 |
+-----------------------------------------------------------------------+
6. cnaddress 示例
相对于 cngcode
的语法,cnaddress
的语法更直观。这里我们使用前面得到的两个变量 lat4 和 lon4,它们表示位置的经纬度。获取相应中文地址的简单命令如下:
. cnaddress, baidukey(CH8eakl6UTlEb1OakeWYvofh) latitude(lat4) longitude(lon4)
上述命令输出的是离散的地址类型,包括省名、城市、区、街道和完整的一体化地址。不同类型的坐标 (例如 WGS-84、GCJ-02 和 BD-09) 到给定位置的纬度和经度有所不同。我们可以在选项 coordtype()
中指定坐标类型,默认情况下为 bd09ll
。
. cnaddress, baidukey(CH8eakl6UTlEb1OakeWYvofh) latitude(lat4) longitude(lon4) coordtype(wgs84ll)
7. 总结
在 cngcode
和 cnaddress
命令发布之前,中国的 Stata 用户很难处理中国的地理信息,这两个命令填补了这一空白。为了使用命令,本文介绍了 BD09II 坐标系和百度地图 API,以方便读者使用。这些信息对交通、教育、环境和经济领域的研究人员很有用。此外,未来还有很多工作要做。我们希望看到更多的研究人员投入时间和精力到这个领域,以促进使用 Stata 软件在某些领域进行更深入的研究。
8. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh 地图, m
安装最新版lianxh
命令:
ssc install lianxh, replace
- 专题:Stata绘图
- 万莉, 2021, Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图, 连享会 No.560.
- 专题:Stata命令
- 万莉, 2020, Stata:空间计量之用-spmap-绘制地图, 连享会 No.401.
- 专题:空间计量-网络分析
- 冷萱, 2021, Stata:我和她离多远?基于百度地图API的地理距离计算, 连享会 No.509.
- 张弛, 2024, Stata 绘图:用 geoplot 绘制中国地图, 连享会 No.1401.
- 彭显耿, 2020, GIS地图制作栅格计算器的应用, 连享会 No.475.
- 浦进博, 2024, Stata地图:geoboundary-轻松获取全球地图数据, 连享会 No.1527.
- 浦进博, 邓铨雄, 2024, Stata绘图:地图神器geoplot, 连享会 No.1383.
- 专题:Python-R-Matlab
- 王卓, 2022, Python:绘制动态地图-pyecharts, 连享会 No.922.
- 王卓, 2024, Stata绘图:政治关联可视化, 连享会 No.1428.
- 王卓, 2024, Stata绘图:政治关联可视化-B612, 连享会 No.1427.
- 肖蕊, 2022, Stata:地图绘制命令介绍-maptile, 连享会 No.925.
- 谢嘉伟, 2025, Stata 地图:cntraveltime-助你足不出户丈量中国, 连享会 No.1539.
- 陈卓然, 2022, Stata绘图:绘制二维地图和中国地图-geo2xy, 连享会 No.984.

资源共享
- 连享会资料 ……
- 在线视频:lianxh-class.cn
- Stata 33 讲,100 万+ 播放,Stata 入门必备,公开课
- 直击面板数据模型,10 万+ 播放,白话面板模型,公开课
- … more …
- 论文复现和数据
- 主题分类
- 热门推文

尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。
请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。
我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

关于我们
- Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。more……
- 扫码加入连享会微信群,提问交流更方便
