Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化

发布时间:2020-03-06 阅读 474

作者:周豪波 (963564360@qq.com)    

Stata连享会   主页 || 视频 || 推文

连享会 - Stata 暑期班

线上直播 9 天:2020.7.28-8.7
主讲嘉宾:连玉君 (中山大学) | 江艇 (中国人民大学)
课程主页https://gitee.com/arlionn/PX | 微信版


目录


上一篇推文中,我们主要介绍了 Python 调用 API 爬取百度 POI 数据的主要操作过程和代码解析。但在实际操作中,还有几个操作事项需要注意,解决完后方可顺利进行 POI 的爬取。所以,这篇推文会就操作过程中的这三个问题和大家一起讨论。

  • 百度坐标与 WGS84 坐标的转换
  • 删除爬取的重复数据与处理中文乱码
  • 爬取数据在 ArcGIS 中的可视化

1. 非百度坐标的转换

在调用百度 API 进行 POI 爬取时,由于默认输入坐标类型属于百度坐标系(BD09ll),而我们第一手数据往往并不是百度坐标。
所以,我们需要将常用的非百度坐标(目前支持 GPS 设备获取的坐标、google 地图坐标、soso 地图坐标、amap 地图坐标、mapbar 地图坐标)转换成百度地图中使用的坐标,才可将转化后的坐标在百度地图 JavaScriptAPI、静态图 API、Web 服务 API 等产品中使用。

1.1 坐标转换 API

调用百度地图坐标转换的 API 即可实现由非百度坐标转为百度坐标。调用时的 url 如下:

  • http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=********** (*代表个人在百度地图开放平台申请的 ak 码)
  • 常见的非百度坐标包括 WGS84 或 GCJ02,设置转换前的坐标类型请参考百度开放平台中 坐标类型说明

运用 Python 批量转换坐标

之前我们已经尝试过调用百度 API 抓取 POI ,在这里,我们借鉴之前的思路,进行坐标转换。

S1:调用库,构建抓取的根 URL 并确定工作目录。

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
import urllib2            #调用爬虫所需的库from urllib import quote  #调用 urllib 库里面的查询命令import json               #调用库,json 是一种便于解析的格式
baseURL = 'http://api.map.baidu.com/geoconv/v1/?' #转换坐标的urlak = '**********' #在百度地图开放平台中申请的ak码
path = 'C:\\Users\\hp\\Desktop\\BaiduAPI\\' #爬取坐标文件所在的路径,Windows 系统的分隔符为\\,mac系统的分隔符是/coordList = [] #创建一个 coordinate 列表存储转换出来的坐标

S2:定义抓取动作并读取坐标文件,生成抓取队列:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
#抓取动作分四步:访问——读取——解析——休眠def fetch(url):                     #定义抓取的参数是 url   feedback = urllib2.urlopen(url)  #使用 urllib2 库里的 urlopen 命令进行访问 url   data = feedback.read()           #读取 url   response = json.loads(data)      #对返回结果进行解析   return response                  #返回抓取结果
coordinateFile = open(path + 'XianCoord.txt', 'r') #打开坐标文件即经纬度坐标文件,r是读取的意思outputFile = path + 'BaiduCoord05.txt' #定义输出的 POI 文件, BaiduCoord15自行命名coordinates = coordinateFile.readlines() #读取坐标文件中的每一行

S3:循环 coordinates,对每一个 coordinates 进行 fetch,并进行翻页,最后存储所得数据。

特别要注意的是在进行循环抓取之前,我们要先进行单次抓取,查看返回结果。若为字典形式,可以直接提取其结果信息,若为列表形式。需要先将其中的字典形式提取出来,再进行提取。

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
# for coord in coordinates:for c in range(0, 360):                #循环coordinates中的坐标,360指运行到第360行,可根据需要更改    # 提取坐标    coord = coordinates[c].split(',')   #提取坐标    lng = coord[1].strip()              #纬度,1对应坐标文件中的第2列    lat = coord[2].strip()              #经度,2对应坐标文件中的第3列    locator = coord[0]                  #定位我们抓取到了第几个坐标,0对应坐标文件中的第1列    print 'This is ' + str(locator) + ' of ' + str(len(coordinates))  #输出抓取到了第几个坐标       URL = baseURL + 'coords=' + str(lng) + ',' + str(lat) + '&from=1&to=5' \               + '&ak=' + ak               response = fetch(URL)               #返回抓取的 url 的数据    contents = response['result']       #返回抓取结果            # 开始循环抓取列表中的所需信息    for content in contents:        lng = content['x']                  #提取经度                lat = content['y']                  #提取纬度         coordInfo = str(lng)+';'+str(lat)   #定义输出的结果为经度+纬度        print str(lng) + ',' + str(lat)     #输出经度+纬度        coordList.append(coordInfo)         #抓取到一个 coordinateInfo 便加到 coordinateList 列表中

