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

     服务区分析实现的主要功能是判断在一定时间内所能够到达的区域,例如,从某一点出发,我们想知道在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端的网络分析的全部功能算是讲解结束了,欢迎大家相互交流!

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

网络分析数据下载

网络分析源程序下载

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

原文地址:https://www.cnblogs.com/potential/p/2779989.html