1. 程式人生 > >聊聊GIS中的座標系|再版 識別各種資料的座標系及程式碼中的座標系

聊聊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>