S4:生成 txt 文件,输出结果

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
with open(outputFile, 'a') as f:   for coordInfo in coordList:       f.write(coordInfo.encode('utf-8') + '\n')f.close()     

S5: 完成坐标转换

S6: 进行抓取

1.2 坐标系换回(BD09 to WGS84)

爬取完毕后,由于默认输出坐标类型为百度坐标(BD09ll),但是百度坐标系与最常用的 WGS84 坐标系之间会存在偏移,所以我们在导入 GIS 进行分析之前,需要再把 POI 点的坐标转换为原来的 WGS84 坐标系点坐标。否则会对我们的研究分析造成的一定的误差。

1.3 控制参数转换坐标

有些人会觉得坐标转换过于繁琐与复杂。其实,百度开放平台还提供了直接通过参数控制输入输出坐标类型。只要我们在爬取 POI 代码中调用的 url 中加入控制坐标类型的命令,就不用再进行转换了。

爬取 POI 代码时的 url 如下:

  • 输入坐标 为非百度坐标系时用 coord_type 参数控制:
    http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=**********&coord_type=1 (WGS84)/2(GCJ02) (*代表个人在百度地图开放平台申请的 ak 码)
  • 输出坐标 为非百度坐标系时用 ret_coordtype 参数控制:
    http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=**********&ret_coordtype=1(WGS84)/2(GCJ02)
  • 常见的非百度坐标包括 WGS84 或 GCJ02,设置转换时的坐标类型请参考百度开放平台中 坐标系说明

2. 删除爬取的重复数据

抓取工作完成后,我们就得到了一系列带有坐标和 UID 码的餐饮类 POI,由于我们在爬取 POI 时为了避免遗漏,半径的设置可能会偏大,就会出现重复的POI点。
所以,接下来我们要对数据进行进一步的清理预筛选,在这里主要介绍如何删除爬取的重复数据以及对乱码的中文进行转码。这里我们需要用到 Stata 软件,具体操作如下:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
*打开 txt 文件(打开之前将 ; 替换为 , )stata识别以 , 或 tab 键分隔的变量 shellout "D:\CrawlPOI\XianChAnPOI_Restaurant_20200201.txt"                        *导入txt文件 insheet using "D:\CrawlPOI\XianChAnPOI_Restaurant_20200201.txt", clear           *删除爬取的重复数据 duplicates drop v4, force                                                    *保存数据为stata的数据格式.dta save "D:\CrawlPOI\111.dta", replace                                                *-转码之前清空内存中数据 clear *-进入需要转码文件的文件夹目录cd "D:\CrawlPOI\"*-设置需要转码的类型为中文 (gb18030) unicode encoding set gb18030*-转码为gb18030格式的编码 unicode translate "快捷.dta"*-打开转码后的数据文件 use "快捷.dta"*-保存转码后的数据文件 save "快捷.dta", replace*-导出数据为excel格式*-sheet("****"):导出至****名字的sheet*-firstrow(vari):导出excel文件时第一行保存为变量名称 export excel "D:\CrawlPOI\111.xlsx", sheet("restaurant") firstrow(vari) replace

最终整理效果如下图:
Fig01

3. ArcGIS 可视化

数据整理完以后,我们就完成了前期的数据搜集工作。那么我们如何对这些数据进行可视化的表达与分析呢?以刚刚得到的餐饮类 POI 为例,我们可以通过 ArcGIS 绘制其热度图并进行某片区的餐饮业密度分布检测与规律探寻。

3.1 数据表导入 GIS

打开 GIS,点击 添加数据,导入整理好的 EXCEL 数据(Ps:EXCEL 保存成03版本,否则会导入失败)

