原文:ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能

昨天一QQ好友问了一个关于裁剪的问题,感觉自己也没有帮上什么忙,之后自己做了一个裁剪的例子,不过在做这个例子的时候还遇到了不少的问题,在此和大家分享一下.

1.裁剪功能的实现过程

这里的裁剪功能很简单,只需要一个Clip(裁剪)工具即可。

但是这里需要注意的问题是裁剪工具的参数:

裁剪工具有两个输入参数:

a.输入要素:这里指的是你用什么来裁剪目标要素,也就是你用什么裁剪

b.裁剪要素:这里指的被裁剪的要素,即目标要素,也就是说你要裁剪谁。

例如,我现在有一幅中国地图,我想根据我输入的任意形状,裁剪出任意形状所包含的中国地图部分。

如下图所示:

中国地图作为底图(裁剪要素)

输入多边形(输入要素),裁剪中国地图

输入多变行包含的中国地图部分

以上主要是说一下裁剪工具,如果这里弄反了,则无法得到结果。

2.GP服务模型

以上说了一下裁剪工具注意的东西,以及其功能。下面给出的是GP服务的模型,比较简单,只需要注意输入要素和裁剪要素别弄反就行,上面已经给出,在此不再解释。

3.发布GP服务

右键工具箱——发布到ArcGIS Server

输入GP服务名称,点击下一步知道完成发布即可。

到此实现裁剪功能的GP服务已经发布完毕,在此推荐最好在ArcMap中验证一下裁剪功能是否好使。

注意:

上面说到,裁剪工具需要注意输入要素和裁剪要素别弄反。实际上,当裁剪工具的两个要素参数弄反了之后,我们再发布实现裁剪的GP服务,同样不会报错,而且在ArcMap中验证还会得到和没有弄反时一样的结果,也就是说如果只针对于ArcMap来讲,裁剪工具的这两个参数弄反都无所谓,即不影响最后的结果,但是当我们在Web端调用(本文只针对于Silverlight客户端)时,就会得不到正确的结果,但是Silverlight客户端调用GP服务的整个过程不会报错。

关于GP服务的发布及注意事项可以参考之前的博文。

2.Silverlight客户端代码

(1).声明一个Draw对象,绘制多边形,作为裁剪要素。

 Draw myDraw = null;

(2).声明一个地理处理服务变量,用于请求GP服务

 Geoprocessor _geoprocessor = null;

(3).声明一个GraphicsLayer,存储绘制的多边形和最后裁剪的结果

GraphicsLayer graphicLayer = null;

(4).实例化上面的参数

             myDraw= new Draw(map1);
myDraw.DrawComplete += new EventHandler<DrawEventArgs>(myDraw_DrawComplete); myDraw.DrawMode = DrawMode.Polygon;
myDraw.IsEnabled = false; DrawButton.Click += new RoutedEventHandler(DrawButton_Click);
ClipButton.Click += new RoutedEventHandler(ClipButton_Click);
ClearButton.Click += new RoutedEventHandler(ClearButton_Click);

graphicLayer = map1.Layers["ClipGraphic"] as GraphicsLayer; _geoprocessor = new Geoprocessor("http://qzj-pc/arcgis/rest/services/ClipService/GPServer/ClipTool");
_geoprocessor.JobCompleted += new EventHandler<JobInfoEventArgs>(_geoprocessor_JobCompleted);
_geoprocessor.Failed += new EventHandler<TaskFailedEventArgs>(_geoprocessor_Failed);

上面声明了实例化了Draw对象,以及Geoprocessor,并注册相应的Button事件。

(5).首先是点击绘制多边形按钮,开始绘制裁剪要素多边形,所以在DrawButton的Click事件函数中添加如下代码:

        private void DrawButton_Click(object sender, RoutedEventArgs e)
{
//设置Draw为True,开始绘制
myDraw.IsEnabled = true;
}

