zoukankan      html  css  js  c++  java
  • 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("提示","计算失败!");
                }
            }


    实现后效果:


    输入距离


    点计算成功


    线缓冲




    面缓冲








  • 相关阅读:
    Python的优点和缺点
    如何在sed中使用变量方法及其简单
    shell脚本练习,创建数据文件注册用户并将用户信息存入文件内,用于模拟登录时使用
    shell脚本常用参数与格式
    运维方向和运维需要掌握的基本面
    linux系统awk命令精解
    数组去重方式
    原生js封装cookie获取、设置及删除
    sublime 浏览器快捷键设置
    background-image实现border效果及多图png如何实现background-size为原图一半
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539803.html
Copyright © 2011-2022 走看看