专栏首页跟牛老师一起学WEBGISArcgis for js之GP实现缓冲区计算

Arcgis for js之GP实现缓冲区计算

概述:

GP服务的存在使得在Web端使用ArcGIS 提供的空间分析,而这些分析的能力是和桌面中的一样的。因此,是Arcgis for js的一个重点,也是一个难点。因此,在本文讲述如何发布并在代码中调用GP服务,实现缓冲区的分析计算。

简介:

框架介绍参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/05/2755833.html

服务发布参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/18/2775492.html

模型参数:

Parameters: 
Parameter: input 
Data Type: GPFeatureRecordSetLayer 
Display Name input 
Description: input buffer 
Direction: esriGPParameterDirectionInput 
Default Value:
Geometry Type: esriGeometryPoint 
HasZ: false 
HasM: false 
Spatial Reference: 4326  (4326) 

Fields:
FID ( type: esriFieldTypeOID , alias: FID )
name ( type: esriFieldTypeString , alias: name , length: 100 )
id ( type: esriFieldTypeDouble , alias: id )
Features: None.


Parameter Type: esriGPParameterTypeRequired 
Category: 

Parameter: output 
Data Type: GPFeatureRecordSetLayer 
Display Name output 
Description: ouput feature 
Direction: esriGPParameterDirectionOutput 
Default Value:
Geometry Type: esriGeometryPolygon 
HasZ: false 
HasM: false 
Spatial Reference: 4326  (4326) 

Fields:
FID ( type: esriFieldTypeOID , alias: FID )
name ( type: esriFieldTypeString , alias: name , length: 100 )
id ( type: esriFieldTypeDouble , alias: id )
BUFF_DIST ( type: esriFieldTypeDouble , alias: BUFF_DIST )
Shape_Length ( type: esriFieldTypeDouble , alias: Shape_Length )
Shape_Area ( type: esriFieldTypeDouble , alias: Shape_Area )
Features: None.


Parameter Type: esriGPParameterTypeRequired 
Category: 

Parameter: Distance__value_or_field_ 
Data Type: GPLinearUnit 
Display Name Distance 
Description: Distance 
Direction: esriGPParameterDirectionInput 
Default Value: 50.0   (esriKilometers) 
Parameter Type: esriGPParameterTypeRequired 
Category: 

说明:

模型中有三个参数:1、输入;2、输出;3、缓冲距离单位或者字段。

代码实现:

1、添加绘制工具并定义事件

                    toolbar = new Draw(map);
                    dojo.connect(toolbar, 'onDrawEnd', drawEnd);
                    $("#point").on("click",function(){
                        map.graphics.clear();
                        toolbar.activate(esri.toolbars.Draw.POINT);
                    });
                    $("#polyline").on("click",function(){
                        map.graphics.clear();
                        toolbar.activate(esri.toolbars.Draw.POLYLINE);
                    });
                    $("#polygon").on("click",function(){
                        map.graphics.clear();
                        toolbar.activate(esri.toolbars.Draw.POLYGON);
                    });

2、绘制结束后提交计算

        /**
         * 绘制结束
         * @param geometry
         */
        function drawEnd(geometry) {
            $.messager.prompt('提示信息', '请输入缓冲区范围:', function(dist){
                if (dist){
                    $.messager.progress({
                        text:"计算中,请稍后..."
                    });
                    toolbar.deactivate();
                    var symbol = null;
                    if(geometry.type==="point"){
                        symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10,
                                new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,
                                        new esri.Color([255,0,0]), 1),
                                new esri.Color([0,255,0,0.25]));
                    }
                    else if(geometry.type==="polyline"){
                        symbol=new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2);
                    }
                    else{
                        symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25]));
                    }
                    var graphic = new esri.Graphic(geometry, symbol);
                    map.graphics.add(graphic);
                    tojob(graphic,dist);
                }
            });
        }
                
        function tojob(graphic,distance) {
            //第一步构造GP
            var gpUrl = 'http://localhost:6080/arcgis/rest/services/buffer/GPServer/buffer';
            gp = new esri.tasks.Geoprocessor(gpUrl);
            //第二步,构造参数
            //我们通过上面,了解到GPFeatureRecordSetLayer对应FeatureSet
            var features = [];
            features.push(graphic);
            var featureset = new esri.tasks.FeatureSet();
            featureset.features = features;
            //构造缓冲长度,这里的单位是可以更改的,我使用的是度,简单一些
            var Dis = new esri.tasks.LinearUnit();
            Dis.distance = distance;
            Dis.units = esri.Units.KILOMETERS;
            var parms = {
                input : featureset,
                Distance__value_or_field_ : Dis
            };
            //这里函数是异步的,使用函数是submitJob,同步的使用的是execute。
            //成功之后,调用jobResult,建议看一下这个参数。
            gp.submitJob(parms, jobResult);
        }

