您的位置:首页 > Web前端 > JavaScript

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

2017-03-03 02:20 537 查看
概述:

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

模型参数:

[plain] view
plain copy

 print?

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、添加绘制工具并定义事件

[javascript] view
plain copy

 print?

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、绘制结束后提交计算

[javascript] view
plain copy

 print?

/** 

 * 绘制结束 

 * @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、计算成功将结果绘制出来

[javascript] view
plain copy

 print?

/** 

 * 计算完成 

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

    }  

}  

实现后效果:



输入距离



点计算成功



线缓冲

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