ArcGIS 柵格函數在線調用詳解

ArcGIS 柵格函數在線調用詳解

導讀:ArcGIS從10.0版本開始引用鑲嵌數據集,而且第一次在影像中加入柵格函數(raster functions),使得影像的呈現和信息提取與GIS緊密的結合起來,簡單的影像功能均可以在ArcGIS中實現(固然了,若是是專業的影像處理,仍是建議在ENVI這類專業的遙感軟件下進行)。ArcGIS軟件向來注重一體化,所以,在桌面軟件ArcMap中實現的功能都會逐漸遷移到服務器中。本文着重從桌面端功能介紹轉移到服務器端及Web開發,旨在說明ArcGIS軟件的柵格函數技術路線。 BY 李遠祥前端

ArcMap中的柵格函數調用

在ArcMap中能夠對任何影像格式,包括柵格數據集、柵格目錄和鑲嵌數據集。在菜單欄--【窗口】--【影像分析】中能夠調出影像分析面板,以下圖所示api

2017-08-04-16-50-59

影像分析面板能夠實現常見的圖像處理功能,若是是熟悉Photoshop等軟件,那就會發現一些很是數據的名詞,如對比度、亮度、透明度、銳化、平滑、交互式拉伸等。但其最大的特點是柵格函數,隨着每一個版本的更新,柵格函數會逐漸增長。數組

在【影像分析】面板中選中影像數據以後,能夠找到柵格函數的入口,包含了很是多的處理函數,以下圖所示瀏覽器

2017-08-04-16-56-36

這些函數不一樣於ToolBox工具,Toolbox工具的特色就是每處理完一次都會生成一個新的柵格數據做爲結果,整個過程會進行影像計算、重採樣等,並佔單獨佔用存儲,通常處理時間比較長。柵格函數的性質是動態處理,函數與柵格數據的關係是引用關係,有點相似於PS裏面的濾鏡。在引用函數調用的時候不會生成新的數據,ArcMap會根據函數的設定動態對影像進行渲染,並且性能至關高。同時函數也是能夠進行相互疊加的。服務器

例以下圖針對Landsat數據進行波段提取,提取第四波段。能夠在柵格函數中直接使用【波段提取函數】,以下圖微信

2017-08-04-17-02-07

2017-08-04-17-02-41

將波段組合設置爲4,結果即立刻生成一個動態的渲染圖層,至顯示第四波段數據,以下圖所示併發

2017-08-04-17-04-03

若是是DEM數據,柵格函數還支持如坡度、坡向、山體陰影等操做。以下圖就是對DEM進行的山體陰影的操做。dom

2017-08-04-17-10-16

imageserver 中的影像

將影像發佈爲影像服務,一樣也支持柵格函數。影像服務發佈須要ArcGIS Server 的imageserver 受權。柵格數據集、柵格目錄和鑲嵌數據集都支持直接發佈爲影像服務。在ArcMap的目錄中右鍵選擇影像,能夠將其發佈成影像服務,以下圖:編輯器

2017-08-04-17-13-52

影像服務的發佈過程與通常的地圖服務Mapservice的嚮導相似,不過在其服務設置方面有本身的特色,以下圖所示:函數

2017-08-04-17-15-16

經過rest地址訪問已發佈的影像服務,能夠看到其影像服務的功能。其中一項就是柵格函數

2017-08-07-09-05-46

影像服務的調用與傳統的mapservice相似,不過採用的是 ArcGISImageServiceLayer 接口。調用代碼以下

var map;
        require([
                    "esri/map",
                    "esri/layers/ArcGISImageServiceLayer",
                    "esri/layers/ImageServiceParameters",
                    "dojo/domReady!"],
                function(Map,ArcGISImageServiceLayer,ImageServiceParameters) {
                    map = new Map("mapDiv");                                                
                    var imgParams = new ImageServiceParameters();
                    imgParams.onData = 0;
                    
                    var layerUrl = "http://localhost:6080/arcgis/rest/services/LC441821/ImageServer";
                    var imageServiceLayer = new ArcGISImageServiceLayer(layerUrl,{
                        imageServiceParameters:imgParams,
                        opacity:0.75
                    });
                    map.addLayer(imageServiceLayer);
                    map.centerAt([113.34, 23.51]);
                });

