07-ArcGIS API For JavaScript之调用GP服务

一、前言

ArcGIS API中关于GP服务的调用是比较容易出错的,出错的大部分原因便是Web API调用 GP 服务的时候参数不对应导致的。若不会发布 GP 服务,参看:自己发布 GP 服务

二、ArcGIS API For JavaScript 调用 GP 服务

首先看下发布的 GP 服务的定义,注意其中的参数:

2.1 代码实现

(1)在页面添加两个按钮(第一个按钮用于画点,第二个按钮用于缓冲区分析)

<input id="Btn" type="button" value="画点" />
<input id="buffer" type="button" value="缓冲区分析" />

(2)定义一个点几何对象(与服务定义的类型对应)

//定义点几何对象
var pointSet = new FeatureSet();

(3)定义点符号对象

var psymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CROSS, 12,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new dojo.Color([255, 0, 0]), 2),
new dojo.Color([0, 255, 0, 0.25]));

(4)绘画点按钮绑定点击事件

on(dom.byId("Btn"),"click",function(e){
					//定义绘图对象
					var toolBar= new Draw(MyMap, { showTooltips: true });
					//激活绘图对象
					toolBar.activate(Draw.POINT);
					on(toolBar, "draw-complete", function(result){
						//获得绘图结束的点对象
						var geometry = result.geometry;
						//根据点对象生成相应的图形
						var graphic = new Graphic(geometry, psymbol);
						//将点对象存储在点几何中
						pointSet.features.push(graphic);
						//将图形存放在地图中,然后得以显示
						MyMap.graphics.add(graphic);

					});	
});

(5)给缓冲区分析按钮添加绑定事件

on(dom.byId("buffer"),"click",function(e){
					//定义GP服务对象
					var buffer = new Geoprocessor("http://localhost:6080/arcgis/rest/services/Test/MyBuffer/GPServer/Mybuffer");
					//构建GP服务参数
					var gpParams={};
					//GP服务的Input参数
					gpParams.Input=pointSet;
					//GP服务的dis参数
					var dis=new LinearUnit({
                        "distance": 100,
                        "units": "esriMeters"
                    });
                    gpParams.dis=dis;
					//执行GP服务
					buffer.execute(gpParams, showResult);
})

(6)处理 GP 服务返回的结果

function showResult(results, messages){
                    var features = results[0].value.features;
                    for (var i = 0; i < features.length; i++) {
                        var graphic = features[i];
						//定义线符号
						var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 1);
						//定义面符号
                        var PolygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol, new dojo.Color([255, 255, 0, 0.25]));
						//设置面符号
                        graphic.setSymbol(PolygonSymbol);
                        MyMap.graphics.add(graphic);
                    }
 }

2.2 运行代码遇到的 bug

当运行程序发现提示错误:

次时我们观察前台传给后台的参数:

Input:{
			"geometryType":"esriGeometryPoint",
			"features":[{"geometry":{"x":21264961.8441914,"y":3997922.462940743,"spatialReference":{"wkid":2334,"latestWkid":2334}}}],
			"sr":{"wkid":2334,"latestWkid":2334}
	}
dis: {"distance":100,"units":"esriMeters"}

传给后台的参数和 GP 服务的参数对比,发现 Input 参数缺少 fields 字段:

2.3 解决 bug

我们给运行GP服务之前给Input参数添加上Fields字段:

on(dom.byId("buffer"),"click",function(e){
					//定义GP服务对象
					var buffer = new Geoprocessor("http://localhost:6080/arcgis/rest/services/Test/MyBuffer/GPServer/Mybuffer");
					//构建GP服务参数
					var gpParams={};
					//添加fields字段,为了和后台服务字段匹配
					pointSet.fields=[];
					//GP服务的Input参数
					gpParams.Input=pointSet;
					//GP服务的dis参数
					var dis=new LinearUnit({
                        "distance": 100,
                        "units": "esriMeters"
                    });
                    gpParams.dis=dis;
					//执行GP服务
					buffer.execute(gpParams, showResult);
});

