【回顧】上篇交代了Map是各種圖層(不管是實際上的圖層還是由圖層構成的對象)的容器,是數據的容器,並不作顯示(由視圖類繪制)。並重點講解了由圖層構成的復雜圖層——高程屬性ground和底圖屬性basemap。
這一篇結合OGC標准,講一下可操作圖層的類型、生成。
注意:如果看不懂這篇,可以先跳過,但是你不知道在JsAPI中用什么圖層加載什么數據的時候,這篇需要復習。本篇屬於字典類型的教程,方便以后查閱。
轉載注明出處,博客園/CSDN/B站/知乎:秋意正寒
1. 圖層和數據
真正的地理數據仍然在服務端,服務端怎么可能把那么龐大的數據傳給你?它根據前端的請求,在需要幾何形狀的時候傳幾何坐標點過來,在需要屬性表的屬性時再傳字段和字段值過來。
那如何連接服務器端的數據和前端瀏覽器呢?API用圖層(Layer)的概念,把你看到的東西和雲端服務器的數據連接在一起了。
在Esri家族的產品中,有一個產品叫ArcGIS Enterprise,里面有個組件叫ArcGIS for Server,Server就是通過一個簡單的URL(統一資源定位符)連通服務器端和瀏覽器端,這個URL又被稱作REST URL。
大多數圖層都遵循了OGC組織制定的規范。
2. OGC與GIS服務解釋【可跳躍閱讀】
OGC全稱開放地理信息系統聯盟。正是OGC制定的各種規范,使得GIS服務有序可循。
第2節就簡單說幾個規范,第3節則將常用的可操作圖層對應的ArcGIS Server的服務對應起來。
【!】注意,本節如果看不懂可以先跳過,以后會有大量的例子會用到。
2.1 WMS
網絡地圖服務,WebMapService。
以ArcGIS為例,一個mxd,就很完整地對應了一個“地圖”,因為一個mxd就可以制作一幅多圖層、多符號、帶標注的地圖。可以簡單地理解,將mxd文檔整體發布到ArcGIS Server上,這個服務是遵守了WMS規范的。
在ArcGIS Server上,這種服務叫MapService。
在其他開源軟件(如QGIS)和開源地理服務器上(如GeoServer和MapServer),WMS有其他的實現,ESRI只不過自己細化、拓展了WMS,成為自家的地圖服務。
也就是說,WMS≠MapService。但是MapService可以提供WMS服務——這就說明,一個mxd發布的MapService可以包含WMS服務,類似於WMS派生出了MapService。
【注】ESRI也提供了WMS的支持,在發布MapServer和ImageServer時可以啟用WMS。見3.1和Server幫助文檔。】
在本人的實踐中,GeoServer和ArcGIS Server這兩大主流地理服務器都支持WMS,WMS最終向前端發來請求返回的,是請求地理范圍內的一張圖片。
有關WMS還有更詳細的各路請求參數,以下WFS、WCS、WPS也是,有能力的朋友可以到OGC官網找到相關標准自行閱讀,此處暫不展開。
2.2 WFS
網絡要素服務,WebFeatureService。
ESRI將其拓展為FeatureService(即FeatureService≠WFS),但是也對原生的WFS提供了支持,見3.1。
FeatureService支持從文件發布(CSV、Excel、Shapefile),也支持從地理數據庫發布,還支持從mxd發布(在發布MapService時啟用FeatureService)。
與返回整張圖片的WMS不同,WFS返回的是帶有幾何和屬性信息的實際要素,客戶端(瀏覽器)可以將這些要素與屬性用於任何類型的地理空間分析。
WFS 服務也支持過濾器,由此用戶可以在數據上執行空間查詢和屬性查詢。
在ArcGIS Server發布WFS時,ArcGIS Server會自動忽略柵格圖層。WFS僅支持企業地理數據庫發布,或者從一個mxd發布。
2.3 WCS
網絡表面服務,WebCoverageService。也叫網絡覆蓋服務,主要是柵格影像。ArcGIS Server上的MapService、ImageService和GeoDataService均可使用從屬它們的子一級WCS服務。
用mxd發布MapService時啟用WCS(WCS只會識別柵格圖層,矢量圖層等其他圖層會被忽略),當然也可以單獨拿一幅柵格影像發布ImageService時啟用WCS,也可以在發布GeoDataService時啟用WCS。
WCS 的數據源應為下列任一數據形式:
- 有柵格圖層的地圖文檔(mxd)
- 柵格數據集或鑲嵌數據集(在Geodatabase中)
- 引用柵格數據集或鑲嵌數據集的圖層文件(.lyr)
- 包含柵格數據的地理數據庫(10.1及以上的Server不支持mdb)
【注】WCS中的C=Coverage,但是不等於ArcGIS早期版本的Coverage數據。
盡管WCS的數據源很多,但是都繞不開一個核心詞:Coverage,也即覆蓋數據,也即柵格數據,可以是影像柵格,也可以是普通含義上的柵格。
2.4 WMTS
網絡瓦片(切片)地圖服務,WebMapTileService。
這個在發布MapService和ImageService的緩存服務時,進行多級別切圖即可調用WMTS,無需開啟WMTS(因為切圖默認就是WMTS)。
有關如何在發布MapService或ImageService時創建作緩存服務,請參考:點我
目前,JsAPI和OpenLayers支持ArcGIS Server的WMTS。
與WMS最大的區別就是WMTS可以將地圖切成多個網格,在不同的比例尺下切出N套緩存小方片,把WMS返回的整張大圖切開,有利於網絡傳輸。
2.5 WPS(與圖層無關,但是屬於OGC常用規范也順帶一提)
網絡處理服務,WebProcessService。
即在服務器端進行地理處理任務,結果再返回到客戶端。在ArcGIS Server中拓展為GPService(即Geoprocess Service)。
同樣,在發布GPService時可以啟用WPS服務。但是此文講的是可操作圖層,這里就不展開了,待到后期講GPService和Task時會展開。
目前,uDig、Openlayers均支持ArcGIS Server上的WPS。而JsAPI使用的是GPService本身。
3. 圖層與Server服務對應表
注意!並不是所有的圖層都用Server上的服務創建(如GraphicLayer、GeoJSONLayer、CSVLayer等),也並不是所有的服務都是拿來創建圖層的(如后期學到的Task要用到NAService等)。
ps:Server上的服務不僅僅可以在JsAPI調用,Runtime SDK開發的產品也能用。
3.1 JsAPI 3.X & 4.X圖層對比

