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

简介: 原文:ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能     昨天一QQ好友问了一个关于裁剪的问题,感觉自己也没有帮上什么忙,之后自己做了一个裁剪的例子,不过在做这个例子的时候还遇到了不少的问题,在此和大家分享一下. 1.裁剪功能的实现过程 这里的裁剪功能很简单,只需要一个Clip(裁剪)工具即可。
原文: 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 == 0)
            {
                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 == 0)
                {
                    MessageBox.Show("裁剪的结果为空!");
                }
                else
                {

                    for (int i = 0; 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]);
                    }
                }
            }
        }

最后的示意图:

裁剪结果:

 

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

 

 

 

目录
相关文章
|
2月前
|
编解码 Linux API
【FFmpeg 视频流处理】FFmpeg API深度解析:视频流画面合并、拼接与裁剪技巧
【FFmpeg 视频流处理】FFmpeg API深度解析:视频流画面合并、拼接与裁剪技巧
295 0
|
9月前
|
人工智能 数据可视化 API
ArcGIS API for Python
ArcGIS API for Python
50 0
|
XML JSON 缓存
「深入理解API商品返回值:实现数据交互的关键要素」
首先,API商品返回值是指在进行数据交互时,从服务器获取到的用于描述和表示商品信息的数据。这些返回值通常以JSON(JavaScript Object Notation)或XML(eXtensible Markup Language)格式返回给调用方,并包含了商品的各种属性,如名称、价格、库存状态、图片链接等。了解返回值的结构和内容对于开发者来说至关重要,因为它们决定了如何解析和利用这些数据。
67 0
|
JavaScript 前端开发 应用服务中间件
Arcgis api for javascript 详细部署
Arcgis api for javascript 详细部署
|
存储 JSON 监控
有关企业四要素认证API的相关知识
近些年,企业开放API的趋势愈发明显。多数企业选择将其产品或服务通过API向外部提供访问接口,以增强用户体验和促进业务转型。但是,仅仅开放一个开放式API接口是不够的。针对企业级API,专门的认证机制显得尤为重要。在本文中,我们将会介绍有关企业四要素认证API的相关知识。
|
安全 Java API
一口气整理三种不同运营商要素验证API的Java 接入代码
一口气整理三种不同运营商要素验证API的Java 接入代码
615 0
|
安全 API 数据安全/隐私保护
运营商二要素、三要素 API:为用户的个人信息安全保驾护航
本文将介绍运营商二要素、三要素 API 的技术原理、实际应用场景、以及如何使用 API 实现用户身份验证。
701 0
运营商二要素、三要素 API:为用户的个人信息安全保驾护航
|
安全 API 计算机视觉
银行卡四要素验证API接口怎么用
移动互联的大发展时代,网上支付也成了大家日常生活最普遍的支付方式,为了更好地保证支付环境的安全性,银行卡四要素验证是不可或缺的一环
1302 0
银行卡四要素验证API接口怎么用
|
XML JSON 前端开发
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
137 0
软件测试|Spring Boot 的 RESTful API 设计与实现
|
人工智能 数据可视化 数据管理
ArcGIS API for Python
ArcGIS API for Python
91 0