3、计算成功将结果绘制出来

        /**
         * 计算完成
         * @param result
         */
        function jobResult(result) {
            var jobId = result.jobId;
            var status = result.jobStatus;
            if(status === esri.tasks.JobInfo.STATUS_SUCCEEDED) {
                //成功之后,将其中的结果取出来,当然这也是参数名字。
                //在模型中,想要取出中间结果,需要设置为模型参数
                gp.getResultData(jobId, "output", addResults);
            }
        }
        function addResults(results){
            $.messager.progress('close');
            var features = results.value.features;
            if(features.length>0) {
                for (var i = 0, length = features.length; i != length; ++i) {
                    var feature = features[i];
                    var polySymbolRed = new esri.symbol.SimpleFillSymbol();
                    polySymbolRed.setOutline(new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0, 0.5]), 1));
                    polySymbolRed.setColor(new dojo.Color([255, 0, 0, 0.5]));
                    feature.setSymbol(polySymbolRed);
                    map.graphics.add(feature);
                }
                $.messager.alert("提示","计算成功!");
            }
            else{
                $.messager.alert("提示","计算失败!");
            }
        }

实现后效果:

输入距离

点计算成功

线缓冲

面缓冲

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Arcgis for Js之featurelayer实现空间查询和属性查询

    空间查询和属性查询是常用的两种对数据的检索与查询方式,在本节,将讲述Arcgis for Js下如何实现featurelayer的这两种查询方式,先贴图给大家...

    lzugis
  • Arcgis for Js实现graphiclayer的空间查询(续)

    上文中,实现了简单的针对graphiclayer的空间查询工作,在本节,将更加详细的介绍针对graphiclayer的空间查询。首先,空间查询的方式:提供多种类...

    lzugis
  • Arcgis for Javascript实现两个地图的联动

    今天在看天地图的时候,有一个多时相的地图显示功能,感觉很好玩,作为技术控的我晚上十点下班到家便是快十一点了,本来应该是睡觉了,但是,激动地心情不能平静,哎,算了...

    lzugis
  • Qt贴图与Qss快速入门(一)

    前两次和大家分享了Qml绘制仪表盘、Qt自定义控件绘制仪表盘,我是更倾向使用Qml这种方式的。自定义控件使用到了定时器,如果有多个控件的话,那岂不是要使用很多定...

    用户5908113
  • java_字节流、字符流

    java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

    咕咕星
  • 聊聊flink Table Schema的定义

    flink-table_2.11-1.7.0-sources.jar!/org/apache/flink/table/api/StreamTableEnviro...

    codecraft
  • 聊聊flink Table Schema的定义

    flink-table_2.11-1.7.0-sources.jar!/org/apache/flink/table/api/StreamTableEnviro...

    codecraft
  • 外观模式

    为子系统提供统一的入口。封装子系统的复杂性,便于客户端调用。在一个由多个模块组成的系统中,模块与模块之间就可以通过提供外观模式来进行数据的交互,每个模块只需要暴...

    帅飞
  • EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)

    一、拆分实体到多个表 1、在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段...

    郑小超.
  • RxJava2操作符之“Filter”

    我们创建了一个有6个数字的被观察者 然后添加操作符filter进行筛选工作 筛选逻辑这里写的是:如果能被2整除,则返回true,反之false 被观察者则...

    坑吭吭

扫码关注云+社区

领取腾讯云代金券