這裏除了使用接口加載影像服務以外,還使用了ImageServiceParameters 接口去設置影像服務的參數。例如上述代碼使用的 imgParams.onData = 0; 就是設置影像的onData 。

ImageServiceParameters 是很是重要的影像服務接口,它涉及到影像服務的多種設置,柵格函數影像函數的設置最終也會落在該接口對應的參數中。

ArcGIS JavaScript API 使用柵格函數

imageservice 支持直接在前端使用柵格函數來從新渲染影像服務。ArcGIS JavaScript API 中集成了柵格函數的調用接口--RasterFunction 。 RasterFunction 不能單獨使用,須要配合ArcGISImageServiceLayer和ImageServiceParameters 接口。

目前前端能支持的柵格函數類型不是特別多,從官方的在線幫助能夠看到其具體能支持的類型和數量。支持的柵格函數能夠訪問此處 。下圖是前端支持的柵格函數

2017-08-07-09-41-36

2017-08-07-09-47-11

ArcGIS在10.0版本以後每個版本都加入了新的柵格函數,如上圖顯示的信息。因此在前端調用柵格函數以前,先要查詢一下當前的ArcGIS Server 版本是否支持對應的柵格函數。

筆者建議在使用 JavaScript API 調用柵格函數以前,先在ArcMap中走通其流程,並針對結果進行。例如前面所說的提取影像的第四波段。

下面例子是使用JS API 調用波段提取函數。

var map;
        require([
                    "esri/map",
                    "esri/layers/ArcGISImageServiceLayer",
                    "esri/layers/ImageServiceParameters",
                    "dojo/domReady!"],
                function(Map,ArcGISImageServiceLayer,ImageServiceParameters) {
                    map = new Map("mapDiv");                    
                    var rasterFunction = new esri.layers.RasterFunction();
                    rasterFunction.functionName = "ExtractBand";
                    
                    var functionArguments = {};
                    functionArguments.BandIDs= [4]                                       
                    rasterFunction.functionArguments = functionArguments;                   
                    rasterFunction.variableName = "Raster";    
                    
                    var imgParams = new ImageServiceParameters();
                    imgParams.onData = 0;
                    imgParams.renderingRule=rasterFunction;
                    
                    var layerUrl = "http://localhost:6080/arcgis/rest/services/LC441821/ImageServer";
                    var imageServiceLayer = new ArcGISImageServiceLayer(layerUrl,{
                        imageServiceParameters:imgParams,
                        opacity:0.75
                    });
                    map.addLayer(imageServiceLayer);
                    map.centerAt([113.34, 23.51]);
                });

效果以下圖所示

2017-08-07-10-01-01

從代碼中能夠看出,關鍵部分是使用了RasterFunction接口,要調用什麼樣的函數,須要在 functionName 中設置其柵格函數名稱。柵格函數的參數每一個都不同,這個就必須查看在線幫助了。例如波段提取函數名稱爲 ExtractBand ,在在線幫助中點擊該名稱,則跳轉到它的參數說明和調用樣例。以下圖所示

2017-08-07-10-04-59

經過對應的參數來定義柵格函數的參數 functionArguments ,其中關鍵字部分是須要對應幫助說明的每個參數名稱。

例如將該LandSat影像服務設置爲假彩色顯示,能夠經過提取波段函數進行參數的修改,以下圖所示,將波段組合修改以後

2017-08-07-10-11-10

在頁面端能夠直接調用出來,以下圖

2017-08-07-10-12-39

經過上述例子能夠看出,柵格函數的使用是極其簡單的。Esri 官方幫助提供了很是詳細的接口說明。不過礙於都是英文,因此,筆者建議是先將ArcMap切換爲英文版,在英文版上進行前期的函數調用,查看結果。英文版的ArcMap中的柵格函數名稱是跟JS API 中的名稱是徹底對應的。

柵格函數模版

前面的內容旨在說明柵格函數的桌面使用和Web端調用。經過ArcMap的操做,不少人可能已經看到,柵格函數是能夠疊加使用的。這種疊加在前端API能夠照搬。不過若是疊加的函數比較多,就須要編寫比較長的代碼。

還有一種狀況,ImageServer 中提供的柵格函數前端接口沒有ArcMap的那麼多,若是須要調用一些桌面端具有的接口,而目前前端還沒提供的柵格函數,那就須要在服務器端配置柵格函數模版。

