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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LINUX 命令 之 zip 解压缩

    LINUX 命令 之 zip 解压缩1.zip命令zip-rmyfile.zip./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件.2.unzip命令unzip-o-d/home/sunnymyfile.zip把myfile.zip文件解压到/home/sunny/-o:不提示的情况下覆盖文件;-d:-d/home/sunny指明将文件解压缩到/…

    2022年6月3日
    30
  • bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法…

    bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法…

    2021年11月8日
    46
  • 北京方言集锦_各地方言大全

    北京方言集锦_各地方言大全A======================================================碍事儿:不方便暗门子:暗娼熬鹰:也做熬大鹰,不得已而彻夜不能睡眠。主要跟当时人喜欢

    2022年8月1日
    8
  • win10 Maven配置环境变量问题

    win10 Maven配置环境变量问题win10配置环境变量相比win7而言出现的问题要多点,不过基本的配置差不多:你可以选择配置JAVA_HOME,也可以选择不配置.但在path里面的位置就很有讲究.我这边是放在第二个.是因为我放在最后一个的时候cmd命令中mvn-v显示不是内部命令,证明没有配置好.不同电脑有不同的位置,可以从第一个开始放,依次往下尝试,就不会有问题.

    2022年7月25日
    10
  • pycharm怎样编写java_Pycharm改进和编写代码[通俗易懂]

    pycharm怎样编写java_Pycharm改进和编写代码[通俗易懂]PyCharm包含用于编写代码的各种标准,其中包含适用于Python的适当缩进。这有助于提高代码标准并在PyCharm编辑器中编写完整的代码。改进代码完成PyCharm中的代码完成非常独特。您可以使用许多其他功能进一步增强它。请注意,编辑器提供了代码块的开始和结束。以下代码编写一个名为demo.py的文件中-message=’GIEWIVrGMTLIVrHIQS’#encrypte…

    2022年8月26日
    10
  • 什么是classpath[通俗易懂]

    什么是classpath[通俗易懂]大纲一、classpath属性作用classpath属性作用在日常的开发中或者初学者中,都是直接使用工具进行Java的开发或学习,如eclipse,idea、myeclipse这类的开发工具,由

    2022年7月3日
    21

发表回复

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

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