原文:使用ArcGIS API for Silverlight实现地形坡度在线分析

苦逼的研究生课程终于在今天结束了,也许从今以后再也不会坐在大学的课堂上正式的听老师讲课了,接下来的时间就得开始找工作了.....前段时间一直比较忙,上课,考试,论文,以及联系实习单位...现在就差实习还没有着落了。

前些天帮一网友做了个在线坡度分析的例子,大概的功能就是勾选任意的地形区域,然后实现Web端的地形坡度分析和可视化显示,效果图如下:

实现的基本思路大致分为以下三部分:

1.在ArcMap中建立坡度求解模型和坡度统计分析模型

2.发布模型为结果地图服务,并在客户端调用

3.根据将结果添加地形渲染的分级视图。

一、建立坡度分析和统计分析模型

打开ArcMap,使用ModelBuilder建立如下所示的模型:

这里需要注意两个地方:

1.SlopeData我们发现是中间数据,中间数据是模型创建的数据,但不是模型的输出,如果这里没有设置为模型参数,那么任务创建的中间数据将会被 ArcGIS Server 自动删除。

在 10.1 版本之前,必须在模型构建器中明确设置中间数据变量,并且强烈推荐使用输出路径下的 %scratchworkspace% 约定将所有输出写入地理处理 scratchworkspace 环境。在10.1中不必使用此约定。

2.该模型具有两个输出模型参数:SlopeData,表示坡度的栅格数据,和ZonalTable,表示对坡度栅格数据统计的结果(如:坡度的最大值,最小值,平均值等)。

在模型建好以后,需要将该模型发布为结果地图服务,关于10.1中结果地图服务的发布可参考之前的博文。

二、Silverlight客户端调用结果地图服务,获得坡度分析结果和统计结果(坡度最大值,最小值,平均值等)。

Web端调用的过程和调用GP服务的过程一致,大致如下:

1.声明地理处理变量:

 Geoprocessor _geoprocessor;

2.实例化地理处理服务变量,并注册相应事件:

 _geoprocessor = new Geoprocessor("http://localhost:6080/arcgis/rest/services/MyGPService/SlopeAnalysis/GPServer/SlopeTool");
_geoprocessor.JobCompleted += new EventHandler<JobInfoEventArgs>(_geoprocessor_JobCompleted);
_geoprocessor.GetResultDataCompleted += new EventHandler<GPParameterEventArgs>(_geoprocessor_GetResultDataCompleted);
_geoprocessor.GetResultImageLayerCompleted += new EventHandler<GetResultImageLayerEventArgs>(_geoprocessor_GetResultImageLayerCompleted);
_geoprocessor.Failed += new EventHandler<TaskFailedEventArgs>(_geoprocessor_Failed);

3.输入GP服务相关参数,请求GP服务

从以上建立的模型可知:

输入的模型参数有:

polygon:表示勾选的区域,也就是执行坡度分析的地形区域

输出测量单位:表示坡度分析的结果如何表示,有两种选择,Degree:坡度以角度表示,值得范围在0-90度之间,PERCENT_RISE:表示以高程的百分比表示,默认为DEGREE.

Z 因子:一个Z单位与x,y方向单位的比值,这里

后台输入GP服务参数,调用服务代码:

            //e.Geometry为绘制的多边形
FeatureSet featureSet = new FeatureSet(e.Geometry);
List<GPParameter> parameter = new List<GPParameter>();
parameter.Add(new GPFeatureRecordSetLayer("polygon", featureSet));
parameter.Add(new GPString("输出测量单位", "DEGREE"));
//x,y方向单位是经纬度表示,高程值用米表示
//经纬度与米的转化公式:degree = meter / (2 * Math.PI * 6378137.0) * 360;
parameter.Add(new GPDouble("Z_因子", 8.98315E-6));
_geoprocessor.SubmitJobAsync(parameter);

请求GP服务之后接下来就是获取GP服务的结果,这里我们需要取得两个结果,一是坡度分析结果(栅格数据,对应的格式是:GPResultImageLayer),一是坡度统计结果(表格,对应的数据格式:GPRecordSet)
这里我们先来获取坡度分析结果,即栅格数据。