能夠看看Esri官方幫助上調用的自定義的柵格函數,其渲染效果至關不錯。這種效果在前端API是沒法實現的。

2017-08-07-10-23-50

柵格函數模版須要在ArcMap中進行設計,其設計到柵格函數的調用和結果的渲染。

先說說前端渲染,目前ArcGIS JavaScript API 能支持的前端渲染是colorMap方式,就是相似柵格數據分類渲染,其構建方式以下

[[0,175,240,233],[3,175,240,222]]

這種方式構建爲數組,第一個數組值是柵格象元值,後面三個數值分別爲RGB值。定義比較麻煩,須要對所用的象元值都給頂一個RGB值才能實現前端渲染。例以下面構建一個很是龐大的 colorMap 。

var colorMap = [[0,175,240,233],[3,175,240,222],[7,177,242,212],
          [11,177,242,198],[15,176,245,183],[19,185,247,178],[23,200,247,178],
          [27,216,250,177],[31,232,252,179],[35,248,252,179],[39,238,245,162],
          [43,208,232,135],[47,172,217,111],[51,136,204,88],[55,97,189,66],
          [59,58,176,48],[63,32,161,43],[67,18,148,50],[71,5,133,58],[75,30,130,62],
          [79,62,138,59],[83,88,145,55],[87,112,153,50],[91,136,158,46],[95,162,166,41],
          [99,186,171,34],[103,212,178,25],[107,237,181,14],[111,247,174,2],
          [115,232,144,2],[119,219,118,2],[123,204,93,2],[127,191,71,2],[131,176,51,2],
          [135,163,34,2],[139,148,21,1],[143,135,8,1],[147,120,5,1],[151,117,14,2],[155,117,22,5],
          [159,115,26,6],[163,112,31,7],[167,112,36,8],[171,110,37,9],[175,107,41,11],
          [179,107,45,12],[183,105,48,14],[187,115,61,28],[191,122,72,40],[155,117,22,5],
          [159,115,26,6],[163,112,31,7],[167,112,36,8],[171,110,37,9],
          [175,107,41,11],[179,107,45,12],[183,105,48,14],[187,115,61,28],[191,122,72,40],
          [155,117,22,5],[159,115,26,6],[163,112,31,7],[167,112,36,8],[171,110,37,9],
          [175,107,41,11],[179,107,45,12],[183,105,48,14],[187,115,61,28],[191,122,72,40],
          [195,133,86,57],[199,140,99,73],[203,148,111,90],[207,153,125,109],
          [213,163,148,139],[217,168,163,160],[223,179,179,179],[227,189,189,189],
          [231,196,196,196],[235,207,204,207],[239,217,215,217],[243,224,222,224],
          [247,235,232,235],[251,245,242,245],[255,255,252,255]];

在柵格函數設置的時候,能夠指定渲染方式,例如

functionArguments.Colormap = colorMap;

這種方式構建工做量巨大,並且沒有任何的界面設計器可用。目前尚未前端接口支持拉伸方式渲染,例如桌面端的【渲染地貌函數】採用的色帶配置。

2017-08-07-10-38-28

這些都須要在服務器端來柵格函數模版。

首選須要在ArcMap中調用【柵格函數模版編輯器】對柵格函數進行配置。在ArcMap菜單欄【窗口】--【自定義】面板中,選擇【命令】標籤,輸入關鍵字【柵格】,找到【柵格函數模版編輯器】,將其拖動到菜單的工具條任意位置便可使用

2017-08-07-10-42-10

2017-08-07-10-45-10

從圖上能夠看到,其界面與【影像】面板中調用的柵格函數的方式很是相似。但它有本身很是獨特的地方,多了一個【文件】菜單,能夠將設計好的影像分析流程保存下來。以下圖所示

2017-08-07-10-46-46

筆者作了一個例子,使用DEM數據進行地形渲染。【渲染地貌函數】並不在前端柵格函數的支持範圍,其顯示的渲染效果是拉伸方式,前端api一樣不支持。這個例子很好的反映出服務器中柵格函數模版的重要性。

針對dem數據在【柵格函數模版編輯器】中使用【渲染地貌函數】,而且設計好結果的渲染方式。

