基于Python爬取POI在城市地理国情监测中的应用

2021-07-05 09:38方德涛
地理空间信息 2021年6期
关键词:丹东市高德国情

方德涛

(1.辽宁省自然资源事务服务中心,辽宁 沈阳 110034)

自2016年开始,基于地理国情监测的全国地级以上城市及典型城市群空间格局变化监测已连续开展了两年,并于2018年变更为城市地理国情监测,且监测内容逐年增加。为符合新型城镇化建设需求,在2018年城市空间综合监测中增加了基本公共服务设施监测、综合交通网络设施监测,目的是能够为新型城镇化政策制定提供切实的数据支撑和决策依据[1-2]。

在城市基本公共服务设施监测中,需要在2018年基础性地理国情监测的地理单元的城镇综合功能单元成果中,提取的学校和医院数据作为本底数据,结合收集的开源大数据以及其他专题资料,利用2018年高分辨率遥感影像,通过人工目视解译的方式提取监测区范围内的学校和医院等城市基本公共服务设施。如何收集并利用开源数据服务于城市基本公共服务设施监测成为急需解决的问题之一。

本文以辽宁省丹东市为例,利用Python语言及其标准库与第三方模块开发爬虫程序,获取高德地图兴趣点(POI)学校与医院数据,作为基础性地理国情监测的地理单元成果中学校、医院等数据的补充,结合城市的社会、经济、人口、土地利用等统计和监测数据,对城市基本公共服务设施的分布现状、覆盖范围、人均用地面积等进行统计分析。

1 数据与方法

1.1 研究区概况

丹东市是城市地理国情监测项目中辽宁省10个国审城市之一,位于鸭绿江北岸,东与朝鲜新义州市隔江相望,南临黄海,西界鞍山,西南与大连市毗邻,北与本溪市接壤,下辖三区三县(市)和一个国家级边境经济合作区[3-4]。本次城市地理国情监测范围是丹东市市辖区范围,即元宝区、振兴区、振安区三区范围(见图1所示),监测面积约为911.7 km2。

图1 丹东市城市地理国情监测范围

1.2 数据源

研究数据源包括2018年基础性地理国情监测的地表覆盖和地理国情要素成果、市辖区和中心城区界线在内的城市行政区划界线、2018年基础性地理国情监测项目优于1 m分辨率的正射影像以及2018年《中国城市统计年鉴》,开源大数据等专题资料。

丹东市市辖区遥感影像采用6景0.8 m地面分辨率北京二号卫星遥感影像、2景0.5 m分辨率高景卫星遥感影像,对于空洞区域没有优于1 m分辨率正射影像时,采用了2 m地面分辨率2景高分一号和2景天绘一号卫星遥感影像数据作为补充影像数据源。

开源大数据主要来源是互联网电子地图,国内主要运营商包括百度地图、高德地图、腾讯地图、图吧地图等。我国公开出版电子地图至少采用GCJ-02加密算法进行坐标偏移处理,百度地图和图吧地图等还在此基础上进行了二次加密,形成了各自的坐标系统[5-6]。为了开发简单有效,本文采用了仅经过一次加密且数据质量较好的高德地图作为开源POI数据来源。

1.3 技术路线

城市空间综合要素集提取是利用2018年优于1 m分辨率影像数据,2018年基础性地理国情监测数据,数字地理空间框架建设,智慧城市时空云平台建设成果及其他专题资料,以2017年全国地级以上城市及典型城市群空间格局变化监测成果为基础,完成辽宁省丹东市2018年市辖区范围内城区边界、建设用地边界、城市建设用地、基本公共服务设施、综合交通网络设施数据的提取,形成监测数据集。

基本公共服务设施提取主要结合基础性地理国情监测成果数据和其他专题资料,完成辽宁省丹东市市辖区范围内的学校和医院2类基本公共服务设施用地的数据采集。首先从2018年基础性地理国情监测的地理单元的城镇综合功能单元成果中提取学校、医院等数据作为本底数据,结合收集的开源大数据以及其他专题资料,利用2018年高分辨率遥感影像,通过人工目视解译的方式提取监测区范围内的学校和医院。将学校按照基础性地理国情监测采集的大、中、小学校进行校核和补充采集,对医院补充采集基础性地理国情监测采集不全或遗漏的一、二、三级十等医院,并补充采集社区卫生服务站及其他医疗卫生机构定位点。对于内业无法判别的地物,采用外业调绘核查的方式采集,基本公共服务设施信息提取技术流程如图2所示。