需要說明的是,OGC各種標准的支持如下圖所示。

有關更詳細的ArcGIS Server發布這些常用OGC服務的教程,請看ArcGIS Server在線幫助。
3.2 舉例說明
在3.x中(3.25),創建WMSLayer、ArcGISDynamicMapServiceLayer舉例:
// 3.25 jsAPI創建WMS圖層
var map = new Map('map', { basemap: 'streets', center: [-96, 37], zoom: 4 }); var wmsLayer = new WMSLayer('https://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer', { resourceInfo: resourceInfo, visibleLayers: ['1', '2'] }); map.addLayers([wmsLayer]);
以上為WMSLayer,以下是ArcGISDynamicMapServiceLayer。
// 3.25 創建獨有的ArcGIS動態地圖服務圖層
var map = new Map("mapDiv", { sliderOrientation : "horizontal" }); var dynamicMapServiceLayer = new ArcGISDynamicMapServiceLayer("https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer", { "opacity" : 0.5, "imageParameters" : imageParameters }); map.addLayer(dynamicMapServiceLayer);
在4.x中(4.8),創建MapImageLayer、PointCloudLayer舉例:
// jsAPI版本4.8 創建獨有的地圖圖像圖層
var layer = new MapImageLayer({ url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer" }); map.add(layer);
以上為MapImageLayer,以下是PointCloudLayer。
// jsAPI 4.8 利用場景服務創建獨有的點雲圖層
var layer = new PointCloudLayer({ url: "https://tiles.arcgis.com/tiles/V6ZHFr6zdgNZuVG0/arcgis/rest/services/BARNEGAT_BAY_LiDAR_UTM/SceneServer" }); map.add(layer);
注意,jsAPI的圖層類型有很多,除了MapImageLayer和PointCloudLayer這兩種圖層外,大多數圖層不僅可以用ArcGIS Server上的服務創建,也可以用PortalID創建。
3.3 ArcGIS Server上其他服務有什么用
見Server的幫助文檔。Server上不僅有數據類型的服務(上表),還有處理類型的服務,例如用於支持網絡分析的NAServer等。
