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

原创 2015年11月18日 07:38:21

概述:

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("提示","计算失败!");
            }
        }


实现后效果:


输入距离


点计算成功


线缓冲




面缓冲








版权声明:本文为LZUGIS原创文章,未经允许不得转载。

相关文章推荐

Arcgis 由点生成方形缓冲区

在arcgis软件中,点文件的缓冲区只能生成圆形特征区,而不能生成我们需要的方形区域,但是我们在建立样区的时候,以方形区域为主,那么如何利用arcgis软件建立方形的多边形呢?     该过程大致可分...

使用 arcgis for javascript GeometryService进行缓冲区分析 错误 Unable to complete operation.(…)

arcgis for javascript   API 关于使用GeometryService进行缓冲区分析的例子巨坑,没有详细介绍参数 以至于出现错误查半天。 还有下面的情况:  用...

arcgis api for js入门开发系列十二 GP服务 实现缓冲区及运算分析(含源代码)

概述: GP服务的存在使得在Web端使用ArcGIS 提供的空间分析,而这些分析的能力是和桌面中的一样的。因此,是Arcgis for js的一个重点,也是一个难点。因此,在本文讲述如何发布并在...

ArcGIS API for Javascript 使用缓冲区结果做query查询出现“esri.config.defaults.io.proxyUrl 尚未进行设置”错误

1、前言 在研究ArcGIS API for JavaScript时会遇到这样的问题,比如我们在做缓冲区分析时,用分析的范围作为空间查询query的参数,在执行结果中总是会看到“esri.con...
  • esricd
  • esricd
  • 2014年12月29日 10:04
  • 3444

GIS 缓冲区应用及算法实现

地理信息空间几何关系分析主要包括邻近度 (proximity) 分析、叠加分析、网络分析等。缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或空间物体对其周围地物的影响度而在其周围建立具...

GIS 点、线缓冲区生成算法的C#实现(V0.95)

声明:1.当初自己在找缓冲区生成算法时,非常难找,网上实现的代码更是没有,只有寥寥的几句理论,在N天之后在网上搜到了两篇论文,是《一种GIS缓冲区矢量生成算法及实现》和《GIS缓冲区和叠加分析》,自己...

关于常见的几种缓存算法

一次偶然的交流机会,被问到关于缓存算法的问题,结果当场蒙圈,同时也暴露了自己的不足; 结合目前的理解,也就只知道软件会结合http header头去做一些处理来控制缓存过期时间,当磁盘满后,会删除最冷...

两种常见的缓存淘汰算法LFU&LRU

1. LFU 1.1. 原理 LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也...
  • jake_li
  • jake_li
  • 2016年02月13日 21:47
  • 4946

GIS缓冲区算法对比研究(Buffer Algorithm)

GIS缓冲区算法对比研究(Buffer Algorithm)                  ----王少华   一.介绍算法: 缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Arcgis for js之GP实现缓冲区计算
举报原因:
原因补充:

(最多只允许输入30个字)