(6).然后是绘制完成,在DrawComplete事件函数中获得绘制的多边形,并添加到图层中,示例代码如下:

 private void myDraw_DrawComplete(object sender, DrawEventArgs e)
{
graphicLayer.Graphics.Clear(); myDraw.IsEnabled = false;
//因为上面指定DrawMode为Polygon所以得到的就是多边形,如果DrawMode指定的是矩形,那么这里会出错
//因为矩形不是Polygon,因为只有Polygon或者Polyline以及MapPoint才能够被指定为Graphic的Geometry
Polygon clipPolygon = e.Geometry as Polygon; Graphic graphic = new Graphic()
{
Geometry=clipPolygon,
Symbol = LayoutRoot.Resources["FillSymbol"] as SimpleFillSymbol,
};
graphicLayer.Graphics.Add(graphic);
}

(7).绘制完成以后,接下来就是开始裁剪工作,在ClipButton的Click事件函数中开始Clip操作。
首先取得存储GraphicLayer中的Graphic。在此之前需要做一个判断,就是确认GraphicsLayer不为空。

然后由这些Graphic构成一个FeatureSet,将这个FeatureSet作为GP服务的输入参数,

最后请求GP服务。示例代码如下:

   private void ClipButton_Click(object sender, RoutedEventArgs e)
{
if (graphicLayer.Graphics.Count == )
{
MessageBox.Show("裁剪要素不能为空!");
return;
}
FeatureSet featureSet= new FeatureSet();
//遍历Graphic,添加到FeatureSet中
foreach (Graphic g in graphicLayer.Graphics)
{
featureSet.Features.Add(g);
}
//声明GP服务参数
List<GPParameter> gpparameter = new List<GPParameter>();
//添加给名为ClipPolygon的GP服务参数名赋值
gpparameter.Add(new GPFeatureRecordSetLayer("ClipPolygon", featureSet));
//请求GP服务
_geoprocessor.SubmitJobAsync(gpparameter);
}

(8).接着我们在GP服务的JobCompleted事件中注册GetResultDataCompleted事件,并请求GP服务的结果,示例代码如下:

 void _geoprocessor_JobCompleted(object sender, JobInfoEventArgs e)
{
//如果GP服务执行成功,则获取结果
if (e.JobInfo.JobStatus == esriJobStatus.esriJobSucceeded)
{
_geoprocessor.GetResultDataCompleted += new EventHandler<GPParameterEventArgs>(_geoprocessor_GetResultDataCompleted);
_geoprocessor.GetResultDataAsync(e.JobInfo.JobId, "ClipResult");
}
else if(e.JobInfo.JobStatus==esriJobStatus.esriJobFailed)
{
MessageBox.Show("GP服务执行失败!");
}
}

(9).最后在GetResultDataCompleted事件函数中,获得GP服务的执行结果,并将其现实在地图上。示例代码:

private  void _geoprocessor_GetResultDataCompleted(object sender, GPParameterEventArgs e)
{
graphicLayer.Graphics.Clear();
if (e.Parameter is GPFeatureRecordSetLayer)
{
GPFeatureRecordSetLayer featureSetLayer = e.Parameter as GPFeatureRecordSetLayer;
if (featureSetLayer.FeatureSet.Features.Count == )
{
MessageBox.Show("裁剪的结果为空!");
}
else
{ for (int i = ; i < featureSetLayer.FeatureSet.Features.Count;i++)
{
featureSetLayer.FeatureSet.Features[i].Symbol = LayoutRoot.Resources["ResultFillSymbol"] as ESRI.ArcGIS.Client.Symbols.FillSymbol;
graphicLayer.Graphics.Add(featureSetLayer.FeatureSet.Features[i]);
}
}
}
}

最后的示意图:

裁剪结果:

