ArcGIS二次开发基础教程(11):网络分析之最短路径分析「建议收藏」

ArcGIS二次开发基础教程(11):网络分析之最短路径分析「建议收藏」ArcGIS二次开发基础教程(11):网络分析之最短路径分析最短路径分析这里直接调用了在mdb中建立好的网络数据集//全局变量privateINetworkDatasetmy_networkDataset;//网络数据集privateINAContextmy_NAContexts;//网络分析上下文privateIFeatureClassmy_InputFeatureCla…

大家好,又见面了,我是你们的朋友全栈君。

ArcGIS二次开发基础教程(11):网络分析之最短路径分析

最短路径分析

这里直接调用了在mdb中建立好的网络数据集

//全局变量
private INetworkDataset my_networkDataset;//网络数据集
private INAContext my_NAContexts;//网络分析上下文
private IFeatureClass my_InputFeatureClass;//存储输入点要素类
private IActiveView my_ActiveView;
private IGraphicsContainer my_GraphicsContainer;
bool NetworkAnalysis = false;//分析准备
int count = 0;//节点数目
//网络分析初始化
private void initNetworkAnalysis()
{
    openFileDialog1.Title = "打开网络数据集数据库";
    openFileDialog1.Filter = "Personal GeoDatabase(*.mdb)|*.mdb";
    openFileDialog1.Multiselect = false;
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
   		//打开工作空间
    	IFeatureWorkspace featureWorkspace = my_OpenWorkspace(openFileDialog1.FileName);
    	//打开网络数据集
    	my_networkDataset = my_OpenNetworkDataset(featureWorkspace as IWorkspace,				"NetDataset_ND", "NetDataset");
    	//创建网络分析上下文
      	my_NAContexts = my_CreateSolverContext(my_networkDataset);
        //获取输入点要素类
        my_InputFeatureClass = featureWorkspace.OpenFeatureClass("plan");
        //添加road图层
        IFeatureLayer layer = new FeatureLayerClass();
        IFeatureClass myClass = featureWorkspace.OpenFeatureClass("road");
        layer.FeatureClass = myClass;
        layer.Name = myClass.AliasName;
        axMapControl1.AddLayer(layer);
        //添加NetDatset_ND_Junctions
        myClass = featureWorkspace.OpenFeatureClass("NetDataset_ND_Junctions");
        layer.FeatureClass = myClass;
        layer.Name = myClass.AliasName;
        axMapControl1.AddLayer(layer);
        //添加网络数据集图层
        INetworkLayer netLayer = new NetworkLayerClass();
        netLayer.NetworkDataset = my_networkDataset;
        ILayer my_layer = netLayer as ILayer;
        my_layer.Name = "Network Dataset";
        axMapControl1.AddLayer(my_layer);
        //添加网络分析图层
        INALayer NALayer = my_NAContexts.Solver.CreateLayer(my_NAContexts);
        my_layer = NALayer as ILayer;
        my_layer.Name = my_NAContexts.Solver.DisplayName;
        axMapControl1.AddLayer(my_layer);
        my_ActiveView = axMapControl1.ActiveView;
        my_GraphicsContainer = axMapControl1.ActiveView.FocusMap as IGraphicsContainer;
     }
}

//打开工作空间
private IFeatureWorkspace my_OpenWorkspace(string strMDBName)
{
    IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass();
    IWorkspace workspace = workspaceFactory.OpenFromFile(strMDBName, 0);
    return workspace as IFeatureWorkspace;
}

//打开网络数据集
private INetworkDataset my_OpenNetworkDataset(IWorkspace networkDatasetWorkspace, String networkDatasetName,string featureDatasetName)
{          
    if (networkDatasetWorkspace == null || networkDatasetName == "")
    {
        return null;
    }

    IDatasetContainer3 datasetContainer3 = null;
    // Geodatabase network dataset workspace
    ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = networkDatasetWorkspace as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace; // Dynamic Cast
    ESRI.ArcGIS.Geodatabase.IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
    ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionContainer featureDatasetExtensionContainer = featureDataset as ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionContainer; // Dynamic Cast
    ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtension featureDatasetExtension = featureDatasetExtensionContainer.FindExtension(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset);
    datasetContainer3 = featureDatasetExtension as ESRI.ArcGIS.Geodatabase.IDatasetContainer3; // Dynamic Cast
    if (datasetContainer3 == null)
        return null;
    ESRI.ArcGIS.Geodatabase.IDataset dataset = datasetContainer3.get_DatasetByName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset, networkDatasetName);
    return dataset as ESRI.ArcGIS.Geodatabase.INetworkDataset; // Dynamic Cast    
}

//创建网络分析上下文
private INAContext my_CreateSolverContext(INetworkDataset networkDataset)
{
    IDatasetComponent datasetComponent = networkDataset as IDatasetComponent;
    IDENetworkDataset deNetworkDataset = datasetComponent.DataElement as IDENetworkDataset;
    INASolver naSolver = new NARouteSolver();
    INAContextEdit naContextEdit = naSolver.CreateContext(deNetworkDataset, naSolver.Name) as INAContextEdit;
    naContextEdit.Bind(networkDataset, new GPMessagesClass());
    return naContextEdit as INAContext;
}

