定位神器——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], `"办公地址:"') 
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命令,更多内容关注后续的推文哦~ 感谢大家一直以来对爬虫俱乐部的支持,未来我们还会为大家送上不一样的科研神器,敬请期待~

你可能感兴趣的:(定位神器——cngcode)