可視域分析簡介
可視域分析也稱作通視分析,即在當前位置視線所能看到的地方。該功能的實現依賴于地形進行計算,地形的起伏會導致視線的遮擋,在GIS中地形的起伏是根據DEM(Digital Elevation Model)數據進行表達的。
整體開發思路
利用ArcMap構建可視域分析模型,通過測試點進行模型驗證,運行模型后將地圖處理結果共享為地圖處理服務(GP服務),利用ArcGIS API for JavaScript在前端調用GP服務并進行渲染展示,達到可視域分析效果。
開發準備
推薦開發環境:ArcGIS Desktop 10.3(及其以上)、ArcGIS Server 10.3(及其以上)、ArcGIS API for Javascript 4.10(推薦最新版)
本人開發環境:ArcGIS Desktop 10.2 、ArcGIS Server 10.2、ArcGIS Desktop 10.5、ArcGIS Server10.5 、ArcGIS API for Javascript 4.10
注:一開始以為能全都用ArcGIS 10.2系列完成各項數據準備以及地圖服務,在完成了一部分工作后發現ArcGIS 10.2系列相關功能無法實現,又用了新版本的ArcGIS 10.5系列進行了相關功能的實現,ArcGIS 10.2完成的工作也沒有舍棄,所以造成了現在的結果,后面會具體介紹ArcGIS 10.2和ArcGIS 10.5各完成了哪些工作。
數據準備:dem數據,本人通過水經注軟件下載了青島市黃島區的高程數據。也可以從地理空間數據云上免費下載相關的dem數據
開發流程
(一) 將下載的dem數據加載到ArcMap中,并創建一個點要素用于測試,如圖所示
(二) 打開模型構建器,依次找到模型-模型屬性-環境-工作空間-值,完成對工作空間的設置,使用默認的工作空間,會造成中間的一些緩存無法訪問的問題。
(三) 找到ArcToolBox,利用里面的各類工具完成對模型的構建
整體的模型構建思路如下:通過位置點和可視距離生成緩沖區,通過此緩沖區對dem進行掩膜提取,減少計算的dem范圍。對提取后的dem和位置點進行視域分析,將輸出的柵格進行重分類,輸出的柵格一般只有兩個值,通過Value字段,將可視的值保留,其余全部設置為NoData,重分類后的生成的柵格數據,進行柵格轉面,提取可視域多邊形的邊界。
3.1 在分析工具-鄰域分析中找到緩沖區分析工具,將緩沖區工具拖拽進入模型中。對緩沖區工具框右鍵獲取變量,進行緩沖區距離的參數的設置,也就是我們可視域分析的最遠距離。
雙擊距離參數,進行距離參數值的設置,此處設置為2000米,當然在前端代碼中可以進行重新設置,該值僅為默認值。參數值設置完成后右鍵該參數,將其設為模型參數。同樣的選擇獲取變量-從參數-輸入要素,再次獲取一個變量,該變量為點要素,即可視域分析中的當前位置,雙擊該變量,選擇創建的要素點,并設置為模型參數。
3.2選擇空間分析工具-提取分析-按掩膜提取工具,拖拽至模型中,利用連接工具將緩沖區生成的輸出要素類與按掩膜提取工具連接,并選擇輸入柵格數據或要素掩膜數據。右擊按掩膜提取工具,選擇獲取變量-從參數-輸入柵格,雙擊輸入柵格,選擇ArcMap中加載的高程數據。
3.3 選擇空間分析——表面分析——視域工具,拖拽至模型中,通過連接工具將掩膜提取生成的柵格(輸出柵格)與視域進行連接,選擇輸入柵格,將測試點與視域進行連接選擇輸入觀測點或觀察折線要素。
3.4選擇空間分析-重分類-重分類工具,拖拽至模型中,通過連接工具將視域工具生成的柵格與重分類進行連接。雙擊重分類工具,選擇添加條目,輸入三個新條目分別為:舊值為0,新值為NoData,舊值為1,新值為1,舊值為NoData,新值為NoData。這一步是為了將可視域分析結果中不可見區域去掉,只保留可視部分。
3.5選擇轉換工具——由柵格轉出——柵格轉面工具,拖拽至模型中,使用連接工具將重分類后的柵格與柵格轉面進行連接,選擇輸入柵格。
3.6 將柵格轉面的輸出結果右鍵,設為模型參數
3.7將輸入的距離、點和柵格轉面的輸出結果分別重命名為dis、point、result,這三個變量會在后面用到。當然也可以自己自定義名稱。最終的模型構建結果如下圖所示,選擇運行該模型。
3.8 在文件夾連接中的某一文件夾下,右鍵創建,新建工具箱。
3.9 建模窗口中,保存模型到上一步新建的工具箱下。
3.10 在工具箱下雙擊該模型,選擇測試點shapfile文件,輸入視域半徑,開始運行,分析完成后,可在分析的結果中查看。
至此模型構建的相關工作已經完成。
(四) 發布將模型運行結果發布為GP服務
在地圖處理工具欄下找到結果菜單,找到上一次運行的該模型,并將其共享為地理處理服務,服務相關設置如下,設置完成后分析無錯誤發布即可
(五)
發布成功后,打開ArcGIS Server管理頁面,找到該服務,找到服務的連接地址。使用ArcGIS API for JS調用該服務,即可進行視域分析。
(六)
在編寫代碼之前,還需要對dem高程數據進行影像服務的發布,由于本機安裝的ArcGIS版本為10.2,不支持LERC的影響切片格式,因此在服務器上利用ArcGIS 10.5完成DEM影像服務的發布。找到下載好的DEM高程數據,右鍵分享為影像服務,并完成相關設置,實現DEM高程數據服務的發布
(七) 代碼的編寫
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>通視分析</title> <link rel="stylesheet" href="https://js.arcgis.com/4.10/esri/css/main.css"><script src="https://js.arcgis.com/4.10/"></script><style>html,body,#viewDiv {padding: 0;margin: 0;height: 100%;width: 100%;}</style>
</head>
<body>
<div id="viewDiv"></div>
<script>require(["esri/Map","esri/Ground","esri/layers/ElevationLayer","esri/config","esri/views/SceneView","esri/layers/GraphicsLayer","esri/Graphic","esri/geometry/Point","esri/tasks/Geoprocessor","esri/tasks/support/LinearUnit","esri/tasks/support/FeatureSet","esri/core/urlUtils","dojo/domReady"], function (Map,Ground,ElevationLayer,esriConfig,SceneView,GraphicsLayer, Graphic, Point,Geoprocessor,LinearUnit, FeatureSet,urlUtils) { var customElevation = ElevationLayer({//url為發在服務器上的高程影像數據url: "http://telgis.webgis.com/arcgis/rest/services/TelMapService/HD_TiledData/ImageServer"});var map = new Map({// basemap: "streets",//ESRI提供的底 圖basemap: "hybrid",//ESRI提供的影像圖ground: new Ground({layers: [ customElevation ]})});var graphicsLayer = new GraphicsLayer();map.add(graphicsLayer);//點擊地圖樣式var markerSymbol = {type: "simple-marker", // autocasts as new SimpleMarkerSymbol()color: [255, 0, 0],outline: { // autocasts as new SimpleLineSymbol()color: [255, 255, 255],width: 2}};//可視域填充樣式var fillSymbol = {type: "simple-fill", // autocasts as new SimpleFillSymbol()color: [226, 119, 40, 0.75],outline: { // autocasts as new SimpleLineSymbol()color: [255, 255, 255],width: 1}}; var view=new SceneView({map:map,container: "viewDiv"});view.ui.remove("attribution");//移除底部ESRI logo//第一次位置跳轉view.when(function () {view.goTo({position: {x: 120.18,y: 35.97,z: 700,spatialReference: {wkid: 4326}},heading: 50,tilt: 80}, {speedFactor: 0.7});});//地理處理服務的地址,為GPServr地址+模型名稱var gpUrl ="http://localhost:6080/arcgis/rest/services/GP/view/GPServer/view";var gp = new Geoprocessor(gpUrl);gp.outSpatialReference = { // 輸出坐標系wkid: 102100};//每一次點擊地圖,都會根據點的位置進行求解計算view.on("click", computeViewshed);function computeViewshed(event) {graphicsLayer.removeAll();var point = new Point({longitude: event.mapPoint.longitude,latitude: event.mapPoint.latitude});var inputGraphic = new Graphic({geometry: point,symbol: markerSymbol});graphicsLayer.add(inputGraphic); var inputGraphicContainer = [];inputGraphicContainer.push(inputGraphic);var featureSet = new FeatureSet();featureSet.features = inputGraphicContainer;var vsDistance = new LinearUnit();vsDistance.distance = 2000;vsDistance.units = "meters";//注意單位var params = {point: featureSet,//對應發布服務的point參數,為當前視點平面位置dis: vsDistance//對應發布服務的dis參數,為可視的距離};//同步異步和服務器的設置有關// 進行異步查詢,使用gp.excute為同步查詢gp.submitJob(params).then(drawResultData,outError);//進行同步查詢// gp.execute(params).then(drawResult,outError);}//接收異步結果,進行繪制function drawResultData(result) {console.log("分析完成");console.log(result);var jobId=result.jobId;//根據jobID獲取分析結果//下面的第二個參數為,發布服務時,看到的結果參數的名稱gp.getResultData(jobId,"result").then(function (value) {console.log("查詢完成");var resultFeatures = value.value.features;// 給每一個結果添加樣式var viewshedGraphics = resultFeatures.map(function(feature) {feature.symbol = fillSymbol;return feature;});// 從俯視狀態看結果graphicsLayer.addMany(viewshedGraphics);view.goTo({target: viewshedGraphics,tilt: 0});},outError)}//輸出錯誤function outError(e){console.error(e);}})
</script>
</body>
</html>
至此,基于arcgis的可視域分析功能搭建完畢
總結
以上是生活随笔為你收集整理的可视域分析功能搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。