ArcGIS Maritime 發佈海圖切片服務詳解

本章導讀

ArcGIS Maritime 作爲ArcGIS海圖解決方案,進入行業視野已經有相當一段日子了,每一次更新都給人帶來一些驚喜,從最近幾個版本來看,已經逐漸趨向成熟,並且提供了好用的工具輔助實施海圖應用。本章節給各位帶來Maritime的服務發佈以及海圖切片地圖服務的發佈方法。BY 李遠祥

電子海圖服務發佈的環境

要將海圖數據發佈爲電子海圖的在線服務,需要使用ArcGIS Maritime Charting for Server,這是ArcGIS Server 的一個擴展模塊,其前身是ArcGIS 的Nautical Solution 。
在Nautical Solution的年代,要將海圖的S57數據發佈成地圖服務,是非常麻煩的。ArcGIS 軟件對海圖解決方案進行了多個迭代,進入了maritime 年代後,又不停的進行改進,將.000數據發佈成地圖服務已經變得非常簡單了。
下圖是ArcGIS Maritime 的架構圖。
在這裏插入圖片描述
從上圖可以看出,Maritime Charting是以ArcGIS Server 的SOE技術進行擴展的,而不是另闢蹊徑去重新打造一個海圖發佈平臺。其發佈的海圖服務協議,可以看到的是兩種,一是OGC WMS ,另一種就是Rest 協議。

從ArcGIS10.4 開始對應的版本,Maritime就已經支持直接發佈.000數據格式,並且能夠按照S52的展示方式進行表達。但WMS是一種動態地圖服務,如果不考慮更新的話,其性能肯定不如切片服務高(類似過谷歌、百度地圖等的方式)。從ArcGIS10.5版本開始,Maritime就推出了切片製作工具,可以將多個.000數據製作成爲.tpk格式(ArcGIS的切片包格式),但也沒有具體說明怎麼樣發佈成切片地圖服務。雖然通過Portal 是可以將.tpk文件發佈成切片地圖服務的,奈何在ArcGIS10.5 版本Maritime 的切片包製作工具非常不好用,筆者就沒有成功生成完整的.tpk 文件。後來推出了ArcGIS10.5.1 版本,Maritime似乎已經修復了之前的一些問題,可以完美的生成tpk文件,這也就將切片服務變成可能。這也是筆者到現在纔開始寫這篇技術文章的原因。

ArcGIS Maritime Charting 安裝部署

首先需要安裝ArcGIS Server ,這個過程就省略了。
然後運行Maritime Charting 安裝包,這個安裝也沒什麼問題,按照嚮導一步一步安裝就行了。安裝完後並不會有什麼彈出框之類的。授權Maritime功能之後,就需要重啓ArcGIS Server 後臺服務。
接下來就是關鍵步驟了,需要將Maritime 配置到ArcGIS Server中。這一步只能通過ArcGIS Manager 來完成。從之前的架構圖可以看到,ArcGIS Maritime 是Server 的一個SOE 擴展,其擴展的SOE程序是隨着安裝文件安裝到 C:\Program Files\ArcGIS\MaritimeServer\Server10.5\Bin 目錄下(這是筆者默認安裝的路徑),而在Bin目錄下存在兩個文件,這兩個文件基本上就是Maritime Server 的核心,一是MaritimeServer.soe ,另一個是mcstpk.exe, 如下圖所示
在這裏插入圖片描述
MaritimeServer.soe 就是ArcGIS Server 的海圖擴展工具,需要在ArcGIS Manager 中註冊;mcstpk.exe 就是海圖切片包製作工具,後面將會用到該工具。

利用瀏覽器打開ArcGIS Server manager ,在【站點】標籤,選擇【擴展】,點擊【添加擴展】按鈕,之後在Bin目錄中指向 MaritimeServer.soe 文件,如下圖所示
在這裏插入圖片描述
配置成功之後就會在下圖顯示已經註冊的SOE組件。
在這裏插入圖片描述
接下來就是配置Maritime自身的目錄結構。Maritime不像ArcGIS Server 那樣安裝完成後通過manager自動去配置其目錄結構,它是需要手動配置。好在其目錄結構隨着Martime安裝已經拷貝到對應的目錄。其目錄在 C:\Program Files\ArcGIS\MaritimeServer\Server10.5 下的maritimechartservice 文件夾
在這裏插入圖片描述
配置方法很簡單,在ArcGIS Server 的配置目錄,就是ArcGIS Server 安裝結束後的配置站點的目錄,例如筆者將其設置爲 C:\arcgisserver 。在C:\arcgisserver\directories 目錄下,創建一個名爲 maritimeserver 的文件夾,然後 到 Maritime 的安裝目錄,將整個 maritimechartservice 文件夾複製到 C:\arcgisserver\directories 目錄下,如下圖所示
在這裏插入圖片描述
在這裏插入圖片描述