private void 网络分析准备()
{
    NetworkAnalysis = true;
    //清除输入点要素
    ITable table = my_InputFeatureClass as ITable;
    table.DeleteSearchedRows(null);
    //清除规划路径
    table = my_NAContexts.NAClasses.get_ItemByName("Routes") as ITable;
    table.DeleteSearchedRows(null);
    //清除Stops
    INAClass naClass = my_NAContexts.NAClasses.get_ItemByName("Stops") as INAClass;
    table = naClass as ITable;
    table.DeleteSearchedRows(null);
    //清除Barriers
    naClass = my_NAContexts.NAClasses.get_ItemByName("Barriers") as INAClass;
    table = naClass as ITable;
    table.DeleteSearchedRows(null);
    my_GraphicsContainer.DeleteAllElements();
    count = 0;
    my_ActiveView.Refresh();
    MessageBox.Show("请选择规划点");
}
private void 添加点(object sender,IMapControlEvents2_OnMouseDownEvent e)
{
    if (NetworkAnalysis == true)
    {
        IPoint pt;
        pt = my_ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
        IFeature feature = my_InputFeatureClass.CreateFeature();
        feature.Shape = pt;
        feature.Store();
        count++;
        ITextElement textElement = new TextElementClass();
        textElement.Text = count.ToString();
        textElement.Symbol = new TextSymbol();
        IElement ele = textElement as IElement;
        ele.Geometry = pt;
        my_GraphicsContainer.AddElement(ele, 0);
        my_ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
     }
}

//加载站点
 private void LoadNetworkLocation(int snapTolerance)
{
     //清除项
     INAClass naClass = my_NAContexts.NAClasses.get_ItemByName("Stops") as INAClass;
     naClass.DeleteAllRows();
     //加载网络分析对象,设置容差值
     INAClassLoader naClassLoader = new NAClassLoaderClass();
     naClassLoader.Locator = my_NAContexts.Locator;
     if (snapTolerance > 0)
         naClassLoader.Locator.SnapTolerance = snapTolerance;
     naClassLoader.NAClass = naClass;
     //加载网络分析类
     int rowsIn = 0;
     int rowsLocated = 0;
     IFeatureCursor cursor = my_InputFeatureClass.Search(null, true);
     naClassLoader.Load((ICursor)cursor, null, ref rowsIn, ref rowsLocated);
     ((INAContextEdit)my_NAContexts).ContextChanged();
}

//最短路径分析
private void 实施分析()
{
    IGPMessages messages = new GPMessagesClass();
    LoadNetworkLocation(80);
    INASolver naSolver = my_NAContexts.Solver;
    naSolver.Solve(my_NAContexts, messages, null);
    //实施后删除输入点
    ITable table = my_InputFeatureClass as ITable;
    table.DeleteSearchedRows(null);
    my_ActiveView.Refresh();
}

历届GIS应用技能大赛开发题答案点这里,尚在不定期更新中

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163416.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月23日 下午6:16
下一篇 2022年7月23日 下午6:36


相关推荐

  • C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解

    C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解最近要做一个大数据dataTable循环操作,开始发现运用foreach,进行大数据循环,并做了一些逻辑处理。在循环中耗费的时间过长。后来换成使用Parallel.ForEach来进行循环。一开始认为, 数据比较大时,Parallel.ForEach肯定比 ForEach效率高,后来发现,其实并不是这样。我用了1000万次循环测试:{CSDN:CODE:2601125}

    2022年7月19日
    25
  • listView1.Items.Add()与 listView1.Items[i].SubItems.Add()区别

    listView1.Items.Add()与 listView1.Items[i].SubItems.Add()区别listView1.Items是ListViewItem的集合打开资源管理器,看看windows目录,使用Details方式,一个ListViewItem就是一行,比如目录名称,修改时间,类型,大小,这整个一条记录是一个ListViewItem而listView1.Items[i].SubItems是ListViewSubItem的集合比如刚才的目录名称或

    2022年7月26日
    7
  • 数据结构导论第一遍重要吗_数据结构导论自考2018

    数据结构导论第一遍重要吗_数据结构导论自考2018根据以前的经验发现,看一本书,如果一天看一点,一天看一点,到最后也就看了一点点,所以这些天我决定吃个大力丸把《数据结构导论》这本书看完。      我很少能这样看完这样的一本厚厚的书的,如果是以前,可能得连续看半个月以上呢,就是不知道效果怎样而已,这个先不管,毕竟这些天也挺难熬的,大家都知道看书会困的嘛!所以睡不着的时候,床前备一本书,有备无患。这样,你会看到有些人的书上留了很多哈喇子的印记

    2022年8月18日
    10
  • 2016.1云南之旅

    2016.1云南之旅1 11 到大理前一天 12 点睡觉 早上四点多就被闹钟吵醒和顺风车的电话声吵醒了 从杭州的萧山机场终于飞到了丽江的三义机场 直接坐上机场大巴到丽江古城附近 在丽江饭店里面点了一份水煮肉片 做法很特殊 竟然是最后把油给热了然后放到水煮肉片里面 米饭很稀疏 很好吃 下午从丽江坐火车过来 经过两个多小时的折腾和隧道穿越 终于到达了大理 经过一路公交车的折腾 来到了心目中的小窝客栈 老

    2026年3月17日
    2
  • navicat永久激活码最新[最新免费获取]

    (navicat永久激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSW…

    2022年3月26日
    301
  • PyCharm的搜索/替换快捷键[通俗易懂]

    PyCharm的搜索/替换快捷键[通俗易懂]查找:Ctrl+F替换:Ctrl+R查找是Find,替换是Replace。

    2022年5月18日
    274

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号