图2 基本公共服务设施提取技术流程图

2 基于Python的POI获取

2.1 Python介绍与基本设置

Python是一种简单易学、功能强大的基于C语言实现的脚本语言,广泛地应用于地理信息数据批处理以及地理统计分析当中[7-8]。Python不仅内置了强大的标准库,Python社区还提供了大量使用方式与标准库类似、覆盖多个领域的第三方模块[9]。本文基于Python获取高德地图POI需要导入用于操作URL功能的urllib和处理JSON格式的json两个标准库,以及用于写入Excel的第三方xlwt模块。

爬取POI的过程大致可分为三步:首先需要在高德开放平台注册开发者账号,登录平台后申请API密钥(Key)并绑定Web服务;其次要拼接HTTP请求的URL,申请的Web服务API Key需作为必填参数一同发送;最后需要接收HTTP请求返回的JSON格式数据,并解析和获取数据,接口的输入参数和输出数据全部为UTF-8编码。

在高德地图Web服务API接口当中,可通过city&citylimit参数指定POI搜索的城市或区县。city参数能够接收citycode和adcode,citycode仅能精确到城市, adcode却能够精确到区县。由于高德地图API每次请求最多返回900个POI信息,为了获得全面的POI数据,本文采用adcode参数用于缩小搜索范围,并且设置更加详细关键词,具体可参考高德地图《POI分类编码和城市编码表》。

2.2 获取单页POI数据

定义获取单页POI数据函数。主要功能是拼接出用于HTTP请求的req_url,并获取某个关键词返回的单页POI数据,高德地图建议每页记录数据不应超过25个,返回类型为JSON格式。poi_search_url为高德地图关键字搜索API服务地址,其后为地址参数,amap_api_key为申请的API密钥。

核心代码:

def getPoi(adcode, keyword, page):

req_url = poi_search_url + 'key=' + amap_api_key +'&keywords=' + quote(keyword) + '&city=' + str(adcode) +'&citylimit=true' + '&offset=25' + '&page=' + str(page) +'&extensions=all&output=json'

response = request.urlopen(req_url)

data = response.read().decode('utf-8')

return data

2.3 获取全部POI数据

定义获取全部POI数据函数。主要功能是建立收集POI数据的空列表,并调用获取单页POI数据函数,获取的某个关键词返回的全部POI数据。当count计数为0时,退出while循环,将获取的全部POI数据存入列表,并打印获取POI个数。

核心代码:

def getPois(adname, adcode, keyword):

i = 1

poiList = []

while True:

result = getPoi(adcode, keyword, i)

result = json.loads(result)

if result['count']== '0':

break

poi = result['pois']

poiList += poi

i += 1

print('市县区:%s' % adname, '关键词:%s' %keyword, '爬取到 %d' % len(poiList), '个 POI')

return poiList

2.4 保存 POI数据

定义保存POI数据至Excel文件函数。主要功能是创建Excel工作簿,添加以关键词为名称的工作表,将获取的POI数据写入单元格中,并保存Excel文件。

核心代码:

def json_to_excel(keyword, poiList):

workbook = xlwt.Workbook(encoding='utf-8')

worksheet = workbook.add_sheet(keyword, True)

worksheet.write(0, 0, 'Name')

worksheet.write(0, 1, 'Lon')

worksheet.write(0, 2, 'Lat')

for i in range(len(poiList)):

name = poiList[i]['name']

location = poiList[i]['location']

lon = str(location).split(',')[0]

lat = str(location).split(',')[1]

worksheet.write(i + 1, 0, name)

worksheet.write(i + 1, 1, lon)

worksheet.write(i + 1, 2, lat)

workbook.save(r'' + cityName + '_' + keyword + '.xls')

3 城市基本公共服务水平监测与分析

3.1 POI数据处理与入库

利用Python开发爬虫程序获取到丹东市元宝区、振兴区、振安区高德地图POI数据共计888条,其中小学49条、中学47条、大学7条、培训学校674条,医院79条、社区卫生机构32条。以2018年基础性地理国情监测的城镇综合功能单元成果BUCA、BUCP两个要素类中提取学校、医院等数据作为本底数据,将POI数据经过人工筛选,删除与本底数据重复学校、医院,删除程序爬取多余数据条目,并根据城市空间综合要素集提取要求确定补充的POI数据,对于内业无法准确识别的POI进行外业核查。

