方德濤
(1.遼寧省自然資源事務(wù)服務(wù)中心,遼寧 沈陽 110034)
自2016年開始,基于地理國情監(jiān)測的全國地級以上城市及典型城市群空間格局變化監(jiān)測已連續(xù)開展了兩年,并于2018年變更為城市地理國情監(jiān)測,且監(jiān)測內(nèi)容逐年增加。為符合新型城鎮(zhèn)化建設(shè)需求,在2018年城市空間綜合監(jiān)測中增加了基本公共服務(wù)設(shè)施監(jiān)測、綜合交通網(wǎng)絡(luò)設(shè)施監(jiān)測,目的是能夠為新型城鎮(zhèn)化政策制定提供切實的數(shù)據(jù)支撐和決策依據(jù)[1-2]。
在城市基本公共服務(wù)設(shè)施監(jiān)測中,需要在2018年基礎(chǔ)性地理國情監(jiān)測的地理單元的城鎮(zhèn)綜合功能單元成果中,提取的學(xué)校和醫(yī)院數(shù)據(jù)作為本底數(shù)據(jù),結(jié)合收集的開源大數(shù)據(jù)以及其他專題資料,利用2018年高分辨率遙感影像,通過人工目視解譯的方式提取監(jiān)測區(qū)范圍內(nèi)的學(xué)校和醫(yī)院等城市基本公共服務(wù)設(shè)施。如何收集并利用開源數(shù)據(jù)服務(wù)于城市基本公共服務(wù)設(shè)施監(jiān)測成為急需解決的問題之一。
本文以遼寧省丹東市為例,利用Python語言及其標(biāo)準(zhǔn)庫與第三方模塊開發(fā)爬蟲程序,獲取高德地圖興趣點(POI)學(xué)校與醫(yī)院數(shù)據(jù),作為基礎(chǔ)性地理國情監(jiān)測的地理單元成果中學(xué)校、醫(yī)院等數(shù)據(jù)的補充,結(jié)合城市的社會、經(jīng)濟、人口、土地利用等統(tǒng)計和監(jiān)測數(shù)據(jù),對城市基本公共服務(wù)設(shè)施的分布現(xiàn)狀、覆蓋范圍、人均用地面積等進(jìn)行統(tǒng)計分析。
丹東市是城市地理國情監(jiān)測項目中遼寧省10個國審城市之一,位于鴨綠江北岸,東與朝鮮新義州市隔江相望,南臨黃海,西界鞍山,西南與大連市毗鄰,北與本溪市接壤,下轄三區(qū)三縣(市)和一個國家級邊境經(jīng)濟合作區(qū)[3-4]。本次城市地理國情監(jiān)測范圍是丹東市市轄區(qū)范圍,即元寶區(qū)、振興區(qū)、振安區(qū)三區(qū)范圍(見圖1所示),監(jiān)測面積約為911.7 km2。
圖1 丹東市城市地理國情監(jiān)測范圍
研究數(shù)據(jù)源包括2018年基礎(chǔ)性地理國情監(jiān)測的地表覆蓋和地理國情要素成果、市轄區(qū)和中心城區(qū)界線在內(nèi)的城市行政區(qū)劃界線、2018年基礎(chǔ)性地理國情監(jiān)測項目優(yōu)于1 m分辨率的正射影像以及2018年《中國城市統(tǒng)計年鑒》,開源大數(shù)據(jù)等專題資料。
丹東市市轄區(qū)遙感影像采用6景0.8 m地面分辨率北京二號衛(wèi)星遙感影像、2景0.5 m分辨率高景衛(wèi)星遙感影像,對于空洞區(qū)域沒有優(yōu)于1 m分辨率正射影像時,采用了2 m地面分辨率2景高分一號和2景天繪一號衛(wèi)星遙感影像數(shù)據(jù)作為補充影像數(shù)據(jù)源。
開源大數(shù)據(jù)主要來源是互聯(lián)網(wǎng)電子地圖,國內(nèi)主要運營商包括百度地圖、高德地圖、騰訊地圖、圖吧地圖等。我國公開出版電子地圖至少采用GCJ-02加密算法進(jìn)行坐標(biāo)偏移處理,百度地圖和圖吧地圖等還在此基礎(chǔ)上進(jìn)行了二次加密,形成了各自的坐標(biāo)系統(tǒng)[5-6]。為了開發(fā)簡單有效,本文采用了僅經(jīng)過一次加密且數(shù)據(jù)質(zhì)量較好的高德地圖作為開源POI數(shù)據(jù)來源。
城市空間綜合要素集提取是利用2018年優(yōu)于1 m分辨率影像數(shù)據(jù),2018年基礎(chǔ)性地理國情監(jiān)測數(shù)據(jù),數(shù)字地理空間框架建設(shè),智慧城市時空云平臺建設(shè)成果及其他專題資料,以2017年全國地級以上城市及典型城市群空間格局變化監(jiān)測成果為基礎(chǔ),完成遼寧省丹東市2018年市轄區(qū)范圍內(nèi)城區(qū)邊界、建設(shè)用地邊界、城市建設(shè)用地、基本公共服務(wù)設(shè)施、綜合交通網(wǎng)絡(luò)設(shè)施數(shù)據(jù)的提取,形成監(jiān)測數(shù)據(jù)集。
基本公共服務(wù)設(shè)施提取主要結(jié)合基礎(chǔ)性地理國情監(jiān)測成果數(shù)據(jù)和其他專題資料,完成遼寧省丹東市市轄區(qū)范圍內(nèi)的學(xué)校和醫(yī)院2類基本公共服務(wù)設(shè)施用地的數(shù)據(jù)采集。首先從2018年基礎(chǔ)性地理國情監(jiān)測的地理單元的城鎮(zhèn)綜合功能單元成果中提取學(xué)校、醫(yī)院等數(shù)據(jù)作為本底數(shù)據(jù),結(jié)合收集的開源大數(shù)據(jù)以及其他專題資料,利用2018年高分辨率遙感影像,通過人工目視解譯的方式提取監(jiān)測區(qū)范圍內(nèi)的學(xué)校和醫(yī)院。將學(xué)校按照基礎(chǔ)性地理國情監(jiān)測采集的大、中、小學(xué)校進(jìn)行校核和補充采集,對醫(yī)院補充采集基礎(chǔ)性地理國情監(jiān)測采集不全或遺漏的一、二、三級十等醫(yī)院,并補充采集社區(qū)衛(wèi)生服務(wù)站及其他醫(yī)療衛(wèi)生機構(gòu)定位點。對于內(nèi)業(yè)無法判別的地物,采用外業(yè)調(diào)繪核查的方式采集,基本公共服務(wù)設(shè)施信息提取技術(shù)流程如圖2所示。
圖2 基本公共服務(wù)設(shè)施提取技術(shù)流程圖
Python是一種簡單易學(xué)、功能強大的基于C語言實現(xiàn)的腳本語言,廣泛地應(yīng)用于地理信息數(shù)據(jù)批處理以及地理統(tǒng)計分析當(dāng)中[7-8]。Python不僅內(nèi)置了強大的標(biāo)準(zhǔn)庫,Python社區(qū)還提供了大量使用方式與標(biāo)準(zhǔn)庫類似、覆蓋多個領(lǐng)域的第三方模塊[9]。本文基于Python獲取高德地圖POI需要導(dǎo)入用于操作URL功能的urllib和處理JSON格式的json兩個標(biāo)準(zhǔn)庫,以及用于寫入Excel的第三方xlwt模塊。
爬取POI的過程大致可分為三步:首先需要在高德開放平臺注冊開發(fā)者賬號,登錄平臺后申請API密鑰(Key)并綁定Web服務(wù);其次要拼接HTTP請求的URL,申請的Web服務(wù)API Key需作為必填參數(shù)一同發(fā)送;最后需要接收HTTP請求返回的JSON格式數(shù)據(jù),并解析和獲取數(shù)據(jù),接口的輸入?yún)?shù)和輸出數(shù)據(jù)全部為UTF-8編碼。
在高德地圖Web服務(wù)API接口當(dāng)中,可通過city&citylimit參數(shù)指定POI搜索的城市或區(qū)縣。city參數(shù)能夠接收citycode和adcode,citycode僅能精確到城市, adcode卻能夠精確到區(qū)縣。由于高德地圖API每次請求最多返回900個POI信息,為了獲得全面的POI數(shù)據(jù),本文采用adcode參數(shù)用于縮小搜索范圍,并且設(shè)置更加詳細(xì)關(guān)鍵詞,具體可參考高德地圖《POI分類編碼和城市編碼表》。
定義獲取單頁POI數(shù)據(jù)函數(shù)。主要功能是拼接出用于HTTP請求的req_url,并獲取某個關(guān)鍵詞返回的單頁POI數(shù)據(jù),高德地圖建議每頁記錄數(shù)據(jù)不應(yīng)超過25個,返回類型為JSON格式。poi_search_url為高德地圖關(guān)鍵字搜索API服務(wù)地址,其后為地址參數(shù),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
定義獲取全部POI數(shù)據(jù)函數(shù)。主要功能是建立收集POI數(shù)據(jù)的空列表,并調(diào)用獲取單頁POI數(shù)據(jù)函數(shù),獲取的某個關(guān)鍵詞返回的全部POI數(shù)據(jù)。當(dāng)count計數(shù)為0時,退出while循環(huán),將獲取的全部POI數(shù)據(jù)存入列表,并打印獲取POI個數(shù)。
核心代碼:
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('市縣區(qū):%s' % adname, '關(guān)鍵詞:%s' %keyword, '爬取到 %d' % len(poiList), '個 POI')
return poiList
定義保存POI數(shù)據(jù)至Excel文件函數(shù)。主要功能是創(chuàng)建Excel工作簿,添加以關(guān)鍵詞為名稱的工作表,將獲取的POI數(shù)據(jù)寫入單元格中,并保存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')
利用Python開發(fā)爬蟲程序獲取到丹東市元寶區(qū)、振興區(qū)、振安區(qū)高德地圖POI數(shù)據(jù)共計888條,其中小學(xué)49條、中學(xué)47條、大學(xué)7條、培訓(xùn)學(xué)校674條,醫(yī)院79條、社區(qū)衛(wèi)生機構(gòu)32條。以2018年基礎(chǔ)性地理國情監(jiān)測的城鎮(zhèn)綜合功能單元成果BUCA、BUCP兩個要素類中提取學(xué)校、醫(yī)院等數(shù)據(jù)作為本底數(shù)據(jù),將POI數(shù)據(jù)經(jīng)過人工篩選,刪除與本底數(shù)據(jù)重復(fù)學(xué)校、醫(yī)院,刪除程序爬取多余數(shù)據(jù)條目,并根據(jù)城市空間綜合要素集提取要求確定補充的POI數(shù)據(jù),對于內(nèi)業(yè)無法準(zhǔn)確識別的POI進(jìn)行外業(yè)核查。
基本公共服務(wù)設(shè)施中學(xué)校采集面積大于1 600 m2的全日制教育大中小學(xué)校等教育機構(gòu)范圍線構(gòu)面,其他的采集定位點;醫(yī)院采集面積大于1 600 m2的一二三級十等醫(yī)院范圍線構(gòu)面,社區(qū)衛(wèi)生服務(wù)機構(gòu)和其他醫(yī)療衛(wèi)生機構(gòu)采集定位點。
最終基于Python爬蟲獲取POI數(shù)據(jù)應(yīng)用于丹東市城市地理國情監(jiān)測基本公共服務(wù)設(shè)施的各類教育機構(gòu)為17個、各類醫(yī)療機構(gòu)為10個,丹東市基本公共服務(wù)設(shè)施統(tǒng)計結(jié)果如表1所示。
表1 丹東市基本公共服務(wù)設(shè)施統(tǒng)計表
利用Python采集的學(xué)校、醫(yī)院POI數(shù)據(jù),結(jié)合基礎(chǔ)性地理國情監(jiān)測成果、統(tǒng)計數(shù)據(jù)及其他專參考資料數(shù)據(jù),整合基礎(chǔ)性地理國情監(jiān)測成果中的社會福利機構(gòu)、體育活動場所等基礎(chǔ)設(shè)施數(shù)據(jù),利用公共服務(wù)設(shè)施的數(shù)量、服務(wù)范圍、人均擁有量等指標(biāo)從基本公共服務(wù)設(shè)施均衡度、便捷度以及服務(wù)水平等方面進(jìn)行監(jiān)測與綜合分析。
市轄區(qū)人均教育、醫(yī)療用地面積指標(biāo)計算公式如表2所示。根據(jù)數(shù)據(jù)統(tǒng)計,丹東市市轄區(qū)每千人中小學(xué)數(shù)0.096 2個,每千人中中學(xué)數(shù)為0.069 2個,分別居遼寧省10個國審城市第一位和第二位;丹東市市轄區(qū)人均教育用地面積4.31 m2,人均醫(yī)療用地面積0.51 m2。
表2 丹東市人均教育醫(yī)療指標(biāo)
學(xué)校覆蓋率統(tǒng)計為小學(xué)500 m緩沖區(qū)、中學(xué)1 000 m緩沖區(qū)內(nèi)的房屋建筑區(qū)面積除以房屋建筑區(qū)總面積。醫(yī)院覆蓋率統(tǒng)計為三級醫(yī)院12 000 m緩沖區(qū)、二級醫(yī)院6 000 m緩沖區(qū)、一級醫(yī)院2 000 m緩沖區(qū)、其他醫(yī)院1 000 m緩沖區(qū)內(nèi)的房屋建筑區(qū)面積除以房屋建筑區(qū)總面積。學(xué)校、醫(yī)院覆蓋率反映區(qū)域內(nèi)教育、醫(yī)療覆蓋及完善程度。根據(jù)數(shù)據(jù)統(tǒng)計,丹東市市轄區(qū)小學(xué)、中學(xué)覆蓋率分別為35.22%和47.34%;三級、二級、一級和無等級醫(yī)院覆蓋率分別為76.67%、56.06%、33.08%和55.04%。丹東市教育、醫(yī)療機構(gòu)覆蓋范圍如圖3、4所示。
圖3 丹東市教育機構(gòu)覆蓋范圍圖
圖4 丹東市醫(yī)療機構(gòu)覆蓋范圍圖
在以丹東市城市地理國情監(jiān)測為實例的城市基本公共服務(wù)水平監(jiān)測與分析中,利用Python語言開發(fā)爬蟲程序,實現(xiàn)了開源大數(shù)據(jù)中教育、醫(yī)療機構(gòu)POI數(shù)據(jù)獲取,對地理國情監(jiān)測數(shù)據(jù)進(jìn)行了補充,并結(jié)合統(tǒng)計和監(jiān)測數(shù)據(jù),對城市基本公共服務(wù)設(shè)施的分布現(xiàn)狀、覆蓋范圍、人均用地面積等進(jìn)行統(tǒng)計分析,實驗表明:
1)Python編程語言能夠在開源POI數(shù)據(jù)獲取中發(fā)揮重要作用。Python作為一種簡單易讀且可擴展性極強的高級編程語言,不僅能夠在地理空間分析中得到廣泛應(yīng)用,還可以利用其標(biāo)準(zhǔn)庫與第三方模塊,開發(fā)爬蟲程序,高效、快速地獲取開源POI數(shù)據(jù)。在實際工作中,利用Python開發(fā)開源POI數(shù)據(jù)獲取程序,能夠最大減少外業(yè)采集興趣點的工作量,對今后地理國情監(jiān)測項目具有重要的應(yīng)用價值。
2)基于Python獲取POI數(shù)據(jù)可作為基礎(chǔ)性地理國情監(jiān)測數(shù)據(jù)的重要補充。在地理國情監(jiān)測項目中,需完整采集大中小學(xué)校、一二三級十等醫(yī)院等單位院落,但對培訓(xùn)機構(gòu)等其他教育學(xué)校、社區(qū)衛(wèi)生服務(wù)機構(gòu)和其他醫(yī)療衛(wèi)生機構(gòu)并沒有做采集要求,而在城市地理國情監(jiān)測中則需要補充采集。利用Python開發(fā)爬蟲程序獲取開源POI數(shù)據(jù)能滿足城市地理國情監(jiān)測的提取要求,補充地理國情監(jiān)測數(shù)據(jù)不足,同時也為其他需要補充POI數(shù)據(jù)的地理監(jiān)測項目提供參考。
3)如何獲取更準(zhǔn)確、全面的POI數(shù)據(jù)還有值得探討的空間。高德地圖關(guān)鍵詞搜索最多返回900個POI信息,這對于基于大數(shù)據(jù)統(tǒng)計分析來說明顯是不夠的。通常有兩種思路:一是細(xì)化關(guān)鍵詞,例如本文將搜索關(guān)鍵詞“學(xué)?!奔?xì)化成“小學(xué)”、“中學(xué)”、“大學(xué)”和“培訓(xùn)學(xué)?!?,但對于某些大城市依然無法獲取全部需要POI數(shù)據(jù)。二是縮小搜索范圍,將目標(biāo)搜索范圍切塊,使其變成多個搜索區(qū)塊,逐一進(jìn)行POI數(shù)據(jù)獲取,如何合理對目標(biāo)搜索范圍進(jìn)行切塊將會是下一步的研究方向。