本篇講講在GIS桌面軟件和實際數據中,以及各路GIS有關API的編程中,如何尋找座標系信息。慣例:html
本文約2000字,建議閱讀時間10分鐘。前端
做者:博客園/B站/知乎/csdn/小專欄 @秋意正寒web
版權:轉載請告知,並在轉載文上附上轉載聲明與原文連接(http://www.javashuo.com/article/p-rymphcfq-dm.html)sql
有關「未定義座標系」的數據如何粗略判別是什麼座標系,已經在上篇的第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)瀏覽器
和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官網是可查的。
簡稱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不支持模糊查詢,用空格替換下劃線,儘可能刪減一些關鍵詞)
geojson是一種用json標記的地理數據文件,記錄二維信息多一些,一般用於webgis傳遞。與turf、arcgis jsapi、openlayers等結合較好。
geojson也是一種ogc規範,開源。
打開一個geojson文件:
其中,頭部「crs」字段就是座標系信息,咱們能夠訪問其properties.name獲取有關EPSG信息,此處WKID爲32650。
可是,在大多數時候geojson是沒有crs字段的,例如:
這就要問數據的提供者了。
tif文件爲柵格圖像文件,後綴爲tif或tiff,是ogc規範的一種,全稱GeoTiff。
一般不能在資源管理器中查看tif柵格影像數據的座標系信息,須要用GIS軟件查看,由於它的座標系信息寫在數據文件內部。
以下圖:
此爲ArcMap中Catalog查看數據的屬性。
這些地理數據庫的數據都可在客戶端查看,以QGIS爲例,打開這些數據庫裏的要素查看座標系信息。
①postgis
postgresql的一個插件。
②geopackage
geopackage是一種輕量的單文件數據庫,是sqlite的特例應用。
geopackage在QGIS裏的支持還不算很強,個人版本是3.8.1,還不支持右鍵導入,拖拽的方式卻是能夠。
讀取座標系的方法同樣。
③gdb
QGIS只能讀取gdb裏的表格和要素數據,複雜的數據由於esri商用問題不能讀取。
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座標系。
①地圖服務
訪問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
訪問其描述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的描述。
①IMap
經過訪問IMap.SpatialReference屬性可獲取ISpatialReference類型的座標系數據,意義是ArcMap裏的數據框的座標系。
②IGeometry
經過訪問IGeometry.SpatialReference屬性可獲取ISpatialReference類型的座標系數據,意義是每一個幾何圖形的座標系。
③ILayer
ILayer.SpatialReference屬性只能設置,不能獲取,意義爲給一個圖層設置座標系。
④IGeoDataset
IGeoDataset.SpatialReference屬性只讀,意義爲獲取任意地理數據集的座標系數據。
地理數據集即要素類、shp文件、柵格數據等。
------------
AO編程不是本篇重點,不展開這些接口的獲取與設計。
①View
View有兩個子類,SceneView和MapView。這兩個視圖均可以經過訪問其spatialReference屬性獲取座標系信息。
②Geometry
Geometry是JsAPI前端的幾何,用來表示圖形或者要素的空間信息。經過訪問Geometry的spatialReference屬性獲取座標系信息。
Geometry的子類Point、Polygon、Polyline等都可用此屬性查看當前幾何信息的座標系信息。
ol的最頂層是Map類,經過訪問map.getView().getProjection()可獲取座標系信息。(和ArcGIS JsAPI的不同,ol不少是經過方法訪問的)
此處打印了map實例的視圖的座標系信息,注意ol的座標系寫做「Projection」,直接翻譯是投影,實際上仍是座標系信息。咱們關注的是code_屬性。
當前打印的座標系信息,指明瞭當前地圖的座標系是3857,即網絡墨卡託。
①Viewer.scene
視圖中場景的座標系可經過Scene類的mapProjection屬性訪問。
②MapProjection
提供座標轉換用的幾個方法。
ps:cesium項目最好全用WGS84和Web墨卡託,不然容易出問題。這就意味着cesium弱化了座標系這一律念,更強調「PCS2GCS」或「GCS2PCS」這種地理座標和投影座標的交叉轉換,更注重屏幕像素座標到地圖座標的運算。
下一篇將是一篇硬骨頭,開足馬力上吧!2019不遺憾