爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

2016-09-24 薛原 爬虫俱乐部 爬虫俱乐部

在我们上一个公众号数据处理援助中心,笔者曾经写过一个推文,介绍了如何从中文地址提取经纬度。主要方法是将William Matsuoka个人主页上的一个把字符转化成网站链接中百分比编码的程序改成percentencode命令,用中文地址构造新的链接,抓取经纬度数据。但是这个方法操作起来十分麻烦。为了方便大家使用中文地址经纬度数据进行研究,爬虫俱乐部在这个周末给大家送上一份大礼——最新发布的chinagcode命令。这个命令由李春涛教授带领爬虫俱乐部成员开发完成,可以通过百度地图API将中文地址转化成对应的经纬度数据,同时发布的还有chinaaddress命令。在今天我们先来介绍chinagcode命令。


1、安装chinagcode命令


由于网页编码的问题,这个命令需要在Stata14版本中才能使用。大家打开Stata14后,在命令窗口输入ssc install chinagcode,即可完成安装。然后大家通过help chinagcode就可以进入到help文件中。



2、申请密钥


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


进入网页后点击申请密钥,填写个人信息后,经过3-5天的审核时间,当审核完成后,会通过短信提示你。这时再进入这个网站,点击申请密钥,再点击创建应用,输入相关信息就可以获得密钥。

如果没有百度密钥,是无法正常使用这个程序的。我们在help文件中给出了一个修改过后的密钥,是无法使用的,仅是说明如何定义baidukey这个选项。

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


3、定义中文地址


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

第一种方式:我们可以通过定义province、citydistrictaddress等选项,获得一个省、市、区、地址的组合,并以此来提取经纬度。例如:

clear

set more off

input str10 prov str10 city str10 dist str60 addr

"湖北省" "武汉市" "" "中南财经政法大学"

"湖北省" "" "" "武汉大学"

"" "北京市" "海淀区" "北京大学"

end

chinagcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr)

list


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

clear

set more off

input str60 fulladdr

"湖北省武汉市中南财经政法大学"

"湖北省武汉大学"

"北京市海淀区北京大学"

end

chinagcode, baidukey(输入你的百度密钥) fulladdress(fulladdr)

list


如果我们即定义了省市区地址,又定义了完整地址,那么会怎么样呢?在这里首先要声明一下,由于中文的博大精深,失之毫厘谬以千里,如果二者有一点点的不同,提取出的经纬度就可能会有差别。比如以中南财经政法大学为例,在武汉有首义校区和南湖校区。假如我们输入以下内容:

clear

set more off

input str10 prov str10 city str10 dist str60 addr str80 fulladdr

"湖北省" "武汉市" "" "中南财经政法大学"

"" "" "" "" "湖北省武汉市南湖大道中南财经政法大学"

end

chinagcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdr)

list


我们可以发现二者提取出来的经纬度是有区别的,原因就是第一个地址定位到了首义校区,而加上南湖大道后定位到了南湖校区。那么我们应该使用哪种方式定义地址好呢?等到大家看到了我们关于chinaaddress的推文后,就会明白,最好的定义地址的方式是xxxxxxxxxx号,但我们常常无法用这么精确的地址来提取经纬度。

由 于两种定义地址的方式之间微小的差别会得出不同的结果,因此在这个命令中,当你同时定义了两种格式的地址,默认情况下是先从省市区地址的组合中提取经纬 度,当这个组合的地址提取不到经纬度时,会换成完整地址来提取。如果我们加入了一个选项ffirst,当你定义了这个选项,则会先从完整地址中提取经纬 度,提取不到时会换成省市区地址的组合。在我们写的help文件中,有一个例子,在同一条观测值中,根据省市区地址定位的是北京市海淀区北京大学,而根据完整地址定位的是湖北省武汉市南湖大道中南财经政法大学。当然现实中不可能两种定义的方式出现这么大的差别,但这个例子可以很好地帮助我们理解默认情况下和定义了ffirst这个选项的情况下提取方式的不同。我们来看一下这个例子。首先是默认情况:

clear

set more off

input str15 prov str15 city str15 dist str60 addr str100 fulladdress

"湖北省" "武汉市" "" "南湖大道中南财经政法大学" ""

"" "北京市" "海淀区" "北京大学" "湖北省武汉市南湖大道中南财经政法大学"

"" "" "" "" "北京市海淀区北京大学"

end

chinagcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdress)

list


我们可以看到在默认情况下,第二个观测值提取了北京市海淀区北京大学的经纬度,这可以通过第一个观测值和第三个观测值看出。现在,我们通过long和lat两个选项来定义新生成的变量名,同时加入ffirst选项,再看一下结果:

chinagcode, baidukey(输入你的百度密钥) province(prov) city(city) district(dist) address(addr) fulladdress(fulladdress) ffirst long(long1) lat(lat1)

list prov-fulladdr long1 lat1

这个时候第二个观测值提取的经纬度就是完整地址湖北省武汉市南湖大道中南财经政法大学的经纬度了。

感谢大家一直以来对我们的公众号和我们的团队的支持,我们在今后还将会继续用我们的技术,为大家的研究工作提供方便。今天,爬虫俱乐部带你玩转经纬度,明天我们又将送上本周末第二份大礼。请大家继续关注我们的公众号,每天礼物收到手软~


我们团队原来的微信公众号是“数据处理援助中心”,现在正式搬家到“爬虫俱乐部”,欢迎关注。新的公众号开始,我们推出有问必答栏目,对您提出的问题,我们会尽力回答,并通过推文的形式进行发布。我们也欢迎各位粉丝向公众号投稿。

(编辑 @强宇曦)


欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:xueyuan19920310@163.com 

投稿要求:

1)必须原创,禁止抄袭;

2)必须准确,详细,有例子,有截图;

注意事项:

1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名。

2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。

3)如果大家遇到关于stata处理分析数据的问题,也可以给该邮箱写邮件,邮件名称为“提问”+“问题名称或者关键词”,我们会在后期的推文里给予解答。

长按二维码关注公众号



微信扫一扫
关注该公众号