Stata:更适合中国的坐标命令-cngcode-cnaddress
2025-03-18
谢嘉伟
1541

连享会   主页 || 推文 || 知乎 || B 站 || 在线课堂

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 中增加新的命令。

本文我们介绍两个新的命令 cngcodecnaddress,它们可以配合百度地图 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 获取

cngcodecnaddress 的使用必须获取百度地图 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,此密钥仅为示例用途) 后,我们可以开始使用 cngcodecnaddress 了。

需要再次说明的是,由于百度地图网站的源代码是 UTF-8 编码的,因此 cngcodecnaddress 需要 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 |
    +-----------------------------------------------+
. * 将 12 组合在一行命令中
. 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 的语法更直观。这里我们使用前面得到的两个变量 lat4lon4,它们表示位置的经纬度。获取相应中文地址的简单命令如下:

. 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. 总结

cngcodecnaddress 命令发布之前,中国的 Stata 用户很难处理中国的地理信息,这两个命令填补了这一空白。为了使用命令,本文介绍了 BD09II 坐标系和百度地图 API,以方便读者使用。这些信息对交通、教育、环境和经济领域的研究人员很有用。此外,未来还有很多工作要做。我们希望看到更多的研究人员投入时间和精力到这个领域,以促进使用 Stata 软件在某些领域进行更深入的研究。

8. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 地图, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

推荐课程一:

推荐课程二:

推荐课程三:

资源共享


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


关于我们

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

最新课程:

A. 2025 暑期班:连玉君+张宏亮

B. 社会网络分析:杨张博

C. 政策优化和机制分析:杨海生

D. AI+学术研究专题:杨阳

E. ⚡ 系列公开课

  • 共八次:Python环境配置; 大语言模型应用; IV 估计; 微观数据清洗; 中介效应 (查看)
  • 参与方式: 网络直播 (7.3-24 日),扫码进群即可参与

FAQ往期课程板书和答疑文档

选题征集,点击 此处 或者扫码填写问卷留下您的宝贵意见,感谢!


NEW!视频课堂lianxh-class.cn

⚡ 新版 lianxh 命令:使用说明
. ssc install lianxh, replace
. lianxh 多期DID

ihelp:帮助文件 PDF 版
. ssc install ihelp, replace
. ihelp xtreg


lianxh_cn_saoma

连玉君 · Stata 33 讲 - 免费
  o 点击观看dofile 下载, --Book--