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

Stella981
• 阅读 665

前言

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

GP服务的发布

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

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

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

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

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

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

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

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

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

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

GP服务的调用

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

        function doJob() {
            require([
                "esri/Map", "esri/views/MapView", "esri/layers/MapImageLayer", "esri/layers/FeatureLayer",
                "esri/layers/CSVLayer", "esri/tasks/Geoprocessor", "esri/widgets/Legend", "esri/request"
            ], function (Map, MapView, MapImageLayer, FeatureLayer, CSVLayer, Geoprocessor, Legend, request) {

                // 数据
                testLayer = new FeatureLayer({
                    url: "https://localhost:6443/arcgis/rest/services/test/data/MapServer/0"
                })

                // 边界掩膜数据
                maskLayer = new FeatureLayer({
                    url: 'https://localhost:6443/arcgis/rest/services/test/KrigingTestData/MapServer/2',
                    tranparent: 0.7
                })
                var KrigingGP = new Geoprocessor('https://localhost:6443/arcgis/rest/services/gp/Kriging/GPServer/Kriging')  //实例化和调用克里金插值服务
                // console.log('计算插值')

                pattern = $('#patterns option:selected').val()
                crop = $('#crops option:selected').val()
                el = $('#NP option:selected').val()


                var query = testLayer.createQuery()                  //要素服务中查询数据
                query.where = "crop = '"+ crop +"' AND pattern = '"+pattern +"'"
                testLayer.queryFeatures(query).then( re => {
                    console.log(JSON.stringify(re))
                    if (re.features.length == 0) {
                        alert('当前指标下无数据,请重新选取')
                    } else {
                        let params = {
                            Zvalue: el,
                            Input: re,
                            Extent: maskLayer,
                            Mask: maskLayer
                        }
                        KrigingGP.submitJob(params).then( result => {
                            if (result.jobStatus == 'job-failed') {
                                alert('计算插值失败')
                                // console.log(result)
                            } else if (result.jobStatus == 'job-succeeded') {
                                console.log('计算成功')
                                // console.log(result)
                                let resultLayer = KrigingGP.getResultMapImageLayer(result.jobId)   // 获取插值计算结果图层
                                // console.log(resultLayer)
                                resultLayer.opacity = 0.9
                                resultLayer.title = '插值结果'
                                map.layers.pop()
                                map.layers.add(resultLayer)      //结果图层添加到地图上显示
                            }
                        })
                    }
                })
            })
            }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这