胡 楠,孟憲偉,王彥超
(遼寧科技學(xué)院 曙光大數(shù)據(jù)學(xué)院,遼寧 本溪 117004)
開(kāi)放地圖包含了豐富的地理數(shù)據(jù),其目標(biāo)是向所有人提供地理數(shù)據(jù)使用及分享[1],用戶只需在OpenStreetMap官網(wǎng)的首頁(yè)“Geofabrik下載”鏈接下載所需的世界各個(gè)國(guó)家地區(qū)的地理數(shù)據(jù)壓縮文件。
每個(gè)數(shù)據(jù)包的主文件為ESRI(美國(guó)環(huán)境系統(tǒng)研究所公司)開(kāi)發(fā)的一種空間數(shù)據(jù)開(kāi)放格式數(shù)據(jù)文件,地理數(shù)據(jù)一般比較通用的格式是shp(Shapefile)文件;可以存儲(chǔ)井、河流、湖泊等空間對(duì)象的幾何位置,主要包括描述空間對(duì)象對(duì)應(yīng)的幾何體的點(diǎn)、折線與多邊形的空間數(shù)據(jù)。
1)地理坐標(biāo)系(Geographic Coordinate System)
地理坐標(biāo)系使用三維球面來(lái)定義地球表面的任何一個(gè)地標(biāo)的位置,并在地球表面的所有的地標(biāo)點(diǎn)位應(yīng)用經(jīng)緯度坐標(biāo)系來(lái)標(biāo)注的方法,在球面系統(tǒng)中,水平線為緯線、垂直線為經(jīng)線。
2)多邊形類型(Polygon和MultiPolygon)
任何一個(gè)區(qū)域、國(guó)家和省份都對(duì)應(yīng)一個(gè)多邊形,每個(gè)多邊形是由一系列邊線上的點(diǎn)組成的,而點(diǎn)的坐標(biāo)分別為該點(diǎn)在球面系統(tǒng)的緯線和經(jīng)線值,每一行為多邊形邊線上一個(gè)點(diǎn)的經(jīng)緯度坐標(biāo)。多邊形又分為Polygon和MultiPolygon,二者的區(qū)別如下:
(1)Polygon:為單面封閉多邊形,且其中第一行數(shù)據(jù)與最后一行數(shù)據(jù)相同,即第一個(gè)點(diǎn)與最后一個(gè)點(diǎn)重疊,這樣才能保證多邊形的封閉。Shapefile數(shù)據(jù)文件,為我們繪制地理空間圖形提供的數(shù)據(jù)源的數(shù)據(jù)格式如圖1(a)所示,該數(shù)據(jù)是某個(gè)行政區(qū)域的多邊形的shapely.geometry.polygon.Polygon類的對(duì)象。
(a)Polygon數(shù)據(jù)格式
(2)MultiPolygon:MultiPolygon為多面封閉多邊形,MultiPolygon類型數(shù)據(jù)特征是一個(gè)MultiPolygon可能存在多個(gè)Polygon單面多邊形數(shù)據(jù),其數(shù)據(jù)格式如圖1(b)所示,第一個(gè)Polygon代表這個(gè)整體的MultiPolygon對(duì)象的整體外部輪廓,而后續(xù)的每個(gè)Polygon對(duì)象是前一個(gè)Polygon對(duì)象的內(nèi)部空洞或內(nèi)部線條。
3)Python繪制多邊形
本文分為兩種情況探討繪制多邊形方法。
(1)如果繪制單面封閉多邊形,只需將Polygon對(duì)象轉(zhuǎn)對(duì)應(yīng)的每一行數(shù)據(jù)拆分成每個(gè)點(diǎn)的經(jīng)緯度值,并分別構(gòu)造列表為lats和lons,使用matplotlib.pyplot.plot(lats,lons)函數(shù)來(lái)繪制一個(gè)封閉多邊形,如圖2(a)所示。
(2)如果是繪制多面封閉多邊形,先需將MultiPolygon對(duì)象轉(zhuǎn)換為Polygon對(duì)象,具體可以使用遞歸的方法,依次將每個(gè)Polygon對(duì)象依次轉(zhuǎn)換為兩個(gè)列表lats和lons,再使用列表的list.extend()函數(shù)把后Polygon對(duì)象對(duì)應(yīng)列表追加到前一個(gè)列表末尾,構(gòu)造出包含外部多邊形和內(nèi)部空洞多邊形或內(nèi)部線條總的經(jīng)緯度列表lats和lons,然后再繪制多邊形,如圖2(b)所示。
(a)Polygon多邊形圖形
(b) MultiPolygon多邊形圖形
1)注記信息的目的和意義
隨著地理信息系統(tǒng)(Geographic Information System,GIS)的廣泛應(yīng)用, 有效準(zhǔn)確的地圖信息標(biāo)注是GIS的基本功能也是重要的研究問(wèn)題,更是備受社會(huì)各界關(guān)注的問(wèn)題,因?yàn)闊o(wú)論應(yīng)用在哪個(gè)具體的行業(yè), GIS數(shù)據(jù)質(zhì)量的好壞直接影響到所要建立的地理空間數(shù)據(jù)庫(kù)所帶來(lái)的經(jīng)濟(jì)效益和社會(huì)效益,并直接影響到基于該空間地理數(shù)據(jù)信息的應(yīng)用、分析、決策的準(zhǔn)確性和可信度。
2)注記信息的屬性
注記一個(gè)區(qū)域文本信息的意義要遠(yuǎn)大于繪制多邊形的邊線,由于地理空間數(shù)據(jù)可視化不僅包括每個(gè)封閉區(qū)域邊線的繪制,還需要每個(gè)區(qū)域文本信息的標(biāo)注,而確定信息注記位置也是實(shí)現(xiàn)地理空間數(shù)據(jù)可視化的關(guān)鍵點(diǎn)和重要組成部分,注記標(biāo)簽中的文字是要素的某個(gè)字段屬性,且標(biāo)記文本具有自己地理位置(文本的注記經(jīng)緯度)和屬性(文本要素的顯示字樣),注記文本應(yīng)有自己的顯示模式和風(fēng)格,但是地理空間數(shù)據(jù)對(duì)應(yīng)注記文本的注記位置并沒(méi)有標(biāo)準(zhǔn)。
3)注記信息的位置
中心點(diǎn)是2012年公布的地理信息系統(tǒng)名詞,本文使用地理區(qū)域中心點(diǎn)來(lái)標(biāo)注該區(qū)域文本信息[2]。Python的geopandas.geodataframe.GeoDataFrame. representative_point(GeoDataFrame)函數(shù)返回每個(gè)區(qū)域多邊形的中心點(diǎn);每個(gè)多邊形的中心點(diǎn)為Python的geopandas.geoseries.GeoSeries對(duì)象,其數(shù)據(jù)格式為Point類對(duì)象,即該點(diǎn)的經(jīng)緯度值。
4)帶注記信息的地理區(qū)域繪圖
實(shí)現(xiàn)封閉區(qū)域多邊形繪制,其核心理念是將繪圖與數(shù)據(jù)分離,且按圖層疊加的方法進(jìn)行作圖。最底層是地理區(qū)域的地理空間數(shù)據(jù);然后依次疊加使用底層數(shù)據(jù)的邊界繪圖(包括區(qū)域填充和線條顏色等樣式設(shè)置);再次疊加封閉區(qū)域內(nèi)散點(diǎn)標(biāo)注;最后疊加對(duì)應(yīng)區(qū)域文本信息的注記,如圖3所示。
圖3 帶地理數(shù)據(jù)信息注記的區(qū)域圖
shapely是用來(lái)表示地理空間數(shù)據(jù)的Python第三方庫(kù),它的確定性空間分析是解決農(nóng)業(yè)、交通、流行病、行政區(qū)域劃分和許多其他領(lǐng)域相關(guān)問(wèn)題的計(jì)算方法的重要組成部分。 shapely對(duì)應(yīng)的數(shù)據(jù)類型的三要素為:點(diǎn)(Point)、線(LineString)和面(Polygons)。每個(gè)平面中都包含這點(diǎn)、線和面組合的有限或無(wú)限的點(diǎn)關(guān)聯(lián)。這三個(gè)要素的內(nèi)部、邊界和外部集是相互排斥的,但是三者的并集與整個(gè)平面重合。
geopandas是用來(lái)處理地理空間數(shù)據(jù)的Python第三方庫(kù), geopandas使得Python處理地理空間數(shù)據(jù)更為簡(jiǎn)潔和準(zhǔn)確,geopandas沿用了pandas的數(shù)據(jù)類型,Series和DataFrame,geopandas中也有兩種數(shù)據(jù)類型,GeoSeries和GeoDataFrame,它們繼承了pandas數(shù)據(jù)結(jié)構(gòu)的大部分方法,且結(jié)合了pandas和shapely的功能,還提供了操作地理空間數(shù)據(jù)的高級(jí)接口,使得在Python中進(jìn)行GIS操作變成可能[3]。
plotnine是用來(lái)實(shí)現(xiàn)地理空間數(shù)據(jù)可視化的Python第三方庫(kù), plotnine的圖形語(yǔ)法把繪圖過(guò)程分為三部分:Plot(圖)= data(數(shù)據(jù)集,主要是GeoDataFrame數(shù)據(jù))+ Aesthetics(映射,變量映射給x,y軸坐標(biāo),或映射給大小、形狀和顏色等圖形屬性)+ Geometry(幾何對(duì)象,柱形圖、直方圖、散點(diǎn)圖和線圖等),且通過(guò)“+”對(duì)相關(guān)圖形語(yǔ)法進(jìn)行疊加,且各圖層之間的逐級(jí)靠“+”號(hào)疊加越后面圖層的層級(jí)越高,從而使得繁瑣的繪圖過(guò)程邏輯清晰。
Python語(yǔ)言實(shí)現(xiàn)地理空間數(shù)據(jù)可視化的主要依據(jù)shapely的點(diǎn)、線和面的互斥和合并平面的原理,結(jié)合plotnine的“+”號(hào)逐級(jí)疊加的方法,實(shí)現(xiàn)地理空間數(shù)據(jù)可視化步驟如下:
(1)Python使用GeoPandas讀取地理空間數(shù)據(jù)文件(.shp),并返回GeoDataFrame格式數(shù)據(jù)。
(2)使用plotnine的ggplot(df)函數(shù)作為開(kāi)始(ggplot類生成一個(gè)圖形數(shù)據(jù)集)。
(3)geom_map(aes(fill= ' ID_1'))函數(shù)進(jìn)行映射和繪制地圖(aes()函數(shù)實(shí)現(xiàn)”ID_1”字段到顏色或樣式的映射)。
(4)geom_point(aes(x='lat',y='lon'),shape='o',colour='k',size=2,fill='r',alpha=0.4)函數(shù)繪制點(diǎn)圖(aes()實(shí)現(xiàn)散點(diǎn)x和y軸位置到數(shù)據(jù)源字段的映射,其他參數(shù)實(shí)現(xiàn)映射給大小、形狀、顏色和透明度等圖形屬性)。
(5)geom_text(aes(x='lat',y='lon',label='NAME_1'),size=5)函數(shù)繪制文本。
(6)scale_fill_gradient2(low='red',mid='white', high='blue', midpoint=df.ID_1.mean())函數(shù)實(shí)現(xiàn)三色梯度,順序由低到高,參數(shù)low、mid和high 用于控制此梯度顏色,參數(shù)midpoint 設(shè)定中點(diǎn)值。
基于OSM的精準(zhǔn)數(shù)據(jù)源,Python的geopandas.GeoDataFrame的靈活數(shù)據(jù)格式,plotnine的優(yōu)質(zhì)的圖層疊加技術(shù),從而實(shí)現(xiàn)多層baseplot數(shù)據(jù)對(duì)象的可視化,本文充分結(jié)合三者的優(yōu)勢(shì),對(duì)不同類型封閉區(qū)域數(shù)據(jù)進(jìn)行格式的歸一化和數(shù)據(jù)內(nèi)容的整理,從而實(shí)現(xiàn)任何一個(gè)地域的河流、公路交通、鐵路交通、疫情防控等數(shù)據(jù)分布圖的繪制和信息注記。
地理信息系統(tǒng)空間數(shù)據(jù)的迅猛增長(zhǎng), 加之地理大數(shù)據(jù)自身的多元性和豐富性的特點(diǎn),地理信息大數(shù)據(jù)的應(yīng)用已經(jīng)逐步滲透到人們生活的各個(gè)方面。本文使用了豐富完備的地理空間數(shù)據(jù),依據(jù)完備的地理空間數(shù)據(jù)的處理與分析,使用Python功能強(qiáng)大的圖形拼接組合方法和地理空間數(shù)據(jù)可視化設(shè)計(jì)策略,以單個(gè)地理空間區(qū)域?yàn)槠瘘c(diǎn),通過(guò)把每個(gè)區(qū)域的點(diǎn)線面的整合和合并,設(shè)計(jì)了合理的地理空間數(shù)據(jù)的可視化方案。本文從地理大數(shù)據(jù)的特性出發(fā),強(qiáng)調(diào)地理空間大數(shù)據(jù)的發(fā)現(xiàn)規(guī)律和趨勢(shì)預(yù)測(cè)的能力,展示出地理信息可視化效果,體現(xiàn)了地理信息標(biāo)注的重要作用,為各行各業(yè)的用戶提供輔助決策支持。