Пример #1
0
        /// <summary>
        /// 连通判断
        /// </summary>
        /// <param name="PipeConIdFlag">需要判断的ID</param>
        public void ConenectJudge(int PipeConIdFlag)
        {
            #region 找出上下游弧段 管点,并赋值给数组
            DatasetVector network = mConNetWorkName;
            try
            {
                //设置分析环境
                FacilityAnalystSetting3D facilityAnalystSetting = new FacilityAnalystSetting3D();
                facilityAnalystSetting.NetworkDataset = network;
                facilityAnalystSetting.EdgeIDField    = "SMEDGEID";
                facilityAnalystSetting.NodeIDField    = "SMNODEID";
                facilityAnalystSetting.FNodeIDField   = "SMFNODE";
                facilityAnalystSetting.TNodeIDField   = "SMTNODE";
                facilityAnalystSetting.Tolerance      = 0.001;


                //权字段信息设置
                WeightFieldInfo3D weightFieldInfo = new WeightFieldInfo3D();
                weightFieldInfo.Name          = "Length";
                weightFieldInfo.FTWeightField = "SMLENGTH";
                weightFieldInfo.TFWeightField = "SMLENGTH";
                WeightFieldInfos3D weightFieldInfos = new WeightFieldInfos3D();
                weightFieldInfos.Add(weightFieldInfo);
                facilityAnalystSetting.WeightFieldInfos = weightFieldInfos;


                FacilityAnalyst3D mfacilityAnalyst = new FacilityAnalyst3D();
                mfacilityAnalyst.AnalystSetting = facilityAnalystSetting;

                bool isLoad = mfacilityAnalyst.Load();//是否加载模型
                if (isLoad)
                {
                    if (recordsetTypeConId1 == GeometryType.GeoPoint3D)//以点查找上下游弧段
                    {
                        //根据点查上游
                        FacilityAnalystResult3D TraceUpFromNode = mfacilityAnalyst.TraceUpFromNode(PipeConIdFlag, "Length", true);
                        {
                            //判断是否为空 若为空则实例化,避免在删除时候出错
                            if (TraceUpFromNode != null)
                            {
                                mConnectUpEdges = new Int32[TraceUpFromNode.Edges.Length];
                                for (int i = 0; i < TraceUpFromNode.Edges.Length; i++)
                                {
                                    mConnectUpEdges[i] = TraceUpFromNode.Edges[i];
                                }
                            }
                            else
                            {
                                mConnectUpEdges = new Int32[1];
                            }
                        }


                        {
                            if (TraceUpFromNode != null)
                            {
                                mConnectUpNodes = new Int32[TraceUpFromNode.Nodes.Length];
                                for (int i = 0; i < TraceUpFromNode.Nodes.Length; i++)
                                {
                                    mConnectUpNodes[i] = TraceUpFromNode.Nodes[i];
                                }
                            }
                            else
                            {
                                mConnectUpNodes = new Int32[1];
                            }
                        }
                        //根据结点查下游
                        FacilityAnalystResult3D TraceDownFromNode = mfacilityAnalyst.TraceDownFromNode(PipeConIdFlag, "Length", true);
                        {
                            if (TraceDownFromNode != null)
                            {
                                mConnectDownEdges = new Int32[TraceDownFromNode.Edges.Length];
                                for (int i = 0; i < TraceDownFromNode.Edges.Length; i++)
                                {
                                    mConnectDownEdges[i] = TraceDownFromNode.Edges[i];
                                }
                            }
                            else
                            {
                                mConnectDownEdges = new Int32[1];
                            }
                        }

                        {
                            if (TraceDownFromNode != null)
                            {
                                mConnectDownNodes = new Int32[TraceDownFromNode.Nodes.Length];
                                for (int i = 0; i < TraceDownFromNode.Nodes.Length; i++)
                                {
                                    mConnectDownNodes[i] = TraceDownFromNode.Nodes[i];
                                }
                            }
                            else
                            {
                                mConnectDownNodes = new Int32[1];
                            }
                        }
                    }
                    else if (recordsetTypeConId1 == GeometryType.GeoLine3D)//以弧段查找弧段
                    {
                        //以弧段查找上游
                        FacilityAnalystResult3D TraceUpFromEdge = mfacilityAnalyst.TraceUpFromEdge(PipeConIdFlag, "Length", true);
                        {
                            if (TraceUpFromEdge != null)
                            {
                                mConnectUpEdges = new Int32[TraceUpFromEdge.Edges.Length];
                                for (int i = 0; i < TraceUpFromEdge.Edges.Length; i++)
                                {
                                    mConnectUpEdges[i] = TraceUpFromEdge.Edges[i];
                                }
                            }
                            else
                            {
                                mConnectUpEdges = new Int32[1];
                            }
                        }
                        {
                            if (TraceUpFromEdge != null)
                            {
                                mConnectUpNodes = new Int32[TraceUpFromEdge.Nodes.Length];
                                for (int i = 0; i < TraceUpFromEdge.Nodes.Length; i++)
                                {
                                    mConnectUpNodes[i] = TraceUpFromEdge.Nodes[i];
                                }
                            }
                            else
                            {
                                mConnectUpNodes = new Int32[1];
                            }
                        }
                        //根据弧段查下游
                        FacilityAnalystResult3D TraceDownFromEdge = mfacilityAnalyst.TraceDownFromEdge(PipeConIdFlag, "Length", true);
                        {
                            if (TraceDownFromEdge != null)
                            {
                                mConnectDownEdges = new Int32[TraceDownFromEdge.Edges.Length];
                                for (int i = 0; i < TraceDownFromEdge.Edges.Length; i++)
                                {
                                    mConnectDownEdges[i] = TraceDownFromEdge.Edges[i];
                                }
                            }
                            else
                            {
                                mConnectDownEdges = new Int32[1];
                            }
                        }
                        {
                            if (TraceDownFromEdge != null)
                            {
                                mConnectDownNodes = new Int32[TraceDownFromEdge.Nodes.Length];
                                for (int i = 0; i < TraceDownFromEdge.Nodes.Length; i++)
                                {
                                    mConnectDownNodes[i] = TraceDownFromEdge.Nodes[i];
                                }
                            }
                            else
                            {
                                mConnectDownNodes = new Int32[1];
                            }
                        }
                    }
                }

                #endregion

                #region 遍历上下游数组,寻找是否连通
                //若为线,遍历上下游弧段 若为点,遍历上下游管点

                if (recordsetTypeConId1 == GeometryType.GeoLine3D)
                {
                    //第一次遍历时,进入前mConnectFlag=0,进入后若mConnectFlag=0,则进入下一个判断,若=1,说明连通 不在进行判断
                    //遍历上游弧段
                    for (int i = 0; i < mConnectUpEdges.Length; i++)
                    {
                        if (mConnectUpEdges[i] == mPipeConId2)
                        {
                            mConnectFlag = 1;
                            break;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    if (mConnectFlag != 1)
                    {
                        //遍历下游弧段
                        for (int i = 0; i < mConnectDownEdges.Length; i++)
                        {
                            if (mConnectDownEdges[i] == mPipeConId2)
                            {
                                mConnectFlag = 1;
                                break;
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }
                }
                if (recordsetTypeConId1 == GeometryType.GeoPoint3D)
                {
                    if (mConnectFlag != 1)
                    {
                        //遍历上游管点
                        for (int i = 0; i < mConnectUpNodes.Length; i++)
                        {
                            if (mConnectUpNodes[i] == mPipeConId2)
                            {
                                mConnectFlag = 1;
                                break;
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }
                    if (mConnectFlag != 1)
                    {
                        //遍历下游管点
                        for (int i = 0; i < mConnectDownNodes.Length; i++)
                        {
                            if (mConnectDownNodes[i] == mPipeConId2)
                            {
                                mConnectFlag = 1;
                                break;
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }
                }

                #endregion
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex);
            }
        }
Пример #2
0
        /// <summary>
        /// 寻找源/汇/上游/下游
        /// </summary>
        /// <param name="SeachFlag"></param>
        public void FindSourceAndSink(string SeachFlag)
        {
            try
            {
                //三维网络信息设置
                FacilityAnalystSetting3D facilityAnalystSetting = new FacilityAnalystSetting3D();
                facilityAnalystSetting.NetworkDataset = network;
                // facilityAnalystSetting.DirectionField = "direction";
                facilityAnalystSetting.EdgeIDField  = "SMEDGEID";
                facilityAnalystSetting.NodeIDField  = "SMNODEID";
                facilityAnalystSetting.FNodeIDField = "SMFNODE";
                facilityAnalystSetting.TNodeIDField = "SMTNODE";
                facilityAnalystSetting.Tolerance    = 0.001;


                //权字段信息设置
                WeightFieldInfo3D weightFieldInfo = new WeightFieldInfo3D();
                weightFieldInfo.Name          = "Length";
                weightFieldInfo.FTWeightField = "SMLENGTH";
                weightFieldInfo.TFWeightField = "SMLENGTH";
                WeightFieldInfos3D weightFieldInfos = new WeightFieldInfos3D();
                weightFieldInfos.Add(weightFieldInfo);
                facilityAnalystSetting.WeightFieldInfos = weightFieldInfos;


                mfacilityAnalyst = new FacilityAnalyst3D();
                mfacilityAnalyst.AnalystSetting = facilityAnalystSetting;

                bool isLoad = mfacilityAnalyst.Load();//是否加载模型
                if (isLoad)
                {
                    switch (SeachFlag)
                    {
                    case "Line":
                        #region 根据弧段查找
                        //根据弧段查找汇
                        FacilityAnalystResult3D resultSinkFromEdges = mfacilityAnalyst.FindSinkFromEdge(mPipeId1, "Length", true);
                        //汇弧段ID数组
                        {
                            if (resultSinkFromEdges != null)
                            {
                                mSinkFromNodeCost = resultSinkFromEdges.Cost;
                                mSinkEdges        = new Int32[resultSinkFromEdges.Edges.Length];
                                for (int i = 0; i < resultSinkFromEdges.Edges.Length; i++)
                                {
                                    mSinkEdges[i] = resultSinkFromEdges.Edges[i];
                                }
                                //汇结点ID
                                for (int i = 0; i < resultSinkFromEdges.Nodes.Length; i++)
                                {
                                    if (i == resultSinkFromEdges.Nodes.Length - 1)
                                    {
                                        mSinkNode = resultSinkFromEdges.Nodes[i];
                                    }
                                }
                            }
                            else
                            {
                                mSinkEdges = new Int32[1]; mSinkFromNodeCost = 0;
                            }
                        }

                        //根据弧段查找源
                        FacilityAnalystResult3D resultSourceFromEdges = mfacilityAnalyst.FindSourceFromEdge(mPipeId1, "Length", true);


                        //源弧段ID数组
                        {
                            if (resultSourceFromEdges != null)
                            {
                                mSourceFromNodeCost = resultSourceFromEdges.Cost;
                                mSourceEdges        = new Int32[resultSourceFromEdges.Edges.Length];
                                for (int i = 0; i < resultSourceFromEdges.Edges.Length; i++)
                                {
                                    mSourceEdges[i] = resultSourceFromEdges.Edges[i];
                                }
                                //源节点ID
                                for (int i = 0; i < resultSourceFromEdges.Nodes.Length; i++)
                                {
                                    if (i == resultSourceFromEdges.Nodes.Length - 1)
                                    {
                                        mSourceNode = resultSourceFromEdges.Nodes[i];
                                    }
                                }
                            }
                            else
                            {
                                mSourceEdges = new Int32[1]; mSourceFromNodeCost = 0;
                            }
                        }



                        //根据弧段查上游
                        FacilityAnalystResult3D TraceUpFromEdges = mfacilityAnalyst.TraceUpFromEdge(mPipeId1, "Length", true);
                        {
                            if (TraceUpFromEdges != null)
                            {
                                mTraceUpEdges = new Int32[TraceUpFromEdges.Edges.Length];
                                for (int i = 0; i < TraceUpFromEdges.Edges.Length; i++)
                                {
                                    mTraceUpEdges[i] = TraceUpFromEdges.Edges[i];
                                }
                            }
                            else
                            {
                                mTraceUpEdges = new Int32[1];
                            }
                        }

                        //根据弧段查下游
                        FacilityAnalystResult3D TraceDownFromEdges = mfacilityAnalyst.TraceDownFromEdge(mPipeId1, "Length", true);
                        {
                            if (TraceDownFromEdges != null)
                            {
                                mTraceDownEdges = new Int32[TraceDownFromEdges.Edges.Length];
                                for (int i = 0; i < TraceDownFromEdges.Edges.Length; i++)
                                {
                                    mTraceDownEdges[i] = TraceDownFromEdges.Edges[i];
                                }
                            }
                            else
                            {
                                mTraceDownEdges = new Int32[1];
                            }
                        }

                        #endregion
                        break;

                    case "Node":
                        #region 根据结点查找
                        //根据结点查找汇
                        FacilityAnalystResult3D resultSinkFromNode = mfacilityAnalyst.FindSinkFromNode(mPipeId1, "Length", true);


                        //汇弧段ID数组
                        {
                            if (resultSinkFromNode != null)
                            {
                                mSinkFromNodeCost = resultSinkFromNode.Cost;
                                mSinkEdges        = new Int32[resultSinkFromNode.Edges.Length];
                                for (int i = 0; i < resultSinkFromNode.Edges.Length; i++)
                                {
                                    mSinkEdges[i] = resultSinkFromNode.Edges[i];
                                }
                            }
                            else
                            {
                                mSinkEdges = new Int32[1]; mSinkFromNodeCost = 0;
                            }
                        }

                        //汇结点数组
                        {
                            if (resultSinkFromNode != null)
                            {
                                Int32[] SinkNodes = new Int32[resultSinkFromNode.Nodes.Length];
                                for (int i = 0; i < resultSinkFromNode.Nodes.Length; i++)
                                {
                                    SinkNodes[i] = resultSinkFromNode.Nodes[i];
                                    if (i == resultSinkFromNode.Nodes.Length - 1)
                                    {
                                        mSinkNode = resultSinkFromNode.Nodes[i];
                                    }
                                }
                            }
                            else
                            {
                                Int32[] SinkNodes = new Int32[1];
                            }
                        }


                        //根据结点查找源
                        FacilityAnalystResult3D resultSourceFromNode = mfacilityAnalyst.FindSourceFromNode(mPipeId1, "Length", true);


                        //源弧段ID数组
                        {
                            if (resultSourceFromNode != null)
                            {
                                mSourceFromNodeCost = resultSourceFromNode.Cost;
                                mSourceEdges        = new Int32[resultSourceFromNode.Edges.Length];
                                for (int i = 0; i < resultSourceFromNode.Edges.Length; i++)
                                {
                                    mSourceEdges[i] = resultSourceFromNode.Edges[i];
                                }
                            }
                            else
                            {
                                mSourceEdges = new Int32[1]; mSourceFromNodeCost = 0;
                            }
                        }

                        //源节点ID数组
                        if (resultSourceFromNode != null)
                        {
                            Int32[] SourceNodes = new Int32[resultSourceFromNode.Nodes.Length];
                            for (int i = 0; i < resultSourceFromNode.Nodes.Length; i++)
                            {
                                SourceNodes[i] = resultSourceFromNode.Nodes[i];
                                if (i == resultSourceFromNode.Nodes.Length - 1)
                                {
                                    mSourceNode = resultSourceFromNode.Nodes[i];
                                }
                            }
                        }
                        else
                        {
                            Int32[] SourceNodes = new Int32[1];
                        }



                        //根据结点查上游
                        FacilityAnalystResult3D TraceUpFromNode = mfacilityAnalyst.TraceUpFromNode(mPipeId1, "Length", true);
                        {
                            if (TraceUpFromNode != null)
                            {
                                mTraceUpEdges = new Int32[TraceUpFromNode.Edges.Length];
                                for (int i = 0; i < TraceUpFromNode.Edges.Length; i++)
                                {
                                    mTraceUpEdges[i] = TraceUpFromNode.Edges[i];
                                }
                            }
                            else
                            {
                                mTraceUpEdges = new Int32[1];
                            }
                        }

                        //根据结点查下游
                        FacilityAnalystResult3D TraceDownFromNode = mfacilityAnalyst.TraceDownFromNode(mPipeId1, "Length", true);
                        if (TraceDownFromNode != null)
                        {
                            mTraceDownEdges = new Int32[TraceDownFromNode.Edges.Length];
                            for (int i = 0; i < TraceDownFromNode.Edges.Length; i++)
                            {
                                mTraceDownEdges[i] = TraceDownFromNode.Edges[i];
                            }
                        }
                        else
                        {
                            mTraceDownEdges = new Int32[1];
                        }

                        #endregion
                        break;

                    default:
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex);
            }
        }