本篇不討論矢量柵格數(shù)據(jù)的結(jié)構(gòu),也不討論矢量與柵格的區(qū)別(即設(shè)定讀者有這方面的基礎(chǔ))。
版權(quán)聲明:原創(chuàng)。博客園/B站/小專欄/知乎/CSDN @秋意正寒
轉(zhuǎn)載請標(biāo)注原地址并聲明轉(zhuǎn)載: https://www.cnblogs.com/onsummer/p/12082568.html
本文系概念性很強的博客,但對GIS項目有幫助,對在讀的學(xué)生也有一定幫助。
盡管從物理的角度,只有獨立數(shù)據(jù)文件(shp、geojson、tif等)或者數(shù)據(jù)庫(esri geodatabase的gdb、geopackage等)這兩種
但是,從學(xué)科角度,即從GIS的視角看,地理數(shù)據(jù)并沒有那么簡單。
為解釋簡便,使用shapefile、geojson、tif柵格和gdb、postgis,輔助ArcMap/QGIS 3.10做解說。
地理數(shù)據(jù)=空間數(shù)據(jù)+非空間數(shù)據(jù);也叫地理信息。例如:一座醫(yī)院;一所學(xué)校;一條道路;一條河流
即幾何數(shù)據(jù),描述坐標(biāo)、形狀的數(shù)據(jù);也叫空間信息。例如:形狀、坐標(biāo)
即屬性數(shù)據(jù),描述與空間位置無關(guān)的一類數(shù)據(jù)。例如:成績單、醫(yī)院名稱列表
這類數(shù)據(jù)的特點是,如果脫離了地理位置也有它本身自己的含義。
不妨這樣想:每一層均為子一層的容器。大魚吃小魚,小魚吃蝦米。
這是矢量數(shù)據(jù)的最底層,有兩個類別:幾何層或者屬性層。
前陣子寫了一系列坐標(biāo)系有關(guān)的博客,我們假定在某個坐標(biāo)系下,存在某個點P(x0,y0),這個點在這個確定的坐標(biāo)系下,就是獨一無二的。
那么,如果這個點代表的是一個咖啡店,僅僅知道這個點的坐標(biāo)(x0,y0)是不夠的。
不同的用戶關(guān)心不同的信息,有人關(guān)心這個店的電話號碼,有的人關(guān)心它所在的城市和行政區(qū),有的人關(guān)心它的地址,有的人關(guān)心它的人均消費。
這個時候,信息就可以分化成兩個種屬:幾何的,屬性的。
上大學(xué)的時候,系主任說:地理數(shù)據(jù)區(qū)別于其他行業(yè)的數(shù)據(jù),最大的區(qū)別是它具有空間數(shù)據(jù)!
我們剛明確了幾何數(shù)據(jù)是什么,屬性數(shù)據(jù)是什么,那么多出來的一系列名詞又是什么?
做以下規(guī)定:
這樣就不亂了。默認(rèn)使用“地理數(shù)據(jù)=幾何數(shù)據(jù)+屬性數(shù)據(jù)”這個表達(dá)。
現(xiàn)在講概念其實很枯燥,那么一個具體的矢量數(shù)據(jù)文件,比如geojson或者shp,如何判斷哪些是幾何數(shù)據(jù),哪些是屬性數(shù)據(jù)呢?
我們?nèi)∫粋€geojson文件,只有一個點,沒有屬性數(shù)據(jù)。它在QGIS里長得像這樣:
它數(shù)據(jù)長這樣:
是WGS84下的一個點,在廣州城區(qū)。
我們可以很快聚焦到"geometry"這個鍵上,它下列有兩個子鍵"type"和"coordinate",這兩個子鍵的值就是這個geojson矢量數(shù)據(jù)的幾何信息。
讀者可以想象得到,如果type是“LineString(即多折線)”,那么coordinate將是一堆折線段的集合。
如果是Polygon:
geometry的值的的確確就是上面提及的“表征位置信息的坐標(biāo)數(shù)據(jù)”。
我編輯了一下只有一個點的geojson,使其擁有三個屬性數(shù)據(jù):所在城市是"Guangzhou",編輯者是"秋意正寒",郵政編碼是"510000".
屬性表長這樣:
文本變成了這樣:
我們不難看到,和geometry鍵并列的多了一個鍵:"properties"。
它翻譯過來就是屬性的意思(別的數(shù)據(jù)格式可能叫“attributes”)
我們看到了在geojson中,“幾何層”、“屬性層”是如何組織的。
shp文件至少要有3個文件構(gòu)成,*.shp、*.shx、*.dbf
因為這些是二進(jìn)制文件,不能用文本格式查看,所以直接給出結(jié)論:
*.shp文件記錄的是幾何數(shù)據(jù)
*.dbf文件記錄的是屬性數(shù)據(jù)
*.shx鏈接二者是索引數(shù)據(jù)
我們將2.1.1中的geojson文件在QGIS中導(dǎo)出shp并在ArcMap里打開其屬性表:
發(fā)現(xiàn)多了兩列屬性,其中Shape屬性無論給這個shp文件加多少個點,它的值在ArcMap屬性表里的都是一個漢字“點”。
而且,F(xiàn)ID和Shape屬性是無法在屬性表里編輯的。
實際上,這個Shape屬性列,就是幾何數(shù)據(jù),ArcMap把它“寫”在了屬性表而已。我們編輯它還是得靠編輯工具。
ArcMap的屬性表通過“顯示”Shape列,告訴用戶幾何數(shù)據(jù)和旁邊city、editor、adcode三列是并排的。
也即“幾何數(shù)據(jù)”、“屬性數(shù)據(jù)”是同級別的數(shù)據(jù),只不過幾何數(shù)據(jù)可能很復(fù)雜,在屬性表上一個格子寫不完,就干脆寫個漢字。
實際在ESRI的體系中,幾何的表達(dá)比OGC的表達(dá)更為精妙復(fù)雜。
因為深入需要研究ArcPy或AO代碼,有一定難度,故不展開。讀者只要能讀懂“幾何”“屬性”是并列的兩個數(shù)據(jù)層即可。
要素層很簡單。
先下定義:一個要素表示一個地理實體,一個要素有其自己的幾何數(shù)據(jù)和屬性數(shù)據(jù)。
我們依舊是上面的點json來講解。
不難看到,properties和geometry鍵都是"features"這個數(shù)組的某個元素下的子鍵,這里的某個元素,就是要素。
也即,{"type": “Feature”, ...}就是一個"feature",一個要素。
由于有了幾何和屬性的分割,一個要素當(dāng)然可以有n個屬性,一個要素的幾何也可以是n個點/線/面構(gòu)成的復(fù)雜幾何圖形。
n個屬性好理解,n個點/線/面構(gòu)成的復(fù)雜幾何圖形又是什么意思呢?
這里不再展開描述,有興趣的朋友可以去參考o(jì)gc的Geometry標(biāo)準(zhǔn),它規(guī)定了幾何體的復(fù)雜構(gòu)成。以后有機會一定會寫一篇ogc標(biāo)準(zhǔn)下的geometry標(biāo)準(zhǔn)。
我們注意到了,"features"下的每個要素的properties的子鍵都是一樣的(名稱、類型)。
還是以上文的geojson為例。
我們說,
n個具有共同類型和數(shù)量屬性的"feature"(即每一個feature的"properties"的子鍵名稱一致,類型一致),加上一些元數(shù)據(jù)(坐標(biāo)系信息,四至等,每種數(shù)據(jù)格式不太一樣),構(gòu)成一個矢量數(shù)據(jù)。
這個矢量數(shù)據(jù)已經(jīng)上升到磁盤文件級別了,我們?yōu)榱藦?fù)用,不可能一個一個要素分別存在獨立的文件里的,因為屬性的數(shù)量、類型一致,所以要素可以存在一個文件(或者容器)里。
我們把這個容器所在的級別,叫做“數(shù)據(jù)層”。
我為什么不說一個矢量數(shù)據(jù)文件(例如一個json文件,一份shp文件)就是一個“數(shù)據(jù)層”的實現(xiàn)呢?
因為,一個矢量數(shù)據(jù)固然可以是一個geojson文件,一個shp文件(由多個同名子文件組成),一個gml文件,一個csv文件...當(dāng)然一個矢量數(shù)據(jù)也可以是數(shù)據(jù)庫里的一個表,或者一個要素類(ArcGIS里的gdb)。
我們討論的是“分層”,而不是物理文件構(gòu)成。
通常來說,我們傳遞的數(shù)據(jù)大多數(shù)處于數(shù)據(jù)層。比如,我們傳遞一個“中國省級行政區(qū)劃”的shp文件,或者傳遞一個“廣州市醫(yī)療機構(gòu)點位”的geojson文件。
我們很少傳遞一個“要素”,傳遞一個“幾何面”——代碼層面除外。
我們把一個矢量數(shù)據(jù)(geojson/shp/數(shù)據(jù)庫里某張地理數(shù)據(jù)表等)拖到任何一個GIS客戶端軟件中,一定能看到它的樣子,軟件會給我們畫出來,它這個時候,叫做“圖層”。
因為數(shù)據(jù)和圖層分擔(dān)著各自不同的任務(wù),圖層負(fù)責(zé)渲染、顯示數(shù)據(jù),數(shù)據(jù)被圖層引用。一個數(shù)據(jù)是可以被多個圖層引用的。
這就好比,賬本專心管理財務(wù)流水,報表ppt專心負(fù)責(zé)回報財務(wù)流水的各種趨勢比例。
我們GIS軟件依靠圖層將數(shù)據(jù)符號化,比如給某個點數(shù)據(jù)設(shè)定了符號是一個尺寸是15的紅色五角星,給某個線數(shù)據(jù)設(shè)定了標(biāo)注是它的“name”字段,通過圖層查看一個數(shù)據(jù)的元數(shù)據(jù)等...
什么是地圖層?
我們有了數(shù)據(jù)層,就可以進(jìn)行地理數(shù)據(jù)的分析、展示、交互了。
我們?yōu)榱私M織起地理數(shù)據(jù),需要將數(shù)據(jù)排列順序,符號化,設(shè)計出一張地圖。
地圖這一層包括了n個數(shù)據(jù)(也即n個圖層,每個圖層引用一份數(shù)據(jù))。
當(dāng)然,我們還可以為數(shù)據(jù)做分組。
我們知道ArcMap中,有個“數(shù)據(jù)框”的概念,其實一個數(shù)據(jù)框就是一個地圖,數(shù)據(jù)框就是地圖層這一級別的容器。
大家可能看中國地圖會觀察到右下方通常會有一個“南海諸島圖”,其實中國大陸主體地區(qū)和右下方的“南海諸島圖”用兩個數(shù)據(jù)框就可以表示了。
事實上,QGIS也有一樣的概念,在布局窗口中,我們可以插入一個地圖:
同樣能做到“南海諸島圖”和大陸圖在同一個布局里顯示的效果。這里插入的“地圖”就是“地圖層”的一個活生生的案例。
GIS客戶端軟件會使用“工程文件”的手段,把n個“地圖”包裹在一起。QGIS使用*.qgz文件,ArcMap使用mxd文檔,ArcGISPro使用arpx文件。
柵格數(shù)據(jù)和矢量數(shù)據(jù)當(dāng)然是有區(qū)別的,但是,在概念上可以歸一。
在柵格中,幾何圖形所代表的空間數(shù)據(jù)被像元的中心坐標(biāo)值代替了,該像元的像元值即屬性值。
我們知道,柵格數(shù)據(jù)可以是單波段也可以是多波段,可以是浮點數(shù)柵格也可以是整數(shù)柵格。
柵格數(shù)據(jù)可以代表的地理數(shù)據(jù)種類比較多,以單波段數(shù)據(jù)為例,整數(shù)柵格有屬性表,可以添加多列屬性(即給不同的像元值賦予不同的意義),浮點柵格則不行。
多波段則能實現(xiàn)“同一個像元坐標(biāo)”“n個像元值”,并且每個像元值獨立,不受整數(shù)或者浮點數(shù)影響。
像元,包括像元分辨率、像元中心坐標(biāo)和像元值三大主要數(shù)據(jù)。
像元層并不像矢量中的要素層表意那么直接,因為單像元表達(dá)的地理實體不如一個要素強。但是,多個像元是可以做到一個要素的表達(dá)效果的。
比如,在DEM柵格數(shù)據(jù)中,一個像元可以概括表達(dá)這個像元面積這么大的地方的海拔高度。多個連片的像元可以構(gòu)成一塊地區(qū)的地形。
但是,和要素層的核心要義是一樣的,像元層和要素層都能表達(dá)地理實體,把像元的三大主要數(shù)據(jù)孤立討論,是不能表達(dá)地理實體的。
數(shù)據(jù)層和矢量數(shù)據(jù)的數(shù)據(jù)層類似,為n個呈矩陣排列的像元構(gòu)成的圖像。
這個圖像可以是一層,也可以是多層疊加,只要保證像元中心坐標(biāo)一致、像元分辨率一致即可。
數(shù)據(jù)層的物理形式比較簡單,除了一些元數(shù)據(jù)外(坐標(biāo)系什么的),就是一個體積比較大的數(shù)據(jù)文件,或者在數(shù)據(jù)庫里的一張表或者一個柵格數(shù)據(jù)集(Esri gdb)。
若為一個單文件,常見的GIS數(shù)據(jù)格式為tif,盡管jpg/png/bmp等傳統(tǒng)圖片格式也可以稱作柵格數(shù)據(jù),但是它們設(shè)計的初衷并不是GIS應(yīng)用。
在GIS數(shù)據(jù)服務(wù)中,柵格數(shù)據(jù)切片可以是jpg/png,因為便于網(wǎng)絡(luò)傳輸和顯示。
地圖層與矢量數(shù)據(jù)的地圖層一致,都為n個柵格數(shù)據(jù)按一定順序、符號化構(gòu)成。
GIS服務(wù),與普通網(wǎng)絡(luò)服務(wù)是一樣的。
我們常見的Web服務(wù)器軟件,有IIS、Apache、Nginx、tomcat等,也可以用Java/nodejs等工具語言編寫自己的服務(wù)器后臺軟件。
GIS服務(wù)器軟件基于HTTP等協(xié)議(做webgis的,如果連http協(xié)議都不知道,建議先補補課),也有一些受歡迎的:開源的GeoServer、MapServer,商用的Esri的ArcGIS Enterprise套件等。
GIS服務(wù)器可以是獨立的軟件,也可以是某個Web服務(wù)器的一個插件。例如,ArcGIS Enterprise套件就是自成一家,GeoServer就是Tomcat的一個war包插件。
Q:GIS數(shù)據(jù)一定要放在GIS服務(wù)器上嗎?
A:不一定。諸如geojson這樣的文本類型數(shù)據(jù),可以直接放到普通web服務(wù)器上,通過http的get或post請求交換數(shù)據(jù);諸如gltf、3dtiles三維數(shù)據(jù),開源服務(wù)器尚未支持三維服務(wù),OGC組織也沒有3DGIS服務(wù)規(guī)范,只好放在普通web服務(wù)器上。但是,成熟的二維數(shù)據(jù),做成GIS數(shù)據(jù)服務(wù)是有利于前端開發(fā)者進(jìn)行調(diào)用、渲染、數(shù)據(jù)查詢、云處理的。
扯了半天,那什么是GIS服務(wù)呢?
通常來說,我們說的GIS服務(wù)就是GIS數(shù)據(jù)服務(wù)。但是,其實GIS服務(wù)還可以提供計算服務(wù),也即GIS處理服務(wù),作為4.3的內(nèi)容講解。
OGC中數(shù)據(jù)服務(wù)有很多,只挑一些常見的帶過,具體怎么用還是得靠讀者進(jìn)一步閱讀更多的資料,本文的重點仍舊是上面的四層概念。
GIS服務(wù)扮演的角色,更像是WebGIS中對GIS數(shù)據(jù)和用戶交互之間的一個橋梁,它規(guī)范并限制了請求端的操作。
GIS數(shù)據(jù)服務(wù)應(yīng)該屬于“地圖層”這一層級,因為它可以包括多個數(shù)據(jù)(圖層)。
WMS,Web Map Service,網(wǎng)絡(luò)地圖服務(wù)。
一個WMS是一個“地圖層”的實現(xiàn),只不過限制了網(wǎng)絡(luò)請求的功能。
它允許將n個數(shù)據(jù)發(fā)布成一個“GIS服務(wù)”,1個數(shù)據(jù)被叫做1個圖層,因為要對web提供訪問,所以用圖層這種帶符號化的形式來描述“數(shù)據(jù)層”比較合適。
它提供了以下幾大功能,有興趣的朋友可以參考博客園李曉暉的博客,或者直接查閱OGC官方文檔(列在參考文檔中了):
第一個沒什么好說的。
第二個獲取的是給定參數(shù)(比如范圍、返回圖像的格式等)的地圖圖像,和截圖差不多。
第三個功能,說大白話就是“點擊地圖,根據(jù)點位獲取指定圖層上的要素”。
WFS,Web Features Service,網(wǎng)絡(luò)要素服務(wù)。
WFS強化了WMS中關(guān)于矢量數(shù)據(jù)的訪問,提供了增加、修改、刪除、查詢矢量要素的功能。
WMS對矢量數(shù)據(jù)的查詢,局限在了“識別”這一功能上。
我們從功能上就能看出,WMS有一個功能是“getFeaturesInfo”,而WFS直接給出了"getFeature"、“Transaction”等功能。
WFS的主要功能如下:
GetCapabitities和DescribeFeatureType的區(qū)別在于,前者描述整個服務(wù),后者聚焦于矢量數(shù)據(jù)的元數(shù)據(jù)。
GetFeature既可以使用get請求,也可以使用post請求。無論get請求還是post請求,都可以使用過濾條件,過濾一些不滿足給定條件的矢量數(shù)據(jù)。
Transaction使用post請求,將指定格式的xml請求到gis服務(wù)器上。
WFS要求服務(wù)的接口必須由XML描述,另外數(shù)據(jù)交互必須由GML(一個OGC矢量數(shù)據(jù)格式規(guī)范)迚行,數(shù)據(jù)過濾采用CQL語言。
WCS標(biāo)準(zhǔn)定義了一些操作,這些操作允許用戶訪問“Coverage”數(shù)據(jù),如衛(wèi)星影像、數(shù)字高程數(shù)據(jù)等,也就是柵格數(shù)據(jù)。
有矢量就有柵格,與WFS形成對比,WCS的C,就是柵格數(shù)據(jù)的意思。
WCS也有幾個功能:
WMS能給前端返回一張位圖,和我們在GIS軟件里對一個地圖直接截個圖(不經(jīng)過制圖)類似。
如果這張位圖體積過大或者網(wǎng)絡(luò)傳輸不好,那么極有可能前端是拿不到的,就渲染不出來。
分治思想刺激WMS演進(jìn),即WMTS,原理很簡單,即把這張位圖實現(xiàn)按網(wǎng)格切好,在不同的分辨率下,把這些切好的圖(都緩存在地理服務(wù)器上)按前端指定的范圍,挨個傳遞。
這樣,一張小圖可能體積并不大,保證了前端的體驗。
迄今為止并未有三維地理數(shù)據(jù)服務(wù)標(biāo)準(zhǔn),只有三大地理三維數(shù)據(jù)格式標(biāo)準(zhǔn):
其中,前兩個被ogc承認(rèn),且主推i3s。
i3s由Esri(就arcgis家)主推,以slpk文件為交互文件,在自家的ArcGIS Enterprise服務(wù)器生態(tài)中,已經(jīng)研發(fā)出“SceneService”這種GIS商業(yè)數(shù)據(jù)服務(wù)了。
3dtiles是ogc的一個標(biāo)準(zhǔn),是i3s的主要競爭對手。
gltf,號稱是三維數(shù)據(jù)界的jpg,目前(發(fā)文時間2020年初)開源的商業(yè)的gis服務(wù)器尚未支持三維服務(wù),cesium自己是直接前端調(diào)用gltf文件創(chuàng)建視圖。
s3m是國內(nèi)北京超圖主推的一個標(biāo)準(zhǔn)。
i3s、gltf、s3m三者共同的特點是用樹結(jié)構(gòu)來組織數(shù)據(jù),用json文件描述數(shù)據(jù),用二進(jìn)制文件來存儲具體數(shù)據(jù)。
遵循一種規(guī)范,可以將繁重的處理任務(wù)交由服務(wù)器運行,然后根據(jù)規(guī)范,將處理結(jié)果返回給前端。這在普通的web服務(wù)中是理所當(dāng)然的事情,只不過加上GIS數(shù)據(jù)這個殼兒,事情就變得有點復(fù)雜了起來。
其實OGC組織是有這么一個規(guī)范的,叫WPS——Web Process Service。
Web 處理服務(wù) (WPS) 是用于發(fā)布地理空間過程、算法和計算的 OGC 服務(wù)。
WPS 服務(wù)可作為GIS服務(wù)器的擴展,為數(shù)據(jù)處理和地理空間分析提供執(zhí)行操作。
默認(rèn)情況下,WPS 不是 GeoServer 的一部分,但可作為擴展提供。
Esri ArcGIS Enterprise中的Server和Portal都原生支持了WPS,并且有比WPS更強大的GP服務(wù)。
有關(guān)WPS在GeoServer上的資料,參考各大博客和文末的參考文檔。
==============分割線==============
GIS服務(wù)器有商業(yè)也有開源,對OGC的多個服務(wù)支持也各有千秋,本文僅作簡略介紹,而且有標(biāo)準(zhǔn)文檔、各路案例博客資料,想必可以不再發(fā)文描述。
讀者更應(yīng)該關(guān)注的是本文提出的“四層概念”,多思考多比對。
在本篇中的四層概念合適套用在二維數(shù)據(jù)或者三維數(shù)據(jù)上,至于i3s標(biāo)準(zhǔn)下的slpk和3dtiles、gltf數(shù)據(jù)并不太適用,那些更合適網(wǎng)絡(luò)分發(fā),畢竟官方提及,slpk不適合再進(jìn)行編輯。
[1] GeoServer中WMS、WFS的請求規(guī)范 . 李曉暉. https://www.cnblogs.com/naaoveGIS/p/5508882.html
[2] OGC標(biāo)準(zhǔn)介紹. 吳泳鋒 [M] warrenwyf@gmail.com
[3] GeoServer WPS文檔 https://docs.geoserver.org/latest/en/user/services/wps/index.html
[4] OGC標(biāo)準(zhǔn)介紹 5 . https://blog.csdn.net/warrenwyf/article/details/5717612
[5] OGC標(biāo)準(zhǔn)介紹. https://blog.csdn.net/lavanana/article/details/93975949