说明: 本实例主要演示网络分析数据集制作,服务发布,最后基于ArcGIS API for WPF做路径分析。 本实例参考ArcGIS官方文档,想了解GIS网络分析可查阅官方文档。 本实例数据为西藏道路数据,若无数据可新建简单的线要素。 本实例使用软件及版本:ArcGIS10.2,ArcGIS APIfor WPF24,VS2010。 最后为了增加效果叠加局部离线卫星地图,需要安装水经注万能地图下载器(相当方便的卫星地图下载器),如果没有安装本软件,可以百度“水经注软件”到官方网站下载。 软件网站:http://www.rivermap.cn/
一、 准备网络分析数据 新建一个“Test”数据库,用于储存永久的服务数据,一般我们将地理要素及要素集存放在地里数据库中。这里我们新建了一个名叫“NetworkFeatureDataSet”的要素集,这是因为存放于地理数据库中的线要素如果用于构建网络数据集,则必须放在要素集中。
新建各种要素(表示设施的点要素,以及表示道路的线要素),并添加相关的属性。
新建线要素属性如下图所示
新建点要素(其实可以省略)。 编辑要素,构建地图。此处直接导入西藏道路数据,如下图所示
注意:道路数据是联通的,需要把相交的线要素进行打断处理。这里使用高级编辑工具(在10.2之前的版本应该是拓扑工具条里),如下图
完成以上内容之后,就开始构建网络数据集(构建网络数据集的线要素必须位于要素数据集中) 右键要素集,选择“新建”“网络数据集”
点击将如下图所示
设置网络数据集的名称,点击下一步。
选择参与网络数据集的数据类,点击下一步
构建拐弯模型,选是,下一步
设置连通性,这里有节点和端点两种,默认情况下为端点,这里我们选择默认即可,然后点击下一步。
设置高程字段,当涉及到高程时,在此设置,本案例没有涉及,所以选择无。然后点击下一步。
设置网络数据集的属性,我们指定了如上所示的属性。具体的添加过程: 点击添加,然后设置名称,用法和单位,然后点击赋值器,可以指定该属性是字段,函数,常量以及VB脚本。 这里我们设置“长度”属性为字段,对应线要素的“Shape_Length”属性
以上属性设置好以后,点击下一步,设置网络方向属性。
这里我们设置长度属性为Distance,如上图所示,在街道名称中设置名称为NAME字段。 点击完成,如果过程没有错误,就完成了自己的网络数据集。这是要素集的内容如下
接下来验证生产的网络数据集。 点击自定义调出网络分析工具条:
选择停靠点,并求解,如下图所示
生成的方向指南
至此,数据准备完毕,接下来发布网络分析服务。
二、 发布网络分析服务 新建MXD文档。文档必须包含用于最短路径分析图层、网络数据集“Network_ND”。地图文档可以增加其它要素,来增加显示效果。 创建最短路径分析图层,可以通过ArcToolBox新建,如下图
此实例只有两个图层(不需要的两个图层),如下图
所需图层准备好之后,保存MXD文档,然后发布。 我们可以直接在ArcMap中发布也可在ArcCatalog中发布。右键MXD地图文档——发布到ArcGIS Server。
发布成功之后,可以在本地的浏览器中打开该网络分析服务的地址.即可查看该网络分析服务的参数和相关功能。
括号为NAServer就表示该服务为网络分析服务。打开可以查看该服务的具体信息。
到此网络分析服务的发布工作已经完成。
三、 准备卫星地图数据及发布影像服务 启动水经注万能地图下载器,在查询定位中输入“拉萨”,再双击搜索出的行政边框内的区域,弹出对话框,设置相应属性。
在级别列表中,你可以选择任何级别,但一般来讲城区选择19级,郊区选择16级比理想,但选择级别之前,最好在在线地图浏览中先查看所想要下载的级别是否有数据,这里我们以18级为例。选择好级别后,点击确定开始下载。
下载完成后会弹出对话框询问是否要立即导出,选择“是”,然后显示“导出图片数据”对话框,如下图所示。
在该对话框中,不需要作任何设置,点击“输出”按钮以默认参数导出数据即可。默认导出路径为“D:\SGDownload\未命名_拼接[默认]\L18”。 在ArcMap中导入影像数据显示如图
注意:投影坐标系需要保持一致,才能进行叠加显示。 查看刚刚下载影像的坐标系为“WGS_1984_Web_Mercator”,与之前发布的网络服务坐标系“WGS_1984_World_Mercator”不一致,因此我们需要先转换投影坐标系,再发布影像服务。
投影坐标一致后,我们可以在ArcMap中看到影像和网络数据叠加在一起了。
接下来就是发布影像服务。
此处与网络数据发布步骤一致,就不在此累述了。发布成功后可以在manager中看到刚刚发布的影像服务。
影像发布完成。
四、 基于ArcGISAPI for WPF最短路径分析 最终效果图如下
路径分析服务可以为WPFWEBGIS提供最佳路径的选择功能,用户指定两个点便可以查询出两点之间的最佳路径,同时用户还可以考虑不同的因素来找到最佳的路径,例如设置障碍点,阻抗等。使用路径分析功能时需要使用ArcGIS Api for Wpf中的TouteTask类。同时还需提供网络分析服务中路径分析图层的地址(即上一篇博文中我们发布的网络分析服务中路径服务的地址。其地址的一般格式是: http://<GIS服务器地址>/ArcGIS/rest/services/<网络分析服务名称>/NAServer/Route
实现过程(参考官方教程): /******************C#*************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using ESRI.ArcGIS.Client; using ESRI.ArcGIS.Client.Tasks; namespace demo_RoutingBarriers { public partial class RoutingBarriers : UserControl { RouteTask_routeTask; List<Graphic> _stops = newList<Graphic>(); List<Graphic> _barriers = newList<Graphic>(); RouteParameters_routeParams = new RouteParameters(); GraphicsLayerstopsLayer = null; GraphicsLayerbarriersLayer = null; publicRoutingBarriers() { InitializeComponent(); _routeTask = new RouteTask("http://localhost:6080/arcgis/rest/services/XZNetworkMap/NAServer/RouteLayer1"); _routeTask.SolveCompleted +=routeTask_SolveCompleted; _routeTask.Failed +=routeTask_Failed; _routeParams.Stops = _stops; _routeParams.Barriers = _barriers; _routeParams.UseTimeWindows = false; _routeParams.OutSpatialReference =MyMap.SpatialReference; _routeParams.UseHierarchy = false; barriersLayer = MyMap.Layers["MyBarriersGraphicsLayer"] as GraphicsLayer; stopsLayer = MyMap.Layers["MyStopsGraphicsLayer"] as GraphicsLayer; } privatevoid MyMap_MouseClick(objectsender, ESRI.ArcGIS.Client.Map.MouseEventArgs e) { if(StopsRadioButton.IsChecked.Value) { Graphicstop = new Graphic(){ Geometry = e.MapPoint, Symbol = LayoutRoot.Resources["StopSymbol"]as ESRI.ArcGIS.Client.Symbols.Symbol }; //stop.Attributes.Add("StopNumber",stopsLayer.Graphics.Count + 1); stopsLayer.Graphics.Add(stop); _stops.Add(stop); } elseif (BarriersRadioButton.IsChecked.Value) { Graphicbarrier = new Graphic(){ Geometry = e.MapPoint, Symbol = LayoutRoot.Resources["BarrierSymbol"]as ESRI.ArcGIS.Client.Symbols.Symbol }; barriersLayer.Graphics.Add(barrier); _barriers.Add(barrier); } if(_stops.Count > 1) { if(_routeTask.IsBusy) _routeTask.CancelAsync(); _routeTask.SolveAsync(_routeParams);//*********************错ä¨a误¨® } } privatevoid routeTask_Failed(objectsender, TaskFailedEventArgs e) { string errorMessage = "Routing error: "; errorMessage += e.Error.Message; foreach(string detail in(e.Error as ServiceException).Details) errorMessage += "," + detail; MessageBox.Show(errorMessage); if((_stops.Count) > 10) { stopsLayer.Graphics.RemoveAt(stopsLayer.Graphics.Count - 1); _stops.RemoveAt(_stops.Count -1); } } privatevoid routeTask_SolveCompleted(object sender, RouteEventArgse) { GraphicsLayerrouteLayer = MyMap.Layers["MyRouteGraphicsLayer"]as GraphicsLayer; RouteResultrouteResult = e.RouteResults[0]; routeResult.Route.Symbol =LayoutRoot.Resources["RouteSymbol"]as ESRI.ArcGIS.Client.Symbols.Symbol; routeLayer.Graphics.Clear(); GraphiclastRoute = routeResult.Route; routeLayer.Graphics.Add(lastRoute); } privatevoid Button_Click(objectsender, RoutedEventArgs e) { _stops.Clear(); _barriers.Clear(); foreach(Layer layer inMyMap.Layers) if(layer is GraphicsLayer) (layer as GraphicsLayer).ClearGraphics(); } } } //***********xaml****************// <UserControl x:Class="demo_RoutingBarriers.RoutingBarriers" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" designHeight="300" designWidth="300" xmlns:esri="http://schemas.esri.com/arcgis/client/2009"> <Grid x:Name="LayoutRoot" Background="White"> <Grid.Resources> <ControlTemplate x:Key="CompositeSymbol"> <Grid> <Ellipse Fill="{Binding Symbol.Color}" Width="{Binding Symbol.Size}" Height="{Binding Symbol.Size}" Stroke="Black"StrokeThickness="1" /> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Path=Attributes[StopNumber]}" FontSize="9" Margin="0" FontWeight="Bold" Foreground="Black"/> </Grid> </ControlTemplate> <esri:SimpleMarkerSymbol x:Key="StopSymbol" Size="20" Style="Circle" Color="Salmon" ControlTemplate="{StaticResourceCompositeSymbol}" /> <esri:SimpleMarkerSymbol x:Key="BarrierSymbol" Size="15" Style="Square" Color="Red" /> <esri:SimpleLineSymbol x:Key="RouteSymbol" Color="#990000FF" Width="5"/> <LinearGradientBrush x:Key="anelGradient" EndPoint="0.5,1" StartPoint="0.5,0"> <LinearGradientBrush.RelativeTransform> <TransformGroup> <ScaleTransform CenterY="0.5" CenterX="0.5"/> <SkewTransform CenterY="0.5" CenterX="0.5"/> <RotateTransform Angle="176" CenterY="0.5" CenterX="0.5"/> <TranslateTransform/> </TransformGroup> </LinearGradientBrush.RelativeTransform> <GradientStop Color="#FF145787" Offset="0.16"/> <GradientStop Color="#FF3D7FAC" Offset="0.502"/> <GradientStop Color="#FF88C5EF" Offset="0.984"/> </LinearGradientBrush> </Grid.Resources> <esri:Map x:Name="MyMap" Background="White" Extent="" MouseClick="MyMap_MouseClick"> <esri:Map.Layers> <esri:ArcGISImageServiceLayer Url="
http://localhost:6080/arcgis/rest/services/LSimage/ImageServer"/>
<esri:ArcGISDynamicMapServiceLayer Url="http://localhost:6080/arcgis/rest/services/XZNetworkMap/MapServer"/> <esri:GraphicsLayer ID="MyRouteGraphicsLayer"/> <esri:GraphicsLayer ID="MyStopsGraphicsLayer"/> <esri:GraphicsLayer ID="MyBarriersGraphicsLayer"/> </esri:Map.Layers> </esri:Map> <Grid HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10"> <Rectangle Fill="{StaticResourcePanelGradient}" Stroke="Gray" RadiusX="10" RadiusY="10" Margin="0" > <Rectangle.Effect> <DropShadowEffect/> </Rectangle.Effect> </Rectangle> <StackPanel Orientation="Horizontal" Margin="5"> <RadioButton Content="AddStops" x:Name="StopsRadioButton" IsChecked="true" Foreground="White" GroupName="add" VerticalAlignment="Center"/> <RadioButton Content="AddBarriers" x:Name="BarriersRadioButton" Foreground="White" GroupName="add" VerticalAlignment="Center"/> <Button Content="Clear" Click="Button_Click" Margin="5,0,0,0"/> </StackPanel> </Grid> </Grid> </UserControl>
至此,本案例完成。
|