2017-08-07-10-50-30

設置好後,在【柵格函數模版編輯器】的【文件】菜單中【另存爲】將其保存在rft.xml 文件。例如,筆者這裏將配置好的模版另存名稱爲 customfun.rft.xml

此處必定要使用英文名稱。由於該模版一旦被導入到imageservice中,其調用名稱與文件名稱對應。中文名稱在調用的時候rest路徑會出現一些特殊的符號,致使瀏覽器請求失敗。因此必定要使用英文。

配置柵格函數模版能夠在兩種狀況下進行。第一種是在影像服務發佈的時候進行導入,在服務編輯器的【函數】項中設置,以下圖所示,點擊【管理】,在管理面板中加入一個或者多個柵格函數模版。

2017-08-07-10-57-34

注意:筆者這裏使用的模版存放在計算機桌面中,能夠經過截圖看清楚。在影像服務發佈的時候指定柵格函數模版,不管柵格函數模版文件放在什麼目錄下,都能識別,由於arcgis server 最終會將這個模版文件拷貝到服務器能訪問的目錄中。

點擊【肯定】併發布影像服務,柵格函數模版會隨着服務發佈註冊到對應的服務目錄中。下圖是從服務的屬性中從新查看其模版狀況,能夠看到這個模版已經自動被拷貝到arcgisserver註冊的目錄中

2017-08-07-11-02-30

另外一種狀況是向已經存在的影像服務註冊柵格函數模版,這稍微複雜一點,要先將模版文件拷貝到arcgis server 已註冊的文件目錄下,否則imageserver 沒法訪問到對應的路徑,致使模版讀取失敗 ,以下圖

2017-08-07-11-04-15

而後中止對應的影像服務,在服務屬性對應的【函數】項目導入模版文件。導入後重啓對應的影像服務便可。

在瀏覽器中經過rest訪問對應的影像服務,點擊 rasterFunctionInfos 項,能夠查看到對應的柵格函數模板的內容

2017-08-07-11-09-37

2017-08-07-11-12-31

從圖上能夠看出,影像服務上多了一個以柵格函數模版文件名爲命名的自定義函數。這個函數名至關重要,在ArcGIS JavaScript API 的調用中須要使用到。

自定義柵格函數的調用與通常的調用方式沒有任何不同的地方,只須要在rasterFunction.functionName修改函數名稱便可。下面是調用自定義函數的代碼例子

var map;
        require([
                    "esri/map",
                    "esri/layers/ArcGISImageServiceLayer",
                    "esri/layers/ImageServiceParameters",
                    "dojo/domReady!"],
                function(Map,ArcGISImageServiceLayer,ImageServiceParameters) {
                    map = new Map("mapDiv");    
                    var rasterFunction = new esri.layers.RasterFunction();
                    rasterFunction.functionName = "customfun";//自定義柵格函數                    
                    rasterFunction.variableName = "Raster";                    
                    var imgParams = new ImageServiceParameters();
                    imgParams.onData = 0;
                    imgParams.renderingRule=rasterFunction;
                    
                    var layerUrl = "http://localhost:6080/arcgis/rest/services/dem/ImageServer";
                    var imageServiceLayer = new ArcGISImageServiceLayer(layerUrl,{
                        imageServiceParameters:imgParams,
                        opacity:0.75
                    });
                    map.addLayer(imageServiceLayer);
                    //map.centerAt([113.34, 23.51]);
                });

具體的效果以下圖所示

2017-08-07-11-18-45

利用柵格函數模版的方式能夠將不少經常使用的柵格表達方式註冊到影像服務中,很是方便快速切換影像的顯示方式,並且柵格函數模版是能夠複用的。

總結

柵格函數雖然在ArcGIS10.0以後的版本才提出來,並在每個ArcGIS版本中逐步完善和增長功能。從技術路線上看,柵格函數模版的方式依然是主流的調用方式(儘管這種方式很早就在imageserver 中使用),但前端調用的接口也愈來愈完善,Esri也在進一步開放其前端功能。在當前影像數據獲取愈來愈便捷和廉價的狀況下,影像的使用不只僅是停留在瀏覽階段,分析功能和多種表達方式也是愈來愈重要了。

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

相關文章
相關標籤/搜索