您的位置:首页 > 理论基础 > 计算机网络

ArcGIS网络分析之Silverlight客户端服务区分析(五)-分析部分

2013-06-09 09:14 501 查看
服务区分析实现的主要功能是判断在一定时间内所能够到达的区域,例如,从某一点出发,我们想知道在30分钟之内能够达到的范围有多大,那么我们就可以借助服务区分析来实现。一下是本文最后实现的效果图:



下面就来说一下具体的实现过程。

服务区分析算是在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端的网络分析的全部功能算是讲解结束了,欢迎大家相互交流!

网络分析系列的源程序以及网络分析数据下载地址:

网络分析数据下载

网络分析源程序下载

(版权所有,转载请标明出处)/article/5102412.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: