聊聊GIS中的座標系|再版 識別各種資料的座標系及程式碼中的座標系
本篇講講在GIS桌面軟體和實際資料中,以及各路GIS有關API的程式設計中,如何尋找座標系資訊。慣例:
本文約2000字,建議閱讀時間10分鐘。
作者:部落格園/B站/知乎/csdn/小專欄 @秋意正寒
版權:轉載請告知,並在轉載文上附上轉載宣告與原文連結(https://www.cnblogs.com/onsummer/p/12082359.html)
有關“未定義座標系”的資料如何粗略判別是什麼座標系,已經在上篇的第5.1節寫明瞭,這裡想說的是,已經定義好座標系統的程式/資料,在哪裡找。
目錄:
0. 預備知識(WKT的概念)
1. 硬碟上的資料/資料庫(shp、geojson、tif柵格、幾個單檔案資料庫、kml/gml/gpx)
2. GIS資料服務種的座標系(2.1 ArcGIS家的/2.2 geoserver的)
3. 程式碼種的座標系(3.1 AO/AE 3.2 ArcGIS JsAPI 3.3 openlayers 3.4 ceisum)
0. 預備知識
0.1. WKT
和json在網路傳輸的地位一樣,是一個標記語言,全稱Well-Known Text,和上文提及的Well-Known ID出自同一個組織——OGC。
WKT是用文字形式記錄地理資訊的一個標記語言。什麼是地理資訊?除開我們常見的真·地理資訊點線面之類,還包括座標系統的定義。我們可以在epsg.io這個網站查詢想知道的座標系的WKID,也可以查到想知道座標系的WKT。
例如,WKID=4326的座標系的WKT如下:
GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4326"]]
此處不展開WKT的每一項定義。因為WKT的部落格實在太多了,本文略過不作為主要內容。
通常,如果拿到一個WKT,我會觀察最外層定義是GEOGCS還是PROJCS,這能判斷是地理座標系或投影座標系統。
然後,若為GEOGCS,我會在AUTHORITY處判斷它被epsg定義的WKID,上面這個wkt即4326.
WKT還有一種二進位制儲存格式,叫WKB。有關這兩個東西的文件在ogc官網是可查的。
1. 硬碟上的資料/資料庫
1.1. shapefiles
簡稱shp檔案。shp檔案至少有*.shp、*.shx、*.dbf三個同名檔案組成,若想為shp檔案定義一個座標系,告訴它“你的空間資訊落於哪個座標系下”,那就要再多一個同名的*.prj檔案。
一個shp檔案通常要有以上4個檔案,若無prj檔案只會在載入時不知道它的座標系資訊,實際資料並無影響,所以說shp檔案的最低下限是shp、shx、dbf三大檔案。
有關shp檔案的構成格式不再補充,也能在ogc官網查到對應標準。
此prj檔案內座標系的資訊,就是WKT文字。
PROJCS["Xian_1980_3_Degree_GK_CM_114E", GEOGCS["GCS_Xian_1980", DATUM["D_Xian_1980", PHEROID["Xian_1980",6378140.0,298.257]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Gauss_Kruger"], PARAMETER["False_Easting",500000.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian",114.0], PARAMETER["Scale_Factor",1.0], PARAMETER["Latitude_Of_Origin",0.0], UNIT["Meter",1.0]]
此處若無AUTHORITY資訊,可以用PROJCS內第一個字串"Xian_1980_3_Degree_GK_CM_114E"去epsg.io查詢(epsg.io不支援模糊查詢,用空格替換下劃線,儘量刪減一些關鍵詞)
1.2. GeoJson
geojson是一種用json標記的地理資料檔案,記錄二維資訊多一些,通常用於webgis傳遞。與turf、arcgis jsapi、openlayers等結合較好。
geojson也是一種ogc規範,開源。
開啟一個geojson檔案:
其中,頭部“crs”欄位就是座標系資訊,我們可以訪問其properties.name獲取有關EPSG資訊,此處WKID為32650。
但是,在大多數時候geojson是沒有crs欄位的,例如:
這就要問資料的提供者了。
1.3. 影像資料(tif檔案為例)
tif檔案為柵格影象檔案,字尾為tif或tiff,是ogc規範的一種,全稱GeoTiff。
通常不能在資源管理器中檢視tif柵格影像資料的座標系資訊,需要用GIS軟體檢視,因為它的座標系資訊寫在資料檔案內部。
如下圖:
此為ArcMap中Catalog檢視資料的屬性。
1.4. postgis/geopackage/esri geodatabase等資料庫
這些地理資料庫的資料均可在客戶端檢視,以QGIS為例,開啟這些資料庫裡的要素檢視座標系資訊。
①postgis
postgresql的一個外掛。
②geopackage
geopackage是一種輕量的單檔案資料庫,是sqlite的特例應用。
geopackage在QGIS裡的支援還不算很強,我的版本是3.8.1,還不支援右鍵匯入,拖拽的方式倒是可以。
讀取座標系的方法一樣。
③gdb
QGIS只能讀取gdb裡的表格和要素資料,複雜的資料因為esri商用問題不能讀取。
1.5. kml(kmz)/gml/gpx
kmz用壓縮軟體解壓後可獲取kml檔案。kml是xml格式的一種特殊化,原來用於Google Earth的資料互動,它與geojson的區別在於它可以帶符號、顏色、樣式資訊。
kml由於早期為Google Earth使用,由上篇可知預設使用WGS84(WKID=4326)座標系,所以大多數kml檔案是沒有寫入座標系資訊的(至少我在QGIS裡匯出的kml沒有)。
但是,在ogc文件中有定義座標系:http://docs.opengeospatial.org/is/12-007r2/12-007r2.html#1274
此處不展開。
gml也是類似的一種xml擴充套件標記語言,同樣為ogc規範的一種。
其座標系資訊寫在這裡,比較顯眼:
最後一個gpx檔案,是GPS衛星的資訊記錄,也是一種xml的應用。因為是GPS(早期GPS指美國GPS),所以用的是WGS84座標系。
2. GIS資料服務
2.1. ArcGIS Server
①地圖服務
訪問MapServerURL,可檢視地圖服務的基本資訊:
https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer
圈出的Spatial Reference即為此地圖服務(包括所有圖層)的WKID。
②影像服務
同地圖服務,但是影像服務並沒有子圖層。
例子:https://landsat2.arcgis.com/arcgis/rest/services/Landsat8_Views/ImageServer
③場景服務
場景服務,URL結尾是SceneServer,訪問後返回json,在控制檯可以通過這樣來訪問:
即可獲取其座標系。
注意,fetch函式在各主流瀏覽器中較新版本均支援,IE不清楚未測試。
本例URL為:http://scene.arcgis.com/arcgis/rest/services/Hosted/Building_Hamburg/SceneServer
④要素服務
基本方法同地圖服務,但是要注意的是要素服務既可單獨作為FeatureServer,也可以存在於MapServer中(作為要素圖層)。
URL例子:
https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/ks_earthquakes_since_2000/FeatureServer
https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0(若為MapServer中的要素圖層,請訪問上一級的MapServer檢視座標系)
⑤網路分析服務
網路分析服務,URL以NAServer結尾,因博主暫無網路分析服務的URL,暫時不能給例子,用法應該與MapServer類似。
⑥高程服務
高程服務,以ImageServer為載體。方法同影像服務。
例子:https://sampleserver6.arcgisonline.com/arcgis/rest/services/Elevation/MtBaldy_Elevation/ImageServer
2.2. GeoServer
wms/wfs/wcs
訪問其描述xml,然後檢視layer對應的"CRS"屬性即可。
例如:
wms的URL:http://<domain>:<port>/geoserver/wms?service=wfs&version=1.1.0&request=GetCapabilities
wfs的URL:http://<domain>:<port>/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities
wcs的URL:http://<domain>:<port>/geoserver/wfs?service=wcs&version=1.1.0&request=GetCapabilities
訪問此URL,瀏覽器會下載一個xml檔案,通過尋找以下標籤的值,即可獲取對應圖層的座標系:
<WMT_MS_Capabilities>