基本公共服务设施中学校采集面积大于1 600 m2的全日制教育大中小学校等教育机构范围线构面,其他的采集定位点;医院采集面积大于1 600 m2的一二三级十等医院范围线构面,社区卫生服务机构和其他医疗卫生机构采集定位点。

最终基于Python爬虫获取POI数据应用于丹东市城市地理国情监测基本公共服务设施的各类教育机构为17个、各类医疗机构为10个,丹东市基本公共服务设施统计结果如表1所示。

表1 丹东市基本公共服务设施统计表

3.2 统计分析

利用Python采集的学校、医院POI数据,结合基础性地理国情监测成果、统计数据及其他专参考资料数据,整合基础性地理国情监测成果中的社会福利机构、体育活动场所等基础设施数据,利用公共服务设施的数量、服务范围、人均拥有量等指标从基本公共服务设施均衡度、便捷度以及服务水平等方面进行监测与综合分析。

市辖区人均教育、医疗用地面积指标计算公式如表2所示。根据数据统计,丹东市市辖区每千人中小学数0.096 2个,每千人中中学数为0.069 2个,分别居辽宁省10个国审城市第一位和第二位;丹东市市辖区人均教育用地面积4.31 m2,人均医疗用地面积0.51 m2。

表2 丹东市人均教育医疗指标

学校覆盖率统计为小学500 m缓冲区、中学1 000 m缓冲区内的房屋建筑区面积除以房屋建筑区总面积。医院覆盖率统计为三级医院12 000 m缓冲区、二级医院6 000 m缓冲区、一级医院2 000 m缓冲区、其他医院1 000 m缓冲区内的房屋建筑区面积除以房屋建筑区总面积。学校、医院覆盖率反映区域内教育、医疗覆盖及完善程度。根据数据统计,丹东市市辖区小学、中学覆盖率分别为35.22%和47.34%;三级、二级、一级和无等级医院覆盖率分别为76.67%、56.06%、33.08%和55.04%。丹东市教育、医疗机构覆盖范围如图3、4所示。

图3 丹东市教育机构覆盖范围图

图4 丹东市医疗机构覆盖范围图

4 结 语

在以丹东市城市地理国情监测为实例的城市基本公共服务水平监测与分析中,利用Python语言开发爬虫程序,实现了开源大数据中教育、医疗机构POI数据获取,对地理国情监测数据进行了补充,并结合统计和监测数据,对城市基本公共服务设施的分布现状、覆盖范围、人均用地面积等进行统计分析,实验表明:

1)Python编程语言能够在开源POI数据获取中发挥重要作用。Python作为一种简单易读且可扩展性极强的高级编程语言,不仅能够在地理空间分析中得到广泛应用,还可以利用其标准库与第三方模块,开发爬虫程序,高效、快速地获取开源POI数据。在实际工作中,利用Python开发开源POI数据获取程序,能够最大减少外业采集兴趣点的工作量,对今后地理国情监测项目具有重要的应用价值。

2)基于Python获取POI数据可作为基础性地理国情监测数据的重要补充。在地理国情监测项目中,需完整采集大中小学校、一二三级十等医院等单位院落,但对培训机构等其他教育学校、社区卫生服务机构和其他医疗卫生机构并没有做采集要求,而在城市地理国情监测中则需要补充采集。利用Python开发爬虫程序获取开源POI数据能满足城市地理国情监测的提取要求,补充地理国情监测数据不足,同时也为其他需要补充POI数据的地理监测项目提供参考。

3)如何获取更准确、全面的POI数据还有值得探讨的空间。高德地图关键词搜索最多返回900个POI信息,这对于基于大数据统计分析来说明显是不够的。通常有两种思路:一是细化关键词,例如本文将搜索关键词“学校”细化成“小学”、“中学”、“大学”和“培训学校”,但对于某些大城市依然无法获取全部需要POI数据。二是缩小搜索范围,将目标搜索范围切块,使其变成多个搜索区块,逐一进行POI数据获取,如何合理对目标搜索范围进行切块将会是下一步的研究方向。

猜你喜欢
丹东市高德国情
家国情 诗词魂
原来我挺厉害的
江苏高德液压机械有限公司
江苏高德液压机械有限公司
推广生物乙醇汽油:迫切且合乎国情
高三的笑脸
丹东市林地分类研究
地理国情监测知识支持库初步设计
丹东市近20年内结核病集团感染与暴发流行调查
高德贸易有限公司