概述:
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);
- });
- /**
- * 绘制结束
- * @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);
- }
- /**
- * 计算完成
- * @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("提示","计算失败!");
- }
- }
输入距离
点计算成功
线缓冲
面缓冲
转载自:http://blog.csdn.net/gisshixisheng/article/details/49901807