(版权所有,转载请标明出处)

ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能的更多相关文章

  1. ArcGIS API for Silverlight 调用GP服务绘制等值面

    原文:ArcGIS API for Silverlight 调用GP服务绘制等值面 GP服务模型如下图: 示例效果图片如下:

  2. ArcGIS API for Silverlight 调用GP服务加载等值线图层

    原文:ArcGIS API for Silverlight 调用GP服务加载等值线图层 第二篇.Silverlight客户端调用GP服务 利用ArcGIS API for Silverlight实现G ...

  3. ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

    原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试 第一篇.GP降雨量等值线建模.发布及测试 在水利.气象等行业中,要在WebGIS中实现空间分 ...

  4. ArcGIS API for Silverlight部署本地地图服务

    这一节我们来讲新建立的ArcGIS API for Silverlight应用程序如何加载自己的地图服务的问题,网上的资料讲的都有点含糊不清,这次我们详细的讲一下配置的步骤: 首先介绍下我们的开发和部 ...

  5. ArcGIS API for Silverlight开发入门

    你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我 都没关系.但你不能否认3G是一种趋势,最终我们每个人都会被包裹在3G网络中.1100也不是一成不变,没准哪天为了打击 ...

  6. 使用ArcGIS API for Silverlight实现地形坡度在线分析

    原文:使用ArcGIS API for Silverlight实现地形坡度在线分析 苦逼的研究生课程终于在今天结束了,也许从今以后再也不会坐在大学的课堂上正式的听老师讲课了,接下来的时间就得开始找工作 ...

  7. arcgis api for silverlight开发系列之二:缓存图层与动态图层及图层总结 .

    本文摘自:http://blog.csdn.net/leesmn/article/details/6916458(很优秀的博客)   作为ESRI的平台的一份子arcgis api for silve ...

  8. ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

    原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...

  9. ArcGIS API for Silverlight开发入门准备

    原文:ArcGIS API for Silverlight开发入门准备 微软的Silverlight提供了跨浏览器和跨平台开发环境,在Web中可用于创建和展现富互联网应用(RIA,Rich Inter ...

随机推荐

  1. iOS_24_画画板(含取色板)

    终于效果例如以下: 一.简单说明 1.使用一个数组 strokesArr(笔画数组)记录全部笔画.数组中保存的是一个个的笔画字典,一个字典就是一个笔画.笔画字典中有三项:笔画的大小.颜色.points ...

  2. C标签之forEach

    <c:forEach>标签用于通用数据循环,它有下面属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 開始条件 否 0 end 结束条件 否 集合中的 ...

  3. 了解HTML5和“她”的 API (一)

    简化了文档声明.字符集 //声明 <!doctype html> //字符 <meta charset="utf-8">  引入了新的标签元素 Select ...

  4. Swift学习笔记7:关闭

    闭包 捕 引用和将其存储在任意常量和变量的上下文. Swift 你会管理 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包採取例如以下三种形式之中的一个: ...

  5. 创建Material Design风格的Android应用--使用Drawable

    下面Drawables的功能帮助你在应用中实现Material Design: 图片资源着色 在android 5.0(api 21)和更高版本号,能够着色bitmap和.9 png 通过定义透明度遮 ...

  6. python django模型内部类meta详细解释

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract      这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应 ...

  7. SQLSERVER手动增长日志文件和数据文件

    原文:SQLSERVER手动增长日志文件和数据文件 SQLSERVER手动增长日志文件和数据文件 手动增长日志文件,实际上就是修改日志文件的大小  size 的单位是MB 下面设置日志文件大小是204 ...

  8. 定向爬虫之爬一爬各个学校新闻的认识(【1】对Url的认识)

    昨天早上,我习惯性的打开博客园,看一看别人的写的博客.突然想起,自己好像没有写过什么博客,所以就心血来潮,把我现在做得事情写出来, 这也是对我目前的学习的一种总结.望大神指点.... 对于一间学校的新 ...

  9. Java Web系列:Spring Boot 基础 (转)

    Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot 不会降低学习成本,甚至增加了 ...

  10. Android MotionEvent事故响应机制

    于android于.主要活动包括点击.按.拖累.滑动等操作,这些构成了Android事件响应,总体而言,,所有事件由例如以下三部分构成的基础: 按(action_down),搬家(action_mov ...