這一步是非常關鍵的,後面會講到爲什麼要這樣做。

這四個目錄分別用來存放Maritime 的配置文件、S57數據、日誌文件、海圖服務臨時文件 。

發佈電子海圖服務

配置完成之後,發佈電子海圖服務就非常簡單了。只需要將.000文件(也可以包含增量文件.001 .002等)拷貝到datasets 目錄底下,就完成了發佈前的數據準備。如下圖所示
在這裏插入圖片描述
電子海圖服務在ArcGIS Server 中還需要依賴其他的地圖服務,只要發佈一個座標系爲WGS84的地圖服務進行輔助即可。這裏採用ArcGIS Server 站點配置時保留的一個地圖服務作爲例子。登錄到ArcGIS Server Manager ,選中SampleWorldCities服務進行編輯,在【功能】標籤頁下,可以找到Maritime Chart Service 選項,將其勾選。如下圖所示
在這裏插入圖片描述
將頁面拖動到底部,查看其服務功能默認設置的信息,如下圖
在這裏插入圖片描述
可以看到紅色框部分設置的就是前面Maritime手動配置的目錄。因爲它默認放在C:\arcgisserver\directories\maritimeserver 目錄下,所以筆者也是根據它的配置將其配置目錄放在對應的位置。

當然這個目錄路徑也是可以修改的,但是修改成其他目錄位置,修改後的目錄必須具備arcgis server 對應的操作系統用戶完全控制的權限,不然Maritime將無法通過頁面端訪問到該目錄下的資源。

設置好這些參數之後,點擊保存服務並重啓該地圖服務,那就完成了對海圖服務的發佈。如果數據發不成功,會在其工作目錄 C:\arcgisserver\directories\maritimeserver\maritimechartservice\sencs 下,找到很多與海圖數據文件對應的一些 .senc 文件,如下圖所示
在這裏插入圖片描述

訪問服務

服務的訪問,可以通過一般的rest服務方式進行訪問,但前提是先要訪問到海圖服務發佈綁定的地圖服務上,例如之前綁定的是SampleWorldCities 服務,通過本機訪問地址爲 http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer ,在頁面最底下,可以看到Maritime 服務的選項,如下圖
在這裏插入圖片描述
點擊進去之後,可以看到存在三種協議的形式進行訪問。如下圖
在這裏插入圖片描述
可以看出,Esri還是比較開放的,出了使用自家的MapService之外,還提供WMS等方式進行發佈。也就是說,在開發使用上,不一定要使用ArcGIS JavaScript API,使用Leaflet或者OpenLayers 都沒有任何問題。

接下來筆者使用ArcGIS JavaScript API 進行連接測試,其代碼如下,將海圖服務作爲一個普通的專題服務進行加載即可。

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title>Simple Map</title>
    <link rel="stylesheet" href="http://localhost/arcgis_js_api/3.19/esri/css/esri.css">
    <style>
      html, body, #map {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
    <script src="http://localhost/arcgis_js_api/3.19/init.js"></script>
    <script>
      var map;

      require(["esri/map","esri/layers/ArcGISDynamicMapServiceLayer", "dojo/domReady!"], function(Map,DynamicLayer) {
        map = new Map("map");
		var basemap = new DynamicLayer("http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer");
        map.addLayer(basemap);
        
        //ENC WGS 84
        var enc84 = new DynamicLayer("http://localhost:6080/arcgis/rest/services/SampleWorldCities/MapServer/exts/MaritimeChartService/MapServer");
        map.addLayer(enc84);
      });
    </script>
  </head>

  <body>
    <div id="map"></div>
  </body>
</html>

其效果如下圖,已經完全按照S52的方式顯示對應的物標。
在這裏插入圖片描述

發佈切片海圖服務

前面的所有操作,都是Maritime 發佈海圖服務的步驟,這都是動態的地圖服務,相當於ArcGIS Server 的dynamicMapService,只要將.000文件丟到 C:\arcgisserver\directories\maritimeserver\maritimechartservice\datasets 目錄下,重啓綁定的地圖服務即可完成數據的更新。它的好處在於更新的時效性比較好,但由於採用的是WMS類似的服務,所以其訪問的效率肯定不如WMTS或者ArcGIS Server 的切片服務性能那麼高。
對於海事管理單位,對於海圖的時效性比較高的,首選上述的動態服務方式,這樣發佈的信息比較快、及時,更新過程快捷簡單。但如果是海洋漁業部門,海圖只作爲底圖來使用,在其之上疊加其他應用專題服務,那麼就可以考慮將海圖製作成切片地圖服務了。
接下來問題就來了,首選Maritime 不存在直接將.000數據發佈爲切片地圖服務的功能,但在Bin目錄下悄悄的提供了 mcstpk.exe 切片包製作工具。這個工具在10.5.1 版本下才能完美運行,雖然10.5版本也有,但正如前面所說,在10.5版本下這個工具製作出來的切片包是不完整的。如果非得在10.5下使用,可以直接將10.5.1的這個工具拷貝出來,讓其在10.5版本中使用。

