⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pathfinder.cs

📁 开发的地信系统
💻 CS
📖 第 1 页 / 共 3 页
字号:
                    IPolyline pline = geometry as IPolyline;

                    geoCollection.AddGeometryCollection(pline as IGeometryCollection);
                    eidInfo = enumEIDInfo.Next();
                }
                return _polyLine;
            }
            set
            {
                _enumNetEID_Junctions = null;
                _enumNetID_Edges = null;
                _polyLine = null;

            }
        }

        #endregion

        #region 初始化
        /// <summary>
        /// 打开SDE网络工作空间
        /// </summary>
        /// <param name="featureDatasetName"></param>
        private void OpenSdeNetwork(IPropertySet iPropertySet, string featureDatasetName)
        {
            //IPropertySet iPropertySet = new PropertySetClass();
            //iPropertySet.SetProperty("Server", "10.21.106.123");
            //iPropertySet.SetProperty("Instance", "5151/tcp");
            ////iPropertySet.SetProperty("Database", "");
            //iPropertySet.SetProperty("user", "szgis");
            //iPropertySet.SetProperty("password", "szgis");
            //iPropertySet.SetProperty("version", "sde.DEFAULT");


            IWorkspaceFactory workspaceFactory;
            IWorkspace workspace;
            IFeatureWorkspace featureWorkspace;
            IFeatureDataset featureDataset;
            //Clear every and make a preparation
            CloseWorkspace();

            workspaceFactory = new SdeWorkspaceFactoryClass();
            //Get the workspace
            workspace = workspaceFactory.Open(iPropertySet, 0);
            featureWorkspace = workspace as IFeatureWorkspace;
            try
            {
                featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
                //Initialize network and map
                Debug.Assert(InitializeNetworkAndMap(featureDataset) == true, "打开指定的数据集失败!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        /// <summary>
        /// 打开SDE网络工作空间
        /// </summary>        
        private void OpenAccessNetwork(string fileName,string featureDatasetName)
        {            
            IWorkspaceFactory workspaceFactory;
            IWorkspace workspace;
            IFeatureWorkspace featureWorkspace;
            IFeatureDataset featureDataset;
            //Clear every and make a preparation
            CloseWorkspace();

            workspaceFactory = new AccessWorkspaceFactoryClass();
            //Get the workspace
            workspace = workspaceFactory.OpenFromFile(fileName, 0);
            featureWorkspace = workspace as IFeatureWorkspace;
            try
            {
                featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
                //Initialize network and map
                Debug.Assert(InitializeNetworkAndMap(featureDataset) == true, "打开指定的数据集失败!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        /// <summary>
        /// 初始化用于路径分析的网络和地图
        /// </summary>
        /// <param name="featureDataset"></param>
        /// <returns></returns>
        private bool InitializeNetworkAndMap(IFeatureDataset featureDataset)
        {
            INetworkCollection networkCollection;
            INetwork network;
            IFeatureClassContainer featureClassContainer;
            IFeatureClass featureClass;
            IGeoDataset geoDataset;
            ILayer layer;
            IFeatureLayer featureLayer;
            IEnvelope envelope, maxEnvelope;
            double width, height, searthTool;

            //Get networks
            networkCollection = featureDataset as INetworkCollection;
            int count = networkCollection.GeometricNetworkCount;
            Debug.Assert(count > 0, "No network found");
            _geometricNetwork = networkCollection.get_GeometricNetwork(0);
            if (_geometricNetwork == null)
                return false; ;
            network = _geometricNetwork.Network;
            _netElements = network as INetElements;
            //Add each featureClass as a Map layer
            if (_map.LayerCount == 0 || _map == null)
            {
                if (_map == null)
                    _map = new MapClass();

                featureClassContainer = _geometricNetwork as IFeatureClassContainer;
                count = featureClassContainer.ClassCount;
                Debug.Assert(count > 0);

                for (int i = 0; i < count; i++)
                {
                    featureClass = featureClassContainer.get_Class(i);
                    featureLayer = new FeatureLayerClass();
                    featureLayer.FeatureClass = featureClass;
                    _map.AddLayer(featureLayer);
                }
            }
            count = _map.LayerCount;
            maxEnvelope = new EnvelopeClass();
            for (int i = 0; i < count; i++)
            {
                layer = _map.get_Layer(i);
                featureLayer = layer as IFeatureLayer;
                geoDataset = featureLayer as IGeoDataset;
                envelope = geoDataset.Extent;
                //merge with max dimensions
                maxEnvelope.Union(envelope);
            }

            //设置PointToEID的条件,通过它可以找到鼠标点击处的附近指定范围的点或线对象
            _pointToEID = new PointToEIDClass();
            _pointToEID.SourceMap = _map;
            _pointToEID.GeometricNetwork = _geometricNetwork;

            //set snap tolerance
            width = maxEnvelope.Width;
            height = maxEnvelope.Height;
            if (width > height)
                searthTool = width / 100;
            else
                searthTool = height / 100;

            _pointToEID.SnapTolerance = searthTool;

            //设置EIDHelper
            _eidHelper = new EIDHelperClass();
            _eidHelper.GeometricNetwork = _geometricNetwork;
            ISpatialReference spatialReference = _map.SpatialReference;
            _eidHelper.OutputSpatialReference = spatialReference;
            _eidHelper.ReturnGeometries = true;
            _eidHelper.ReturnFeatures = true;
            return true;

        }

        /// <summary>
        /// 打开新工作空间前的清理工作
        /// </summary>
        private void CloseWorkspace()
        {
            //Clear everything
            _enumNetEID_Junctions = null;
            _enumNetID_Edges = null;
            _geometricNetwork = null;
            _pointToEID = null;
        }

        #endregion

        #region 路径分析
        /// <summary>
        /// 根据之前设置好和条件进行路径分析
        /// </summary>
        public void GetOptimalPath()
        {
            if (junctionFlagList.Count < 2)
                return;
            INetwork network;
            ITraceFlowSolverGEN traceFlowSolver;
            INetSolver netSolver;

            INetWeight netWeight;
            INetSolverWeights netSolverWeights;

            Debug.Assert(_map != null);
            Debug.Assert(_geometricNetwork != null);

            traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
            netSolver = traceFlowSolver as INetSolver;

            //设置不经过路口和道路条件
            junctionFlagUnList.ForEach(delegate(IJunctionFlag jf)
            {
                INetFlag nf = jf as INetFlag;
                _selSetBarriers.Add(nf.UserClassID, nf.UserID);
            });
            edgeFlagUnList.ForEach(delegate(IEdgeFlag ef)
            {
                INetFlag nf = ef as INetFlag;
                _selSetBarriers.Add(nf.UserClassID, nf.UserID);
            });
            netSolver.SelectionSetBarriers = _selSetBarriers;

            // 设置NetSolver和network属性
            network = _geometricNetwork.Network;
            netSolver.SourceNetwork = network;

            IJunctionFlag[] _junctionFlagList;
            //IEdgeFlag[] _edgeFlagList;
            //设置经过路口和道路条件
            _junctionFlagList = junctionFlagList.ToArray();
            //_edgeFlagList = edgeFlagList.ToArray();



            // 添加经过的路口和道路条件
            traceFlowSolver.PutJunctionOrigins(ref _junctionFlagList);
            //traceFlowSolver.PutEdgeOrigins(ref _edgeFlagList);
            // 添加障碍条件


            INetSchema netSchema = network as INetSchema;
            netWeight = netSchema.get_Weight(0);
            Debug.Assert(netWeight != null);
            netSolverWeights = traceFlowSolver as INetSolverWeights;
            netSolverWeights.FromToEdgeWeight = netWeight;
            netSolverWeights.ToFromEdgeWeight = netWeight;

            // initialize array for results to number of segments in result
            //ReDim vaRes(intCount - 1)
            int count = _junctionFlagList.Length - 1;
            object[] segmentCost = new object[count];

            traceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinMax, out _enumNetEID_Junctions, out _enumNetID_Edges, count, ref segmentCost);
            _polyLine = null;
        }
        /// <summary>
        /// 根据点的序列获取相应的最佳路径
        /// </summary>
        /// <param name="pointsList">点的序列,应该为???什么格式的坐标</param>
        public OptimalPath GetOptimalPath(IPoint[] pointsList)
        {
            INetwork network;
            ITraceFlowSolverGEN traceFlowSolver;
            INetSolver netSolver;

            INetWeight netWeight;
            INetSolverWeights netSolverWeights;

            Debug.Assert(_map != null);
            Debug.Assert(_geometricNetwork != null);

            traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
            netSolver = traceFlowSolver as INetSolver;

            List<IJunctionFlag> JFListTemp = new List<IJunctionFlag>();
            for (int i = 0; i < pointsList.Length; i++)
            {
                int UserClassID, UserID, UserSubID;
                int juncEID;
                IPoint foundJunctionPoint;
                this._pointToEID.GetNearestJunction(pointsList[i], out juncEID, out foundJunctionPoint);
                Debug.Assert(juncEID > 0);
                //获得UserClassID,UserID,UserSubID
                this._netElements.QueryIDs(juncEID, esriElementType.esriETJunction, out UserClassID, out UserID, out UserSubID);
                Debug.Assert(UserClassID > 0 && UserID > 0);
                INetFlag netFlag = new JunctionFlagClass();
                netFlag.UserClassID = UserClassID;
                netFlag.UserID = UserID;
                netFlag.UserSubID = UserSubID;

                JFListTemp.Add(netFlag as IJunctionFlag);

            }
            // 设置NetSolver和network属性
            network = _geometricNetwork.Network;
            netSolver.SourceNetwork = network;

            //设置经过路口条件
            IJunctionFlag[] junctionFlagList;
            junctionFlagList = JFListTemp.ToArray();

            // 添加经过的路口条件
            traceFlowSolver.PutJunctionOrigins(ref junctionFlagList);

            //将分析的权值设为道路的长度
            INetSchema netSchema = network as INetSchema;
            netWeight = netSchema.get_Weight(0);
            Debug.Assert(netWeight != null);
            netSolverWeights = traceFlowSolver as INetSolverWeights;
            netSolverWeights.FromToEdgeWeight = netWeight;
            netSolverWeights.ToFromEdgeWeight = netWeight;

            int count = junctionFlagList.Length - 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -