查看原文
其他

定位神器——cngcode

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

本文作者:方   言

文字编辑:李婷婷

技术总编:余术玲

爬虫俱乐部云端课程

爬虫俱乐部于2020年7月在线上举办的Stata与Python编程技术训练营已圆满结束。应广大学员需求,我们的课程现已在腾讯课堂双双上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠劵!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元
提到定位,通常大家借助的是地图的定位功能,但是如果我们想要一次性获取多个地址的地理位置,Stata软件中的cngcode命令会比地图要高效的多,这款神器——cngcode(China Geographic Code)命令,是一款强大的地理定位命令,原称为chinagcode,该命令可以从百度地图API中提取中文地址的经纬度。与该命令同时发布的还有chinaaddress,现为cnaddress命令,是cngcode的反向命令,它使用百度地图API将一个位置(经纬度)转换成相应的中文地址。今天,我们主要介绍的是cngcode命令~

1、安装


cngcode是Stata的外部命令,因此需要我们在使用之前进行安装,直接通过 ssc install cngcode即可安装,如图显示的就是命令安装成功:

在安装完成后,通过help cngcode就可以查看该命令的相关内容。

2、申请密钥


大家在使用这个命令前,需要前往百度地图开放平台(http://lbsyun.baidu.com)申请密钥。进入网页后点击控制台:

登录百度账号,成功登陆后,点击应用管理——我的应用——创建应用

进入到界面中,在应用名称中输入名称,这里以“我的密钥”进行命名,接着在IP白名单中根据网页提示输入默认参数,最后点击提交即可获取密钥。如果没有百度密钥,是无法正常使用这个程序的。当你申请到了密钥之后,就可以开始提取经纬度的操作了。


3、语法


cngcode, baidukey(string) [options]
cngcode的常用选项列举如下:

province(varname) 指定包含省名称的字符串变量。

city(varname)  指定包含城市名称的字符串变量。

district(varname) 指定包含地区名称的字符串变量。

address(varname) 指定包含地址的字符串变量。

fulladdress(varname)  指定包含完整地址的字符串变量。

latitude(newvar)  指定包含纬度的变量名称,则需要纬度。

longitude(newvar)   指定包含经度的变量名称,则需要使用经度。

ffirst 如果从组合地址得到的位置与从完整地址返回的位置不同,则ffirst首先指定来自完整地址的位置。

4、定义中文地址


我们为大家介绍两种定义中文地址的方式。
(1)组合地址。在这种模式下,用户可以使用省、市、区等信息组合指定中文地址,如果可能,还可以指定地址。
(2)完整的地址。其中用户指定一个完整地址,将省和市的信息包含在一行地址中。
为了能够让大家更直观的了解cngcode命令,接下来我们通过几个例子来进一步了解一下cngcode。如,我们可以通过定义province、city、district、address等选项,获得一个省、市、区、地址的组合,并以此来提取经纬度:
clearset more offinput str10 prov str10 city str10 dist str60 addr"湖北省" "武汉市" "" "金银潭医院""四川省" "" "" "华西医院""" "北京市" "" "协和医院"endcngcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) lat(startlat) long(startlng)list

另外,我们还可以通过定义一个完整地址fulladdress选项,来提取经纬度。例如:
clearset more offinput str60 fulladdr"湖北省武汉市金银潭医院""四川省华西医院""北京市协和医院"endcngcode, baidukey(输入你的百度密钥) fulladdress(fulladdr) lat(startlat) long(startlng)list

但是,如果既给了组合地址,又给了完整地址,如果两者都可以产生位置,如果从组合地址得到的位置与从完整地址返回的位置不同,则ffirst首先指定来自完整地址的位置。比如以中南财经政法大学和中南大学为例。假如我们输入以下内容:
clearset more offinput str10 prov str10 city str10 dist str60 addr str80 fulladdr"湖南省" "长沙市" "" "中南大学" "湖北省武汉市南湖大道中南财经政法大学"endcngcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdr) lat(startlat) long(startlng) list
可以看到此时我们同时给出了中南大学的组合地址和中南财经政法大学的完整地址,在没有输入ffirst选项之前,系统输出的是中南大学的经纬度位置。

如果我们加入了一个选项ffirst,则会先从完整地址中提取经纬度,提取不到时会才会换成省市区地址的组合。

在通过上述的讲解之后,你一定想知道cngcode命令能够用到哪些情况中吧,这里,就通过一个案例带大家感受一下cngcode的强大之处吧!
如果我们想要获取上市公司的地理位置,通过cngcode命令也可以实现,这里我们通过新浪财经网站获取有关上市公司的办公地址,通过网络爬虫,并借助我们团队开发的cnstock命令能够获取所有上市公司的办公地址,这里以10家公司为例,想要学习此处涉及的爬虫,可以参加我们的stata培训课程,里面会有详细的讲解哦~

       这里通过网址特征以及网页上的办公地址,可以通过爬虫实现所有上市公司的办公地址:
clear allcap mkdir D:\财务金融\上市公司地址cd D:\财务金融\上市公司地址mkf address stkcd strL address cnstock allsample 10,countlevelsof stkcd, local(stkcd)foreach stk in `stkcd' { local stk: disp %06.0f `stk' cap copy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpInfo/stockid/`stk'.phtml" temp.txt, replace while _rc != 0 { sleep 1000 cap copy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpInfo/stockid/`stk'.phtml" temp.txt, replace }infix strL v 1-100000 using temp.txt, clearreplace v = ustrfrom(v, "gb18030", 1)keep if index(v[_n-1], `"<td class="ct">办公地址:</td>"') replace v = ustrregexra(v, "<.*?>", "") frame post address (`stk') (v[1])}cwf address format %06.0f stkcd
运行以上代码可以随机获取10家上市公司的办公地址,运行结果如图所示:

在获取了这些上市公司的办公地址之后,通过上图的运行结果可以发现,这些地址是属于我们两种定位方式中的完整地址形式,那么我们在获取公司经纬度的时候选择的选项为fulladdress。
cngcode, baidukey(输入你的百度密钥) lat(startlat) long(startlng) fulladdress(address)
键入以上代码就可以获取10家上市公司办公地址的经纬度位置啦~

以上就是今天介绍的cngcode命令,更多内容关注后续的推文哦~感谢大家一直以来对爬虫俱乐部的支持,未来我们还会为大家送上不一样的科研神器,敬请期待~




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
Python入门—Spyder的简单使用
Jupyter Notebook 的这些tips你了解吗?
给变量名换马甲之rename命令

追踪命令set trace on——解你燃眉之急

爬虫大杀器 | “手把手”教你配置Selenium

小白必看!Anaconda安装全攻略

数据类型转换之destring和tostring命令

mvencode和mvdecode——打开缺失值与特定数值转换大门的钥匙
优雅的map()
Python实现Excel中vlookup函数功能
Stata实现Excel中vlookup函数功能
gen与egen,傻傻分不清楚?

用WordStat看中国日报新闻(二)

一招轻松合并文件——openall命令介绍

爬虫俱乐部平安经
一个函数实现PDF文档合并与拆分
补全股票代码位数的一百种姿势

明星闪闪亮:各校高被引论文

关于我们


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

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

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

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