下面就来说一下具体的实现过程。
服务区分析算是在Web端实现网络分析的最后一个部分,之前已经讲解了关于网络数据集的制作,网络分析服务的发布,以及最近路径,最近设施点查询,今天来讲述最后一个部分,服务区分析。
如果您已经学完了最短路径以及最近设施点的分析,那么对于服务区分析,肯定也是小菜一碟了。这里也没有什么新内容,实现的过程依然和之前的路径分析以及设施点分析类似,不同的依然是参数不同,同时这里我们同样需要发布一个服务区分析图层。
假设我们已经构建好了网络分析服务(具体的发布网络分析服务的过程在之前的博文有详细的介绍,在此不再说明),打开我们的网络分析服务的地址,地址格式还是和之前的一样。例如本文的地址为:
http://qzj-pc/ArcGIS/rest/services/NetworkAnaysisMap/NAServer/ServiceArea
之前说服务区的参数和之前的其他分析不同,那么服务区的参数又有那些呢?
在 ArcGIS Silverlight 中,最近设施分析使用RouteServiceAreaParameters作为参数,RouteServiceAreaParameters的重要属性如下:
参数名称 | 参数含义 |
Facilities | 表示设施点,即出发点 |
DefaultBreaks | 表示默认中断值,string字符串,注意用逗号分割,例如"10,20,30"(假如时间是min)则表示搜索10分钟20分钟30分钟之内分别能够达到的区域 |
ExcludeSourcesFromPolygons | 由逗号分割的字符串名称,表示分析要排除的源要素类 |
TrimPolygonDistance | 表示修剪多边形的容差距离。 |
TrimPolygonDistanceUnits | 表示修剪多边形的容差距离单位。 |
SplitPolygonsAtBreaks | 表示从中断处(不同区域等级)拆分多边形,这样可得到不同时间内到达的区域多边形 |
SplitLineAtBreaks | 表示从中断处(不同区域等级)拆分线。 |
OverlapLines | 表示多个设施点生成的线是否相互覆盖 |
OverlapPolygons | 表示多个设施点生成的多边形是否相互覆盖 |
ReturnFacilities | 表示是否返回设施点 |
MergeSimilarPolygonRanges | 表示是否合幵相似中断值(等级)的多边形范围 |
OutputPolygons | 表示生成的多边形类型,默认由网络图层指定 |
TravelDirection | 表示路径方向,例如以设施为起点或终点为起点 |
以上为RouteServiceAreaParameters参数的一些重要属性。下面看看代码的声明:
RouteServiceAreaParameters serviceAreaParameter = new RouteServiceAreaParameters() { //获得设施点,即出发点 Facilities = stopsGraphicsLayer.Graphics, //设置终端值,breakString为声明的字符串变量 DefaultBreaks = breakString, //设置容差 TrimPolygonDistance = 10000, //是否返回设施点(出发点) ReturnFacilities = true, SplitPolygonsAtBreaks = true, SplitLineAtBreaks = false, OverlapLines = false, OverlapPolygons = true, MergeSimilarPolygonRanges = true, OutSpatialReference = MyMap.SpatialReference, };
以上的示例代码声明了一个RouteServiceAreaParameters变量。breakString为文本框的值,其中时间单位有小时和分钟,因此在此需要判断用户选择的时间单位是小时还是分钟(默认设置和网络分析图层一致,本文是小时)。
因此这里需要做相应的转换,比如用户输入的是30分钟,那么需要将其转换为0.5小时,因此我们定义了一个breakString。示例代码如下:
string breakString = ""; if (TimeUnitcomboBox.SelectedIndex == 0) { breakString = ServiceAreaBreakTextBox.Text; } else if(TimeUnitcomboBox.SelectedIndex==1) { string[] TimeString = ServiceAreaBreakTextBox.Text.Split(','); for (int i = 0; i < TimeString.Length-1;i++ ) { breakString += (Convert.ToDouble(TimeString[i]) / 60).ToString(); breakString += ","; } breakString += (Convert.ToDouble(TimeString[TimeString.Length - 1]) / 60).ToString(); }
在完成参数的定义之后,下面我们就可以开始进行网络分析服务的查询了。当然,首先我们需要定义一个RouteTask,以及查询成功和失败的事件相应函数。这和最近设施点分析以及路径分析也是一样的:
定义RouteTask,将url指向服务区网络分析图层:
RouteTask ServiceAreaTask = new RouteTask("http://qzj-pc/ArcGIS/rest/services/NetworkAnaysisMap/NAServer/ServiceArea");//服务区Task
注册事件的响应函数:
ServiceAreaTask.SolveServiceAreaCompleted += new EventHandler<RouteEventArgs>(ServiceAreaTask_SolveServiceAreaCompleted); ServiceAreaTask.Failed += new EventHandler<TaskFailedEventArgs>(Task_Failed);
private void ServiceAreaTask_SolveServiceAreaCompleted(object sender, RouteEventArgs e) { } private void Task_Failed(object sender, TaskFailedEventArgs e) { MessageBox.Show("求解失败" + e.Error.ToString()); }
基本的准备工作都已完毕,接下来就可以通过该RouteTask来查询服务区了。
if (ServiceAreaTask.IsBusy) ServiceAreaTask.CancelAsync(); ServiceAreaTask.SolveServiceAreaAsync(serviceAreaParameter);
到这里你应该也会想到,下一步就是获取查询的结果了,如果你细心,你会发现这和之其他的分析实现过程基本一致。
那么服务区分析的结果是什么呢?
我们知道服务区是一个面,那么肯定得到的结果是面要素。但是不同的是服务区分析的结果不再是RouteResult了,直接通过事件参数e的ServiceAreaPolygons属性即可得到服务区面要素。下面来看一下代码的实现获取结果的过程:
private void ServiceAreaTask_SolveServiceAreaCompleted(object sender, RouteEventArgs e) { int i = 1; foreach (Graphic g in e.ServiceAreaPolygons) { //这里我们输入的中断值一般是3个,所以结果会有三个面要素,分别表示不同时间内能够达到的区域 switch (i) { case 1: g.Symbol = LayoutRoot.Resources["MyServiceArea1"] as SimpleFillSymbol; break; case 2: g.Symbol = LayoutRoot.Resources["MyServiceArea2"] as SimpleFillSymbol; break; case 3: g.Symbol = LayoutRoot.Resources["MyServiceArea3"] as SimpleFillSymbol; break; } i++; serviceAreaLayer.Graphics.Add(g); } }
这里的MyServiceArea1,MyServiceArea2,MyServiceArea3为在XAML中定义的面要素资源样式,参考示例代码:
<esri:SimpleFillSymbol x:Name="MyServiceArea1" Fill="Red" BorderBrush="Yellow" BorderThickness="3"/> <esri:SimpleFillSymbol x:Name="MyServiceArea2" Fill="Yellow" BorderBrush="Green" BorderThickness="3"/> <esri:SimpleFillSymbol x:Name="MyServiceArea3" Fill="Green" BorderBrush="Blue" BorderThickness="3"/>
到此,所有的工作算是结束了,如果一切顺利,那么你也会得到和本文开始给出的那张照片。
Web端的网络分析的全部功能算是讲解结束了,欢迎大家相互交流!
网络分析系列的源程序以及网络分析数据下载地址:
(版权所有,转载请标明出处)http://www.cnblogs.com/potential/archive/2012/11/20/2779989.html