定位神器——cngcode

本文作者:方 言
文字编辑:李婷婷
技术总编:余术玲

提到定位,通常大家借助的是地图的定位功能,但是如果我们想要一次性获取多个地址的地理位置,Stata软件中的cngcode命令会比地图要高效的多,这款神器——cngcode(China Geographic Code)命令,是一款强大的地理定位命令,原称为chinagcode,该命令可以从百度地图API中提取中文地址的经纬度。与该命令同时发布的还有chinaaddress,现为cnaddress命令,是cngcode的反向命令,它使用百度地图API将一个位置(经纬度对)转换成相应的中文地址。今天,我们主要介绍的是cngcode命令~

1、安装

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

1.png

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

2、申请密钥

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

2.png

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

image

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

image

3、语法

cngcode, baidukey(string) [options]

cngcode的常用选项列举如下:

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

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

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

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

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

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

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

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

4、定义中文地址

我们为大家介绍两种定义中文地址的方式。

(1)组合地址。在这种模式下,用户可以使用省、市、区等信息组合指定中文地址,如果可能,还可以指定地址。

(2)完整的地址。其中用户指定一个完整地址,将省和市的信息包含在一行地址中。

为了能够让大家更直观的了解cngcode命令,接下来我们通过几个例子来进一步了解一下cngcode。如,我们可以通过定义province、city、district、address等选项,获得一个省、市、区、地址的组合,并以此来提取经纬度:


clear
set more off
input str10 prov str10 city str10 dist str60 addr
"湖北省" "武汉市" "" "金银潭医院"
"四川省" "" "" "华西医院"
"" "北京市" "" "协和医院"
end
cngcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) lat(startlat) long(startlng)
list
image

另外,我们还可以通过定义一个完整地址fulladdress选项,来提取经纬度。例如:


clear
set more off
input str60 fulladdr
"湖北省武汉市金银潭医院"
"四川省华西医院"
"北京市协和医院"
end
cngcode, baidukey(输入你的百度密钥) fulladdress(fulladdr) lat(startlat) long(startlng)
list
image

但是,如果即给了组合地址,又给了完整地址,如果两者都可以产生位置,如果从组合地址得到的位置与从完整地址返回的位置不同,则ffirst首先指定来自完整地址的位置。比如以中南财经政法大学和湖南省的中南大学为例。假如我们输入以下内容:


clear
set more off
input str10 prov str10 city str10 dist str60 addr str80 fulladdr
"湖南省" "长沙市" "" "中南大学" "湖北省武汉市南湖大道中南财经政法大学"
end
cngcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdr) lat(startlat) long(startlng) 
list 

可以看到此时我们同时给出了中南大学的组合地址和中南财经政法大学的完整地址,在没有输入ffirst选项之前,系统输出的是中南大学的经纬度位置。

image

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

image

在通过上述的讲解之后,你一定想知道cngcode命令能够用到哪些情况中吧,这里,就通过一个案例带大家感受一下cngcode的强大之处吧!

如果我们想要获取上市公司的地理位置,通过cngcode命令也可以实现,这里我们通过新浪财经网站获取有关上市公司的办公地址,通过网络爬虫,并借助我们团队开发的cnstock命令能够获取所有上市公司的办公地址,这里以10家公司为例,想要学习此处涉及的爬虫,可以参加我们的stata培训课程,里面会有详细的讲解哦~

image

这里通过网址特征以及网页上的办公地址,可以通过爬虫实现所有上市公司的办公地址:


clear all
cap mkdir D:\财务金融\上市公司地址
cd D:\财务金融\上市公司地址
mkf address stkcd strL address 
cnstock all
sample 10,count
levelsof 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, clear
replace 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家上市公司的办公地址,运行结果如图所示:

image

在获取了这些上市公司的办公地址之后,通过上图的运行结果可以发现,这些地址是属于我们两种定位方式中的完整地址形式,那么我们在获取公司经纬度的时候选择的选项为fulladdress。


cngcode, baidukey(输入你的百度密钥) lat(startlat) long(startlng) fulladdress(address)

键入以上代码就可以获取10家上市公司办公地址的经纬度位置啦~

image

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359