3.2 可视化 POI 数据

右击添加进的 EXCEL 数据,点击 显示 XY 数据,将 X 字段设为经度、Y 字段设为纬度。得到 POI 的初步可视化的结果并右击 导出数据,导出为 shp 格式的数据,并添加该文件至 GIS 图层中,如下图所示:

Fig02
Fig02

这样,就可以在 ArcGIS 中进行进一步的挖掘和分析了。

3.3 密度分析

密度分析可以对某个现象的已知量进行处理,然后将这些量分散到整个地表上,依据是在每个位置测量到的量和这些测量量所在位置的空间关系。

作用:

  • 密度表面可以显示出点要素或线要素较为集中的地方。例如,每个城镇都可能有一个点值,表示该镇的人口总数,但我们想更多地了解人口随地区的分布情况。由于每个城镇内并非所有人都住在聚居点上,通过计算密度,我们可以创建出一个显示整个地表上人口的预测分布状况的表面。

3.3.1 点密度分析

  • 点密度:计算每个输出栅格像元周围的点要素的密度。可用于查明房屋、野生动物观测值或犯罪事件的密度。

ArcToolbox-->Spatial Analyst 工具-->密度分析-->点密度分析
结果如下图所示:

Fig03
Fig03

3.3.2 核密度分析

  • 核密度:计算要素在其周围邻域中的密度。
    可用于计算人口密度、建筑密度、获取犯罪情况报告、旅游区人口密度监测、连锁店经营情况分析等等。

ArcToolbox-->Spatial Analyst 工具-->密度分析-->核密度分析
结果如下图所示:

Fig04
Fig04

辨析:

对于点密度,需要指定一个邻域以便计算出各输出像元周围像元的密度。(可理解为在像元邻域内取点或线均值)而核密度则可将各点的已知总体数量从点位置开始向四周分散。

点密度分析:

点密度分析是以研究区域内的栅格为分析单元,用于计算每个输出栅格像元周围的点要素的密度。从概念上讲,每个栅格像元中心的周围都定义了一个邻域,将邻域内点的数量相加,然后除以邻域面积,即得到点要素的密度。

核密度分析:

核密度分析使用核函数根据点要素计算每单位面积的量值以将各个点拟合为光滑锥状表面。在核密度分析中,在各点周围生成表面所依据的二次公式可为表面中心(点位置)赋予最高值,并在搜索半径距离范围内减少到零。对于各输出像元,将计算各分散表面的累计交汇点总数。(可理解为随着与点或线的距离越远,权重越小)

4.小结:

本文通过对贯穿爬取全过程的三个问题进行了讨论并作了具体介绍,其中ArcGIS可视化部分中由于篇幅限制,就不再继续展开讨论,其他的可视化与分析方法,大家可以登陆网站ArcGIS学习自行学习。

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
Stata暑期班 连玉君
江艇
线上直播 9 天
2020.7.28-8.7
效率分析-专题 连玉君
鲁晓东
张 宁
视频-TFP-SFA-DEA
已上线,3天
文本分析/爬虫 游万海
司继春
视频-文本分析与爬虫
已上线,4天
空间计量系列 范巧 空间全局模型, 空间权重矩阵
空间动态面板, 空间DID
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:
    • 课程, 直播, 视频, 客服, 模型设定, 研究设计, 暑期班
    • stata, plus,Profile, 手册, SJ, 外部命令, profile, mata, 绘图, 编程, 数据, 可视化
    • DID,RDD, PSM,IV,DID, DDD, 合成控制法,内生性, 事件研究, 交乘, 平方项, 缺失值, 离群值, 缩尾, R2, 乱码, 结果
    • Probit, Logit, tobit, MLE, GMM, DEA, Bootstrap, bs, MC, TFP, 面板, 直击面板数据, 动态面板, VAR, 生存分析, 分位数
    • 空间, 空间计量, 连老师, 直播, 爬虫, 文本, 正则, python
    • Markdown, Markdown幻灯片, marp, 工具, 软件, Sai2, gInk, Annotator, 手写批注, 盈余管理, 特斯拉, 甲壳虫, 论文重现, 易懂教程, 码云, 教程, 知乎

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……


扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD