免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1833|回复: 1
收起左侧

[工程技术] 基于ArcGIS API for WPF路径分析源码实例

[复制链接]

8

主题

604

铜板

1

好友

助理工程师

Rank: 5Rank: 5

积分
196
发表于 2015-10-14 17:32 | 显示全部楼层 |阅读模式
说明:
本实例主要演示网络分析数据集制作,服务发布,最后基于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);//*********************错&#228;¨a误¨&#174;
            }
        }
        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>

至此,本案例完成。

1

主题

2万

铜板

22

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1984
发表于 2015-10-15 09:05 | 显示全部楼层
不错的东西 虽然我看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表