ArcEngine实现几何网络分析

            axMapControl1.ActiveView.Clear();
            axMapControl1.ActiveView.Refresh();
            //获取当前应用程序的目录的名称
            //string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            //path = path.Remove(path.Length - 5, 5);
            //string name = path + "NetworkAnalyst.gdb";
            string path = @"E:/大学/ARCGIS二次开发/荆州市数据资料/";   //修改自己的文件名
            string name = path + "荆州市.gdb";      //添加文件地理数据库
            //打开工作空间
            pFWorkspace = OpenWorkspace(name) as IFeatureWorkspace;
            //打开网络数据集
            networkDataset = OpenNetworkDataset(pFWorkspace as IWorkspace, "net_ND", "net");     //添加网络数据集以及要素集
            //创建网络分析上下文,建立一种解决关系
            m_NAContext = CreateSolverContext(networkDataset);
            //打开数据集
            inputFClass = pFWorkspace.OpenFeatureClass("stops");      添加stops要素
            //Test_ND_junctions图层
            IFeatureLayer vertex = new FeatureLayerClass();
            vertex.FeatureClass = pFWorkspace.OpenFeatureClass("net_ND_junctions");     //图层名称
            vertex.Name = vertex.FeatureClass.AliasName;
            axMapControl1.AddLayer(vertex, 0);
            //street图层
            IFeatureLayer road3 = new FeatureLayerClass();
            road3.FeatureClass = pFWorkspace.OpenFeatureClass("netway");
            road3.Name = road3.FeatureClass.AliasName;
            axMapControl1.AddLayer(road3, 0);
            //为Network Dataset生成一个图层,并将该图层添加到axMapCon1中
            ILayer layer;    //网络图层
            INetworkLayer networkLayer = new NetworkLayerClass();
            networkLayer.NetworkDataset = networkDataset;
            layer = networkLayer as ILayer;
            layer.Name = "Network Dataset";
            axMapControl1.AddLayer(layer, 0);
            //生成一个网络分析图层并添加到axMapControl1中
            INALayer naLayer = m_NAContext.Solver.CreateLayer(m_NAContext);
            ILayer 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;

//定义变量
        INAContext m_NAContext;              //网络分析上下文
        IFeatureWorkspace pFWorkspace;       
        INetworkDataset networkDataset;      //网络数据集
        IFeatureClass inputFClass;           //打开stops数据集
        IFeatureDataset featureDataset;
        bool networkanalasia = false;        //判断是否点击netRoute按钮,进入添加旗点阶段
        int clickedcount = 0;                //mapcontrol上加点时显示点数
        IActiveView m_ipActiveView;
        IGraphicsContainer pGC;
        IMap m_ipMap;
        
        //打开工作空间
        public IWorkspace OpenWorkspace(string strGDBName)
        {
            IWorkspaceFactory 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 = featureDatasetExtension 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 = new NARouteSolver();
            INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;
            contextEdit.Bind(networkDataset, new GPMessagesClass());
            return contextEdit as INAContext;
        }

//得到创建网络分析上下文所需的IDENetworkDataset类型参数
        public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)
        {
            //将网络数据集QI到DatasetComponent
            IDatasetComponent dsComponent = networkDataset as IDatasetComponent;
            return dsComponent.DataElement as IDENetworkDataset;
        }
        
        //清理已经存在的网络分析上下文于生成的路径,并进入到下一次添加标注点工作状态
        private void NewRoute_Click(object sender, EventArgs e)
        {
            networkanalasia = true;
            axMapControl1.CurrentTool = null;
            ITable pTable = inputFClass as ITable;
            pTable.DeleteSearchedRows(null);
            //提取路径前,删除上一次路径Routes网络上下文
            IFeatureClass 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 = routesFC as ITable;
            pTable2.DeleteSearchedRows(null);
            //提取路径前,删除上一次路径Barriers网络上下文
            INAClass barriersNAClass = m_NAContext.NAClasses.get_ItemByName("Barriers") as INAClass;
            ITable pTable3 = routesFC as ITable;
            pTable3.DeleteSearchedRows(null);
            pGC.DeleteAllElements();
            clickedcount = 0;
            axMapControl1.Refresh();
        }
        
         //生成最短路径
        private void Solve_Click(object sender, EventArgs e)
        {
            IGPMessages gpMessages = new GPMessagesClass();
            LoadNANetworkLocations("Stops", inputFClass, 80);
            INASolver naSolver = m_NAContext.Solver;
            naSolver.Solve(m_NAContext, gpMessages, null);
            //解决完后,删除图层内容
            ITable pTable_inputFClass = inputFClass as ITable;
            pTable_inputFClass.DeleteSearchedRows(null);
            axMapControl1.Refresh();
            }
            
            //根据点图层,在网络拓扑图层上确定用户要查找最优路径所用经历的点
        private void LoadNANetworkLocations(string strNAClassName, IFeatureClass inputFC, double snapTolerance)
        {
            INamedSet classes = m_NAContext.NAClasses;
            INAClass naClass = classes.get_ItemByName(strNAClassName) as INAClass;
            //删除naClass中添加的项
            naClass.DeleteAllRows();
            //加载网络分析对象,设置容差值
            INAClassLoader classLoader = new NAClassLoader();
            classLoader.Locator = m_NAContext.Locator;
            if (snapTolerance > 0)
                classLoader.Locator.SnapTolerance = snapTolerance;
            classLoader.NAClass = naClass;
            //创建INAClassFiledMap,用于字段映射
            INAClassFieldMap fieldMap = new NAClassFieldMap();
            fieldMap.set_MappedField("ObjectID", "OBJECTID");
            classLoader.FieldMap = fieldMap;
            //加载网络分析类
            int rowsIn = 0;
            int rowsLocated = 0;
            IFeatureCursor featureCursor = inputFC.Search(null, true);
            classLoader.Load((ICursor)featureCursor, null, ref rowsIn, ref rowsLocated);
            ((INAContextEdit)m_NAContext).ContextChanged();
        }
        
        private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            if (networkanalasia == true)
            {
                IPointCollection m_ipPoints = new MultipointClass();       //输入点集合
                IPoint 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);     //获鼠标点击最近点
                //把得到的最近点显示出来
                ITextElement textlement = new TextElementClass();
                IElement element = textlement as IElement;
                ITextSymbol textSymbol = new TextSymbol();
                textSymbol.Color = GetRGB(189, 190, 0);
                textSymbol.Size = 30;
                textlement.Symbol = textSymbol;
                clickedcount++;
                textlement.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);
            }
        }
        
        private IRgbColor GetRGB(int r, int g, int b)
        {
            IRgbColor pColor = new RgbColorClass();
            pColor.Red = r;
            pColor.Green = g;
            pColor.Blue = b;
            return pColor;
        }
        
        //获取距离鼠标点击最近的点
        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();
            }
        }

在实现网络分析之前,一定要先在arcmap中创建要素集,网络要素集,可以现在arcmap实现网络分析,因为我第一次是分析的时候就是直接用代码写的,然后一直报错误,最后发现是我自己矢量化有问题。所以先在arcmap中实现网络分析比较好。在调试过程中,可能会遇到没有许可证的问题,这个问题只需要在License控件中勾选Network Analyst就可以了。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值