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