ArcGIS发布GP服务以及在前端调用(ArcGIS api for JS 4.12)

前言

前段时间实习工作期间,接到一个需求需要对一些地理数据做空间插值分析,当时想了两种解决方案,一种是直接在前端调用一些空间插值库来计算(如Kriging.js等),另一种就是用ArcGIS发布GP服务,再用ArcGIS APi for JS调用。因为要计算的数据量很大,最后决定用GP服务的方式来实现。现在总结一下当时实现的一些步骤和遇到的坑。

GP服务的发布

  • 首先在ArcGIS中的Model Builder中建立一个模型,如图所示,为直接调用了克里金插值工具。其他的参数分别为:Mask 为掩膜提取图层,从环境获取;Extend为分析范围,从环境获取;Zvalue为插值字段,从参数获取;input为输入图层,从参数获取。标注为P的设置为模型参数,即为可选项。 完成后,点击验证模型并保存。

服务建模

  • 点击保存的模型文件,打开输入相关的参数,并运行。因为GP服务必须要先运行一次才能发布。

运行模型

  • 运行后结果如下图所示。注意:前端调用后GP服务显示的分类方法和图层颜色同ArcGIS中的是一样的。所以想显示特定的分类和颜色可以直接在最后一次运行的结果图层的属性中修改。 然后,点击打开地理处理—>结果窗口,在当前会话中右键刚才运行的模型,点击发布为服务。接下来同ArcGIS发布数据服务步骤一样。

分析结果

  • 编辑服务。先分析,然后根据提示编辑一下信息即可,无错误后发布。注意:执行模式中要将“以地图服务查看结果”选上才可以在前端显示结果图层。

编辑服务

  • 在ArcGIS Server中查看和测试服务。

查看服务

GP服务的调用

ArcGIS API for JavaScript 4.12调用GP服务,直接放代码

1 function doJob() { 2 require([ 3 "esri/Map", "esri/views/MapView", "esri/layers/MapImageLayer", "esri/layers/FeatureLayer", 4 "esri/layers/CSVLayer", "esri/tasks/Geoprocessor", "esri/widgets/Legend", "esri/request" 5 ], function (Map, MapView, MapImageLayer, FeatureLayer, CSVLayer, Geoprocessor, Legend, request) { 6 7 // 数据 8 testLayer = new FeatureLayer({ 9 url: "https://localhost:6443/arcgis/rest/services/test/data/MapServer/0" 10 }) 11 12 // 边界掩膜数据 13 maskLayer = new FeatureLayer({ 14 url: 'https://localhost:6443/arcgis/rest/services/test/KrigingTestData/MapServer/2', 15 tranparent: 0.7 16 }) 17 var KrigingGP = new Geoprocessor('https://localhost:6443/arcgis/rest/services/gp/Kriging/GPServer/Kriging') //实例化和调用克里金插值服务 18 // console.log('计算插值') 19 20 pattern = $('#patterns option:selected').val() 21 crop = $('#crops option:selected').val() 22 el = $('#NP option:selected').val() 23 24 25 var query = testLayer.createQuery() //要素服务中查询数据 26 query.where = "crop = '"+ crop +"' AND pattern = '"+pattern +"'" 27 testLayer.queryFeatures(query).then( re => { 28 console.log(JSON.stringify(re)) 29 if (re.features.length == 0) { 30 alert('当前指标下无数据,请重新选取') 31 } else { 32 let params = { 33 Zvalue: el, 34 Input: re, 35 Extent: maskLayer, 36 Mask: maskLayer 37 } 38 KrigingGP.submitJob(params).then( result => { 39 if (result.jobStatus == 'job-failed') { 40 alert('计算插值失败') 41 // console.log(result) 42 } else if (result.jobStatus == 'job-succeeded') { 43 console.log('计算成功') 44 // console.log(result) 45 let resultLayer = KrigingGP.getResultMapImageLayer(result.jobId) // 获取插值计算结果图层 46 // console.log(resultLayer) 47 resultLayer.opacity = 0.9 48 resultLayer.title = '插值结果' 49 map.layers.pop() 50 map.layers.add(resultLayer) //结果图层添加到地图上显示 51 } 52 }) 53 } 54 }) 55 }) 56 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

ArcGIS发布GP服务以及在前端调用(ArcGIS api for JS 4.12) - HelloWorld