ArcEngine開發--網絡分析

在現實生活中gis者開發的時候難免需要用到網絡分析的功能,爲了更好節省時間,加快開發的效率。故在此共享當時AE開發所用的網絡分析的源碼。願對你有所幫助。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Catalog;
using ESRI.ArcGIS.CatalogUI;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.NetworkAnalysis;
using ESRI.ArcGIS.NetworkAnalyst;
using ESRI.ArcGIS.Display;
using System.IO;

namespace exp
{
    public partial class network : Form
    {
        private INAContext m_NAContext;//網絡分析上下文
        private INetworkDataset networkDataset;//網絡數據集
        private IFeatureWorkspace pFWorkspace;
        private IFeatureClass inputFClass;//打開stops數據集
        private IFeatureDataset featureDataset;
        private bool networkanalasia = false;//判斷是否點擊新路線按鈕,進入添加起點階段
        private int clickedcount = 0;//mapcontrol加點顯示點數
        private IActiveView m_ipActiveView;
        private IGraphicsContainer PGC;
        private IMap m_ipMap;
        public network()
        {
            InitializeComponent();
        }


        private void initialize()
        {
            axMapControl1.ActiveView.Clear();
            axMapControl1.ActiveView.Refresh();
            //獲取當前應用程序的目錄名稱
            string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            int t;
            for (t = 0; t < path.Length; t++)
            {
                if (path.Substring(t, 14) == "NetworkAnalasis")
                {
                    break;
                }
            }
            //根據目錄名稱獲取數據存取路徑
            string name = path.Substring(0, t - 1) + "\\TestData\\Test.gdb";
            //打開工作空間
            pFWorkspace = OpenWorkspace(name) as IFeatureWorkspace;
            //打開網絡數據集
            networkDataset = OpenNetworkDataset(pFWorkspace as IWorkspace, "street_ND", "test");
            //創建網絡分析上下文,建立一種解決關係
            m_NAContext = CreateSolverContext(networkDataset);
            //打開數據集
            inputFClass = pFWorkspace.OpenFeatureClass("stops");
            //TEST_ND_JUNCTIONS圖層
            IFeatureLayer vertex = new FeatureLayerClass();
            vertex.FeatureClass = pFWorkspace.OpenFeatureClass("Test_ND_Junctions");
            vertex.Name = vertex.FeatureClass.AliasName;
            axMapControl1.AddLayer(vertex,0);
            //street圖層
            IFeatureLayer road3;
            road3 = new FeatureLayerClass();
            road3.FeatureClass = pFWorkspace.OpenFeatureClass("street");
            road3.Name = road3.FeatureClass.AliasName;
            axMapControl1.AddLayer(road3, 0);
            //爲networkdataset生成一個圖層,並將該圖層添加到axmapcontrol中
            ILayer pLayer;//網絡圖層
            INetworkLayer pNetworkLayer;
            pNetworkLayer = new NetworkLayerClass();
            pNetworkLayer.NetworkDataset = networkDataset;
            pLayer = pNetworkLayer as ILayer;
            pLayer.Name = "Network Dataset";
            axMapControl1.AddLayer(pLayer, 0);
            //生成一個網絡分析圖層並添加到axmaptrol1中
            ILayer layer1;
            INALayer nalayer = m_NAContext.Solver.CreateLayer(m_NAContext);
            layer1 = nalayer as ILayer;
            layer1.Name = m_NAContext.Solver.DisplayName;
            axMapControl1.AddLayer(layer1, 0);
            m_ipActiveView = axMapControl1.ActiveView;
            m_ipMap = m_ipActiveView.FocusMap;
            PGC = m_ipMap as IGraphicsContainer;
        }
        //打開工作空間
        public IWorkspace OpenWorkspace(string strGDBName)
        {
            IWorkspaceFactory workspaceFactory;
            workspaceFactory = new FileGDBWorkspaceFactoryClass();
            return workspaceFactory.OpenFromFile(strGDBName, 0);
        }
        //打開網絡數據集
        public INetworkDataset OpenNetworkDataset(IWorkspace networkDatasetWorkspace, System.String networkDatasetName, System.String featureDatasetName)
        {
            if (networkDatasetWorkspace == null || networkDatasetName == "" || featureDatasetName == null)
            {
                return null;
            }
            IDatasetContainer3 datasetContainer3 = null;
            IFeatureWorkspace featureWorkspace = networkDatasetWorkspace as IFeatureWorkspace;
            featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
            IFeatureDatasetExtensionContainer featureDatasetExtensionContainer = featureDataset as IFeatureDatasetExtensionContainer;
            IFeatureDatasetExtension featureDatasetExtension = featureDatasetExtensionContainer.FindExtension(esriDatasetType.esriDTNetworkDataset);
            datasetContainer3 = featureDatasetExtensionContainer as IDatasetContainer3;
            if (datasetContainer3 == null)

                return null;
                IDataset dataset = datasetContainer3.get_DatasetByName(esriDatasetType.esriDTNetworkDataset, networkDatasetName);
                return dataset as INetworkDataset;

        }
        //創建網絡分析上下文
        public INAContext CreateSolverContext(INetworkDataset networkDataset)
        {
            //獲取創建網絡分析上下文所需的IDENETWORKDATASET類型參數
            IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);
            INASolver naSolver;
            naSolver = new NARouteSolver();
            INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;
            contextEdit.Bind(networkDataset, new GPMessagesClass());
            return contextEdit as INAContext;
            return contextEdit as INAContext;
        }
        //得到創建網絡分析上下文所需的IDENETWORKDATASET類型參數
        public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)
        {
            //將網絡分析數據集QI添加到DATASETCOMPOENT
            IDatasetComponent dstComponent;
            dstComponent = networkDataset as IDatasetComponent;
            //獲得數據元素
            return dstComponent.DataElement as IDENetworkDataset;

        }


        private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            if (networkanalasia == true)
            {
                IPointCollection m_ipPoints;//輸入點集合
                IPoint ipNew;
                m_ipPoints = new MultipointClass();
                ipNew = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
                object o = Type.Missing;
                m_ipPoints.AddPoint(ipNew, ref o, ref o);
                 CreateFeature(inputFClass, m_ipPoints);//或者用鼠標點擊最近點
                //把最近的點顯示出來
                IElement element;
                ITextElement textelement = new TextElementClass();
                element = textelement as IElement;
                ITextSymbol textSymbol = new TextSymbol();

                textelement.Symbol = textSymbol;
                clickedcount++;
                textelement.Text = clickedcount.ToString();
                element.Geometry = m_ipActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
                PGC.AddElement(element, 0);
                m_ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
            }
        }
        //獲取距離鼠標點擊最近的點
        public void CreateFeature(IFeatureClass featureClass, IPointCollection PointCollection)
        {
            //是否爲點圖層
            if (featureClass.ShapeType != esriGeometryType.esriGeometryPoint)
            {
                return;
            }
            //創建點要素
            for (int i = 0; i < PointCollection.PointCount; i++)
            {
                IFeature feature = featureClass.CreateFeature();
                feature.Shape = PointCollection.get_Point(i);
                IRowSubtypes rowSubtypes = (IRowSubtypes)feature;
                feature.Store();
            }
        }
        private void axMapControl1_OnDoubleClick(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnDoubleClickEvent e)
        {


        }

        private void toolStripSplitButton1_ButtonClick(object sender, EventArgs e)
        {
            networkanalasia = true;
            axMapControl1.CurrentTool = null;
            ITable pTable = inputFClass as ITable;
            pTable.DeleteSearchedRows(null);
            //提取路徑前,刪除上一次路徑route網絡上下文
            IFeatureClass routesFC;
            routesFC=m_NAContext.NAClasses.get_ItemByName("Routes") as IFeatureClass;
            ITable pTable1 = routesFC as ITable;
            pTable1.DeleteSearchedRows(null);
            //提取路徑前,刪除上一次路徑Stops網絡上下文
            INAClass stopsNAClass = m_NAContext.NAClasses.get_ItemByName("Stops") as INAClass;
            ITable ptable2=stopsNAClass as ITable;
            ptable2.DeleteSearchedRows(null);
            //提取路徑前,刪除上一次barries網絡上下文
            INAClass barriesNAClass = m_NAContext.NAClasses.get_ItemByName("Barriers") as INAClass;
            ITable pTable3 = barriesNAClass as ITable;
            pTable3.DeleteSearchedRows(null);
            //提取路徑前,刪除上次路徑polyline
            IFeatureClass getroute = pFWorkspace.OpenFeatureClass("get_route");
            ITable ptable_polyline = getroute as ITable;
            ptable_polyline.DeleteSearchedRows(null);
            PGC.DeleteAllElements();
            clickedcount = 0;
            axMapControl1.Refresh();
        }

        private void toolStripSplitButton2_ButtonClick(object sender, EventArgs e)
        {
            IGPMessages gpMessages = new GPMessagesClass();
            loadNANetworkLocations("Stops", inputFClass, 80);
            INASolver naSlover = m_NAContext.Solver;
            naSlover.Solve(m_NAContext, gpMessages, null);
            //解決完後,刪除圖層內容
            ITable pTable_inputFClass = inputFClass as ITable;
            pTable_inputFClass.DeleteSearchedRows(null);
            axMapControl1.Refresh();

        }
        public void loadNANetworkLocations(string strNAClassName,IFeatureClass inputFC,double snapTolerance)
        {
            INAClass naClass;
            INamedSet classes;
            classes =m_NAContext.NAClasses;
            naClass=classes.get_ItemByName(strNAClassName) as INAClass;
            //刪除naClasses中添加的項
            naClass.DeleteAllRows();
            //加載網絡分析對象,設置容差值
            INAClassLoader classLoader=new NAClassLoader();
            classLoader.Locator=m_NAContext.Locator;
            if (snapTolerance>0)classLoader.Locator.SnapTolerance=snapTolerance;
            classLoader.NAClass=naClass;
            //創建INAclassFieldMap,用於字段映射
            INAClassFieldMap fieldMap;
            fieldMap=new NAClassFieldMap();
            //加載網絡分析類
            int rowsln=0;
            int rowsLocated=0;
            IFeatureCursor featureCursor=inputFC.Search(null,true);
            classLoader.Load((ICursor)featureCursor,null,ref rowsln,ref rowsLocated);
            ((INAContextEdit)m_NAContext).ContextChanged();
        }



    }
}

說明:源碼來源於某本書,但是我不太記得某本書的名字了。代碼是自己手打的,如果有錯誤請進行糾正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章