查看原文
其他

cngcode和cnaddress新鲜出炉!

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:宁刘莹

文字编辑:朱巧利

技术总编:薛   原


爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~



此前,由李春涛教授带领爬虫俱乐部成员开发完成的chinagcode和chinaaddress命令帮助了无数用户方便快捷地将中文地址和对应的经纬度进行转换。可是前一段时间,小编收到一些粉丝发来的邮件,询问这两个命令为什么不能正常使用了。查询后发现百度地图开放平台将正逆地理编码的接口文档更新到了3.0版本,而之前的两个命令仍然使用的是2.0版本的接口文档,这就使得新申请的密钥无法完成经纬度与中文地址的转换。现在,使用百度地图API 3.0版本接口文档的cngcode和cnaddress以崭新的面貌问世啦!

1、  安装命令


ssc install cngcode


安装完毕之后可以通过help来查看语法和用法,其语法如下:

 

cngcode, baidukey(string) [options]

cnaddress, baidukey(string) lat(varname) long(varname) [options]

 

为了方便大家使用,这两个命令的语法与之前的chinagcode和chinaaddress是相同的。
其中cngcode用于将地址转换为经纬度,而cnaddress反之。

2、  申请密钥


在使用这个命令前,需要前往百度地图开放平台(http://lbsyun.baidu.com)申请密钥。

 


首先需要点击注册并填写个人信息,注册后需要等待3-5天,审核完成后会收到短信提示。然后再进入这个网站,点击申请密钥,再点击创建应用,输入相关信息就可以获得密钥。

注:我们在help文件中用“your secret key”代替密钥,是无法直接运行的,仅是说明如何定义baidukey这个选项。


申请到了密钥之后,就可以开始提取经纬度的操作了。

 

3、  定义地址


定义地址有两种方式,一种是通过定义cngcode的province、city、district、address等选项,获得一个省、市、区、地址的组合,并以此来提取经纬度。例如:


clear allinput str10 country str10 prov str10 city str10 dist str60 addrstr100 fullad"中国" "湖北省" "武汉市" "" "南湖大道中南财经政法大学" "中国湖北省武汉市南湖大道中南财经政法大学""中国" "湖北省" "" "" "武汉大学" "中国湖北省武汉大学""中国" """北京市" "海淀区" "北京大学" "中国北京市海淀区北京大学""中国" "广东省" "深圳市" "罗湖区" "深南东路5047号" "中国广东省深圳市罗湖区深南东路5047号""中国" "浙江省" "东阳市" "" "浙江花园生物高科股份有限公司" "中国浙江省东阳市浙江花园生物高科股份有限公司""中国" """上海市" "嘉定区" "育绿路253号" "中国上海市嘉定区育绿路253号"endcngcode, baidukey(your secret key) province(prov) city(city)district(dist) address(addr) coordtype(bd09ll)list


这里的coordtype选项是用来选择坐标系的,为了使cnaddress和cngcode的结果一致,我们统一使用的坐标系是bd09ll(百度经纬度坐标),可选坐标系有bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标,仅限中国)、wgs84ll(GPS经纬度)。

 

这样就能得到相应地址的经纬度了。



除此之外,我们还可以通过cngcode的fulladdress选项来定义地址,即定义一个完整的地址。由于我们已经在内存里输入了完整的地址,因此直接在选项内填入完整地址的变量名即可:


cngcode, baidukey(your secret key) fulladdress(fullad) coordtype(bd09ll)list
只要地址输入足够精确,得到的经纬度是一样的。



在这个命令中,当同时定义了两种格式的地址,默认情况下是先从省市区地址的组合中提取经纬度,当这个组合的地址提取不到经纬度时,会换成完整地址来提取。但如果我们添加了ffirst这个选项,则会先从完整地址中提取经纬度,提取不到时会换成省市区地址的组合。

4、  反向转换

 

接下来,我们只保留cngcode输出的经纬度,然后再用cnaddress来得到地址:

keep longitude latitudecnaddress, baidukey(40prmtviIT72hPZLGKktyBjVXxUOGDAx) lat(latitude) long(longitude) coordtype(bd09ll)list


这样就输出了国家、城市和街区等地址。
 
那如果我们再把cnaddress得到的地址转换成经纬度呢?

keep country province city district street addresscngcode, baidukey(40prmtviIT72hPZLGKktyBjVXxUOGDAx) province(prov) city(city) district(dist) address(addr) coordtype(bd09ll)list


经纬度又被成功地输出了:



我们来对比一下两次的经纬度:


图1:第一次使用cngcode得到的经纬度


图2:第二次使用cngcode得到的经纬度


我们可以看到,虽然部分地址的经纬度不完全相同,但差距非常微小,基本上可以忽略不计。Victory!
 
最后,小编提醒大家,以前申请的密钥仍然使用的是2.0版本的接口文档,还可以继续使用chinagcode和chinaaddress。因此,为了方便大家使用,我们仍然保留了这两个命令。

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
数据可视化之地理图   
“气功”研究哪家强
数据长、宽整型之另辟蹊径
10分钟带你走进宝藏数据库BvD
实战演练——爱婴医院中莆田系医院数据分析(二)
实战演练——爱婴医院中莆田系医院数据分析(一)

给你一个贴心的reshape应用

asrol命令——让你的描述性统计信息滚动起来
Python带你看文献—xpath抓取知网文献
您有一份天气预报待签收 
听说会Stata的人,数学不会太差?
批量修改路径
妙用正则表达式--Python中的re模块
豆瓣电影评分之数据爬取与可视化的实现 
为了辅导作业,这位家长竟然...
走进列表的世界——列表方法(二)
走进列表的世界——列表方法(一)

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

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

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