筆者親測,這樣做可行。但mcstpk.exe工具不能脫機運行,它需要依賴AO,同時也需要有Maritime的授權才能運行。

雙擊運行mcstpk.exe 工具,其界面非常簡潔,如下圖
在這裏插入圖片描述
在【Project】菜單中,下拉選擇【new】新建一個工程。輸入【Project Name】名稱,在【Project Location】中選擇一個目錄,用作保存在工程的文件以及切片包.tpk文件。剩下幾個路徑直接採用C:\arcgisserver\directories\maritimeserver\maritimechartservice ,就是Maritime的配置路徑。如下圖所示
在這裏插入圖片描述
點擊【Create Project】 按鈕完成工程創建,會在其目錄下生成一個msc文件。並且工具會加載工作空間下的所有海圖,如下圖所示
在這裏插入圖片描述
通過縮放可以查看海圖的.000數據,如下圖
在這裏插入圖片描述
mcstpk.exe 工具沒有過多可以配置的地方,除了在【Tools】菜單下的【Display Settings】下可以設置一下顯示樣式之外,沒太多的功能,如下圖
在這裏插入圖片描述
設置好顯示樣式,接下來就是在【Create Tile Package】菜單選擇進行配置,設置顯示的比例等
在這裏插入圖片描述

點擊Create按鈕完成創建,在運行一段時間後,到對應的工程存放目錄下查看文件,可以看到已經生成的tpk文件。
在這裏插入圖片描述
.tpk文件是一個壓縮文件,修改其後綴爲zip,用解壓縮工具進行解壓,解壓後如下圖
在這裏插入圖片描述
層層點開之後,在V101目錄下,繼續深入,可以看到非常熟悉的_alllayers目錄,裏面全是不同級別的切片文件。如下圖所示,
在這裏插入圖片描述

相信到了這一步,大部分ArcGIS 老鳥已經知道筆者要怎麼做了。那就是利用這些切片文件,自行構建ArcGIS Server 切片服務。

首先回到這個目錄的上兩級,也就是Map目錄,將Map重命名爲Layers,記住,一定要是【Layers】或者中文的【圖層】,不然ArcGIS 不認。然後打開ArcMap,可以通過ArcMap識別到更改後的目錄結構,會將其作爲柵格文件進行顯示,如下圖
在這裏插入圖片描述
這樣就證明了ArcGIS已經能辨認到該文件結構了。通過查看其座標系,發現是一個Web墨卡託投影,那麼接下來就需要利用ArcMap繪製一個面狀的要素類, 其範圍要比數據的範圍稍大。
在這裏插入圖片描述
單獨發佈者一個面圖層作爲服務,例如服務名稱爲kdi ,將其作爲動態地圖服務發佈即可,不需要開啓Maritime功能。先停掉該地圖服務,在C:\arcgisserver\directories\arcgiscache 目錄下創建一個名爲kdi的目錄(與發佈的動態地圖服務相同),然後將之前改名爲Layers的整個目錄內容全部拷貝到該目錄底下,到ArcGIS Server Manager 中重啓該kdi服務,即可將海圖切片包發佈成爲切片地圖服務了。

注: 按道理ArcGIS Portal 是允許將.tpk文件發佈成爲切片服務的,但奈何目前這個版本的mcstpk.exe工具製作出來的包還是有些問題,導致發佈的時候不能顯示其內容,具體原因不明。

接下來這個切片服務就可以像一般的切片地圖服務一樣訪問了。10.5.1版本的海圖切片工具下載地址 http://download.csdn.net/download/liyuanxiang1984/9965364 ,如果使用10.5版本的可以直接使用該工具進行切片。

注:Esri發佈了最新的針對maritime的SP補丁,打上補丁之後再重新運行msctpk工具可以很好的進行切片,不需要再單獨使用10.5.1的工具進行切片製作。補丁的位置在 https://support.esri.com/en/download/7524

總結

俗話說:只要功夫深,鐵杵磨成針。只要長期關注ArcGIS產品的動向,瞭解其運行機理,很多複雜的問題都可以迎刃而解的。例如海圖的切片服務,雖然目前還沒有非常簡便的方法,但通過一些老版本,還是可以曲線去實現的。

更多的GIS主流和非主流技術,可以持續關注CSDN的GIS製圖樂園,以及微信公衆號【GIS製圖樂園】。BY 李遠祥

發佈了117 篇原創文章 · 獲贊 643 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章