聊聊GIS中的座標系|再版 識別各類數據的座標系及代碼中的座標系

本篇講講在GIS桌面軟件和實際數據中,以及各路GIS有關API的編程中,如何尋找座標系信息。慣例:html

本文約2000字,建議閱讀時間10分鐘。前端

做者:博客園/B站/知乎/csdn/小專欄 @秋意正寒web

版權:轉載請告知,並在轉載文上附上轉載聲明與原文連接(http://www.javashuo.com/article/p-rymphcfq-dm.htmlsql

有關「未定義座標系」的數據如何粗略判別是什麼座標系,已經在上篇的第5.1節寫明瞭,這裏想說的是,已經定義好座標系統的程序/數據,在哪裏找。數據庫

目錄:

0. 預備知識(WKT的概念)編程

1. 硬盤上的數據/數據庫(shp、geojson、tif柵格、幾個單文件數據庫、kml/gml/gpx)json

2. GIS數據服務種的座標系(2.1 ArcGIS家的/2.2 geoserver的)api

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> 👉 <Capability> 👉 <Layer> (👉 <Layer> 若是有子圖層) 👉 <SRS>

若在Openlayers解析中,則叫做"CRS"。Openlayers解析wms信息的例子:https://openlayers.org/en/latest/examples/wms-capabilities.html?q=wms

若在 ArcGIS JsAPI中,則可經過訪問WMSLayer.description屬性獲取wms的描述。

3. 程序代碼

3.1. ArcObjects/ArcEngine(10.7爲例)

①IMap

經過訪問IMap.SpatialReference屬性可獲取ISpatialReference類型的座標系數據,意義是ArcMap裏的數據框的座標系。

②IGeometry

經過訪問IGeometry.SpatialReference屬性可獲取ISpatialReference類型的座標系數據,意義是每一個幾何圖形的座標系。

③ILayer

ILayer.SpatialReference屬性只能設置,不能獲取,意義爲給一個圖層設置座標系。

④IGeoDataset

IGeoDataset.SpatialReference屬性只讀,意義爲獲取任意地理數據集的座標系數據。

地理數據集即要素類、shp文件、柵格數據等。

------------

AO編程不是本篇重點,不展開這些接口的獲取與設計。

3.2. ArcGIS JsAPI(4.x爲例)

①View

View有兩個子類,SceneView和MapView。這兩個視圖均可以經過訪問其spatialReference屬性獲取座標系信息。

②Geometry

Geometry是JsAPI前端的幾何,用來表示圖形或者要素的空間信息。經過訪問Geometry的spatialReference屬性獲取座標系信息。

Geometry的子類Point、Polygon、Polyline等都可用此屬性查看當前幾何信息的座標系信息。

3.3 openlayers(6.1爲例)

ol的最頂層是Map類,經過訪問map.getView().getProjection()可獲取座標系信息。(和ArcGIS JsAPI的不同,ol不少是經過方法訪問的)

此處打印了map實例的視圖的座標系信息,注意ol的座標系寫做「Projection」,直接翻譯是投影,實際上仍是座標系信息。咱們關注的是code_屬性。

當前打印的座標系信息,指明瞭當前地圖的座標系是3857,即網絡墨卡託。

3.4 cesium(1.64爲例)

①Viewer.scene

視圖中場景的座標系可經過Scene類的mapProjection屬性訪問。

②MapProjection

提供座標轉換用的幾個方法。

ps:cesium項目最好全用WGS84和Web墨卡託,不然容易出問題。這就意味着cesium弱化了座標系這一律念,更強調「PCS2GCS」或「GCS2PCS」這種地理座標和投影座標的交叉轉換,更注重屏幕像素座標到地圖座標的運算。

3.5 leaflets(學習中)

3.6 mapbox(學習中)

 

下一篇將是一篇硬骨頭,開足馬力上吧!2019不遺憾

相關文章
相關標籤/搜索