获取栅格数据可以通过地理处理服务的GetResultImageLayerCompleted事件来获得结果,但是我们需要在地理处理服务的Completed事件中进行请求,Completed事件表示本次地理处理任务已经完成,接下来才能获取地理处理服务的结果。示例代码:

在开始部分我们已经注册地理处理服务的JobCompleted,GetResultDataCompleted和GetResultImageLayerCompleted事件,接下来在相应部分完成相应的代码,

其中JobCompleted是获取结果的前提,所有的获取地理处理结果的请求,都要等地理处理服务完成(及JobCompleted),同时请求结果的时候不能同时请求两个结果,如获取栅格数据的代码如下:

  private void _geoprocessor_JobCompleted(object sender, JobInfoEventArgs e)
{
if (e.JobInfo.JobStatus == esriJobStatus.esriJobSucceeded)
{
jobID = e.JobInfo.JobId;
HttpWebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);
_geoprocessor.GetResultImageLayerAsync(e.JobInfo.JobId, "SlopeData");
//注意不能同时请求GP服务的结果,如果在此添加下面的额代码会出错
//_geoprocessor.GetResultDataAsync(jobID, "ZonalTable");
}
else
{
MessageBox.Show("请求GP服务失败" + e.JobInfo.Messages.ToString());
}
}

接下来就是获得坡度的栅格数据,然后在地图上显示,并同时发送获取统计表格的请求:

   private void _geoprocessor_GetResultImageLayerCompleted(object sender, GetResultImageLayerEventArgs e)
{
//返回的结果实际上是一张图片
GPResultImageLayer imagelayer = e.GPResultImageLayer;
//定义图层的ID
imagelayer.ID = "InterpolationLayer";
//设置透明度
imagelayer.Opacity = 0.7;
imagelayer.DisplayName = "坡度图层";
//清空原有的结果
if (map1.Layers["InterpolationLayer"] != null)
{
map1.Layers.Remove(map1.Layers["Interpolation"]);
}
//添加当前结果到图层中
map1.Layers.Add(imagelayer);
//获取坡度统计表格数据
_geoprocessor.GetResultDataAsync(jobID, "ZonalTable"); }

获取坡度统计表格的数据,表格在Web客户端传输的的格式是GPRecordSet,直接遍历即可,这里因为执行一次坡度分析,所以表格中只有一条记录,示例代码如下:

private void _geoprocessor_GetResultDataCompleted(object sender, GPParameterEventArgs e)
{
GPRecordSet gpr = e.Parameter as GPRecordSet;
if (gpr.FeatureSet != null)
{
double slope_MaxValue = Convert.ToDouble(gpr.FeatureSet.Features[].Attributes["MAX"]);
double slope_MinValue = Convert.ToDouble(gpr.FeatureSet.Features[].Attributes["MIN"]);
double slope_MeanValue = Convert.ToDouble(gpr.FeatureSet.Features[].Attributes["MEAN"]);
MEANSlopeValue.Text = slope_MeanValue.ToString("0.000");
List<SolidColorBrush> RenderColors = new List<SolidColorBrush>(); //默认设定10等分,颜色由绿到红
RenderColors = CreateColors.CreateColorList();
//间隔值
double stepValue = (slope_MaxValue - slope_MinValue) / RenderColors.Count;
//构造不同等级的颜色和描述
List<RenderModel> RenderModels = new List<RenderModel>();
for (int i = ; i < RenderColors.Count; i++)
{
RenderModels.Add(new RenderModel()
{
EndValue = (i + ) * stepValue,
StartValue = i * stepValue,
RenderColor = RenderColors[i]
});
}
//绑定到渲染等级显示的ListBox中
RenderColorListBox.ItemsSource = RenderModels;
RenderColorBorder.Visibility = Visibility.Visible;
}
}

以上代码包含了栅格数据渲染的颜色等级显示图例,其中用到了一个方法:CreateColorList,该方法用来构造由绿到黄再到红的不同的渐变颜色。

       public static List<SolidColorBrush> CreateColorList(int _classCount)
{
List<SolidColorBrush> ColorList=new List<SolidColorBrush> ();
double step=/_classCount;
for (int i = ; i <= _classCount/; i++)
{
ColorList.Add(new SolidColorBrush(Color.FromArgb(, (byte)(i*step*), , )));
}
for (int i = _classCount / + ; i <= _classCount; i++)
{
ColorList.Add(new SolidColorBrush(Color.FromArgb(, ,(byte)((_classCount-i)*step*) , )));
}
return ColorList;
}