2.4 完整代码

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>调用GP服务</title>
    <link rel="stylesheet" type="text/css" href="http://localhost:8080/arcgis_js_api/library/3.17/3.17/dijit/themes/tundra/tundra.css"/>
    <link rel="stylesheet" type="text/css" href="http://localhost:8080/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
    <script type="text/javascript" src="http://localhost:8080/arcgis_js_api/library/3.17/3.17/init.js"></script>
    <style type="text/css">
        .MapClass{
            width:100%;
            height:600px;
            border:1px solid #000;
        }
    </style>
    <script type="text/javascript" charset="utf-8">

        require(["esri/map",
                    "esri/layers/ArcGISDynamicMapServiceLayer",
                    "dojo/dom",
                    "esri/tasks/Geoprocessor",
                    "esri/tasks/FeatureSet",
                    "esri/symbols/SimpleMarkerSymbol",
                    "esri/symbols/SimpleLineSymbol",
                    "esri/toolbars/draw",
                    "esri/symbols/SimpleFillSymbol",
                    "dojo/on","esri/graphic",
                    "esri/tasks/LinearUnit",
                    "dojo/domReady!"],
                function (Map,
                          ArcGISDynamicMapServiceLayer,
                          dom,
                          Geoprocessor,
                          FeatureSet,
                          SimpleMarkerSymbol,
                          SimpleLineSymbol,
                          Draw,
                          SimpleFillSymbol,on,Graphic,LinearUnit) {
                    var MyMap = new Map("MyMapDiv");

                    //在页面中加入地图
                    var layer = new ArcGISDynamicMapServiceLayer
                    ("http://localhost:6080/arcgis/rest/services/Test/MyMapService/MapServer");
                    MyMap.addLayer(layer);
                    //定义点几何对象
                    var pointSet = new FeatureSet();
                    //定义点符号对象
                    var psymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CROSS, 12,
                            new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                    new dojo.Color([255, 0, 0]), 2),
                            new dojo.Color([0, 255, 0, 0.25]));
                    //给画点绑定点击事件
                    on(dom.byId("Btn"),"click",function(e){
                        //定义绘图对象
                        var toolBar= new Draw(MyMap, { showTooltips: true });
                        //激活绘图对象
                        toolBar.activate(Draw.POINT);
                        on(toolBar, "draw-complete", function(result){
                            //获得绘图结束的点对象
                            var geometry = result.geometry;
                            //根据点对象生成相应的图形
                            var graphic = new Graphic(geometry,psymbol);
                            //将点对象存储在点几何中
                            pointSet.features.push(graphic);
                            //将图形存放在地图中,然后得以显示
                            MyMap.graphics.add(graphic);

                        });
                    });
                    //给缓冲区分析按钮添加绑定事件
                    on(dom.byId("buffer"),"click",function(e){
                        //定义GP服务对象
                        var buffer = new Geoprocessor("http://localhost:6080/arcgis/rest/services/Test/MyBuffer/GPServer/Mybuffer");
                        //构建GP服务参数
                        var gpParams={};
                        //添加fields字段,为了和后台服务字段匹配
                        pointSet.fields=[];
                        //GP服务的Input参数
                        gpParams.Input=pointSet;
                        //GP服务的dis参数
                        var dis=new LinearUnit({
                            "distance": 100,
                            "units": "esriMeters"
                        });
                        gpParams.dis=dis;
                        //执行GP服务
                        buffer.execute(gpParams, showResult);
                    });

                    function showResult(results, messages)
                    {
                        var features = results[0].value.features;
                        for (var i = 0; i < features.length; i++) {
                            var graphic = features[i];
                            //定义线符号
                            var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 1);
                            //定义面符号
                            var PolygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol, new dojo.Color([255, 255, 0, 0.25]));
                            //设置面符号
                            graphic.setSymbol(PolygonSymbol);
                            MyMap.graphics.add(graphic);
                        }
                    }
                });
    </script>
</head>
<body>
<div id="MyMapDiv" class="MapClass"></div>
<input id="Btn" type="button" value="画点" />
<input id="buffer" type="button" value="缓冲区分析" />
</body>
</html>

2.5 截图

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值