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原创文章,未经允许不得转载。

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

GIS缓冲区算法对比研究(Buffer Algorithm)                  ----王少华   一.介绍算法: 缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或...
  • qq503690160
  • qq503690160
  • 2011年12月08日 22:31
  • 1789

GIS 缓冲区应用及算法实现

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

GIS缓冲区算法

  • 2014年03月20日 15:12
  • 2.24MB
  • 下载

geotools实现shp数据的缓冲区分析

本文讲述如何在geotools中实现shp数据的缓冲区分析并保存到shp文件中。
  • GISShiXiSheng
  • GISShiXiSheng
  • 2017年06月30日 07:28
  • 977

Qgis开发10-缓冲区分析

Qgis开发-缓冲区分析 sf2gis@163.com 2014年8月25日   1  概述 缓冲区是指以几何实体为基础,以一定的半径在周围建立起的多边形。用于与周边地物叠加,解决邻近相关性...
  • sf2gis2
  • sf2gis2
  • 2014年09月28日 23:48
  • 1942

postgis常用函数介绍(一)

在进行地理信息系统开发的过程中,常用的空间数据库有esri的sde,postgres的postgis以及mySQL的mysql gis等等,在本文,给大家介绍的是有关postgis的一些常用函数的意思...
  • GISShiXiSheng
  • GISShiXiSheng
  • 2015年08月16日 13:06
  • 2518

geohash: 一个实用的geocoding方法

geohash: 一个实用的geocoding方法
  • hsg77
  • hsg77
  • 2011年06月02日 15:39
  • 5061

Arcgis for js之WKT和GEOMETRY的相互转换

Arcgis for js之WKT和GEOMETRY的相互转换
  • GISShiXiSheng
  • GISShiXiSheng
  • 2015年03月04日 11:24
  • 7963

Arcgis for Js之GeometryService实现测量距离和面积

Arcgis for Js之GeometryService实现测量距离和面积
  • GISShiXiSheng
  • GISShiXiSheng
  • 2014年10月28日 15:30
  • 8837

arcgis for javascript 帮助

JS API3.4的要求 à(1)  IE9或以上版本 否则dijit1.8.3不匹配   1.如何发布ArcgisJavascript API应用 0.准备工作: ...
  • zhuxiaowei716
  • zhuxiaowei716
  • 2015年03月13日 18:31
  • 9159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Arcgis for js之GP实现缓冲区计算
举报原因:
原因补充:

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