以及RenderModel,该类代码如下:

  public class RenderModel
{
public SolidColorBrush RenderColor { get; set; }
public double StartValue { get; set; }
public double EndValue { get; set; }
public string Description
{
get { return string.Format("{0}-{1}", StartValue.ToString("#0.00"), EndValue.ToString("#0.00")); }
}
}

这样便完成了坡度分析和颜色等级图例。

最后再来几张效果图吧!

初始界面:

勾选地形区域进行坡度分析:

正在进行坡度分析:

坡度分析结果显示:

PS:蛋疼的博客园,为了写这篇日志耗了我一个晚上,上传图片一直失败,失败后直接刷新,之前写的没有保存,直接没有了,代码弄了好久也还是没有成功,所以需要代码的请留下您的邮箱,我会在第一时间将代码发送到您的邮箱。

最后感谢您能认真的看完我的文章,感谢您的支持!

使用ArcGIS API for Silverlight实现地形坡度在线分析的更多相关文章

  1. ArcGIS API for Silverlight 加载google地图

    原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...

  2. ArcGIS api fo silverlight学习一(silverlight加载GeoServer发布的WMS地图)

    最好的学习资料ArcGIS api fo silverlight官网:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm 一. ...

  3. ArcGIS API for Silverlight动态标绘的实现

    原文:ArcGIS API for Silverlight动态标绘的实现 1.下载2个dll文件,分别是: ArcGISPlotSilverlightAPI.dll 和 Matrix.dll 其下载地 ...

  4. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题

    原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...

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

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

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

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

  7. ArcGIS API for Silverlight代码中使用Template模板

    原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...

  8. ArcGIS API for Silverlight实现地图测距功能

    原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Hei ...

  9. ArcGIS API for Silverlight 绘制降雨路径动画

    原文:ArcGIS API for Silverlight 绘制降雨路径动画 #region 降雨动画演示 2014-04-16 List<Graphic> graphics = new ...

随机推荐

  1. Linux curl使用简单介绍 (转)

    Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www.linuxid ...

  2. Paint获取Text的宽和高的数据

    获取字符串的宽度: public static float GetTextWidth(String text, float Size) { // 第一个参数是要计算的字符串,第二个参数是字提大小 Te ...

  3. QUIC简要

    QUIC.即Quick UDP Internet Connection,类似于SPDY,相同也是由Google公司在现有已存协议之上进行了扩展设计,而旨在降低网络延迟.之前我曾介绍过SPDY的相关信息 ...

  4. HDU 2012 素性

    素性 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  5. Fuel 5.1安装openstack I版本号环境

    声明:本博客欢迎转载,但请保留原作者信息! 作者:傅斌杰 团队:华为杭州OpenStack团队 Fuel 简单介绍 Fuel是Mirantis公司开发的部署openstack集群工具,主要功能为裸机P ...

  6. maven/eclipse搭建ssm(spring+spring mvc+mybatis)

    maven/eclipse搭建ssm(spring+spring mvc+mybatis) 前言 本文旨在利用maven搭建ssm环境,而关于maven的具体内容,大家可以去阅读<Maven 实 ...

  7. c++内存泄漏处理(积累)

    写c++程序时,常常会出现内存泄漏的问题,这里从网上找了一种非常麻烦的方法:假设想找到每一个cpp文件的内存泄漏,都必须在每一个cpp加上例如以下代码: #include <crtdbg.h&g ...

  8. iOS如何添加照片模拟器(附带诉讼)

    刚開始做图片选择时,使用了最笨的办法给iphone模拟器添加照片. 方法一:首先打开safari.然后找到图片.点击图片,保存到本地(iphone): 方法二:拖动本地计算机的随意一张照片到iphon ...

  9. CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

    JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...

  10. Kienct与Arduino学习笔记(2) 深度图像与现实世界的深度图的坐标

    转载请注明出处:http://blog.csdn.net/lxk7280 首先,要接触一下KinectOrbit这个摄像机库,这篇文章中有这个库的下载网址和简单的介绍:http://blog.csdn ...