/// <summary>
        /// 得到局部聚类的EdgeList
        /// </summary>
        /// <param name="subGraph"></param>
        /// <returns></returns>
        private List <ITinEdge> GetLocalEdgeList(ASCDTSubGraph subGraph)
        {
            List <ITinEdge> localEdge = new List <ITinEdge>();

            double mean1StDev = Mean1StDev(subGraph);

            for (int i = 0; i < subGraph.GetNodeList().Count; i++)
            {
                ITinNode localNode       = subGraph.GetNodeList()[i];
                double   local2Mean      = Local2Mean(localNode, subGraph);
                double   localConstraint = local2Mean + mean1StDev;

                ITinEdgeArray incidentEdges = localNode.GetIncidentEdges();
                for (int j = 0; j < incidentEdges.Count; j++)
                {
                    ITinEdge currenEdge = incidentEdges.get_Element(j);
                    if (IsInEdges(currenEdge, subGraph.GetEdgeList()) && currenEdge.Length < localConstraint)
                    {
                        localEdge.Add(currenEdge);
                    }
                }
            }
            //去掉多加的neighbor边
            localEdge = CompleteEdges(localEdge);
            return(localEdge);
        }
        /// <summary>
        /// 二阶邻接边长均值
        /// </summary>
        /// <param name="currentNode"></param>
        /// <param name="subGraph"></param>
        /// <returns></returns>
        private double Local2Mean(ITinNode currentNode, ASCDTSubGraph subGraph)
        {
            double          a = 0;
            List <ITinEdge> incident2Edges = Get2IncidentEdges(currentNode, subGraph);
            int             edgeCount      = incident2Edges.Count;

            for (int i = 0; i < edgeCount; i++)
            {
                a = a + incident2Edges[i].Length;
            }
            return(a / (double)edgeCount);
        }
        /// <summary>
        /// 一阶邻接边长标准差平均值(子图)
        /// </summary>
        /// <param name="subGraph"></param>
        /// <returns></returns>
        private double Mean1StDev(ASCDTSubGraph subGraph)
        {
            List <ITinNode> globalNode = subGraph.GetNodeList();
            List <ITinEdge> globalEdge = subGraph.GetEdgeList();
            int             nodeCount  = globalNode.Count;
            double          a          = 0;

            for (int i = 0; i < nodeCount; i++)
            {
                ITinNode tinNode     = globalNode[i];
                double   local1Mean  = Local1Mean(tinNode, globalEdge);
                double   local1StDev = Local1StDev(tinNode, globalEdge, local1Mean);
                a = a + local1StDev;
            }
            return(a / (double)nodeCount);
        }
 /// <summary>
 /// 将ASCDTSubGraph的结果保存到clusters中
 /// </summary>
 private void CreateClusters()
 {
     if (m_bLocal == false)
     {
         for (int i = 0; i < m_globalSubGraphs.Count; i++)
         {
             Cluster cluster = new Cluster();
             cluster.SetClusterIndex(i + 1);
             ASCDTSubGraph   subGraph = m_globalSubGraphs[i];
             List <ITinNode> tinNodes = subGraph.GetNodeList();
             for (int j = 0; j < tinNodes.Count; j++)
             {
                 IPoint newPoint = new PointClass();
                 tinNodes[j].QueryAsPoint(newPoint);
                 IZAware pZAware = newPoint as IZAware;
                 pZAware.ZAware = false;
                 cluster.AddPoint(newPoint);
             }
             cluster.CreateConvexHull(m_dataInfo.GetSpatialReference());
             m_Clusters.AddCluster(cluster);
         }
     }
     else
     {
         for (int i = 0; i < m_localSubGraphs.Count; i++)
         {
             Cluster cluster = new Cluster();
             cluster.SetClusterIndex(i + 1);
             ASCDTSubGraph   subGraph = m_localSubGraphs[i];
             List <ITinNode> tinNodes = subGraph.GetNodeList();
             for (int j = 0; j < tinNodes.Count; j++)
             {
                 IPoint newPoint = new PointClass();
                 tinNodes[j].QueryAsPoint(newPoint);
                 IZAware pZAware = newPoint as IZAware;
                 pZAware.ZAware = false;
                 cluster.AddPoint(newPoint);
             }
             cluster.CreateConvexHull(m_dataInfo.GetSpatialReference());
             m_Clusters.AddCluster(cluster);
         }
     }
 }
        /// <summary>
        /// 得到二阶邻接边
        /// </summary>
        /// <param name="currentNode"></param>
        /// <param name="subGraph"></param>
        /// <returns></returns>
        private List <ITinEdge> Get2IncidentEdges(ITinNode currentNode, ASCDTSubGraph subGraph)
        {
            List <ITinEdge> incidentEdges = new List <ITinEdge>();
            List <ITinEdge> subGraphEdge  = subGraph.GetEdgeList();
            List <ITinNode> subGraphNode  = subGraph.GetNodeList();

            //加入一阶邻接边
            ITinEdgeArray incEdges = currentNode.GetIncidentEdges();

            for (int j = 0; j < incEdges.Count; j++)
            {
                if (IsInEdges(incEdges.get_Element(j), subGraphEdge))
                {
                    incidentEdges.Add(incEdges.get_Element(j));
                }
            }
            //查找相邻点,加入二阶邻接边
            ITinNodeArray adjNodes = currentNode.GetAdjacentNodes();

            for (int j = 0; j < adjNodes.Count; j++)
            {
                if (!IsInNodes(adjNodes.get_Element(j), subGraphNode))
                {
                    continue;
                }
                ITinEdgeArray inc2Edges = adjNodes.get_Element(j).GetIncidentEdges();
                for (int k = 0; k < inc2Edges.Count; k++)
                {
                    ITinEdge edge = inc2Edges.get_Element(k);
                    if (IsInEdges(edge, incidentEdges))
                    {
                        continue;
                    }
                    if (IsInEdges(edge, subGraphEdge))
                    {
                        incidentEdges.Add(edge);
                    }
                }
            }

            return(incidentEdges);
        }
        /// <summary>
        /// 划分子图
        /// </summary>
        /// <param name="globalEdge"></param>
        /// <param name="globalNode"></param>
        /// <returns></returns>
        private List <ASCDTSubGraph> ConstractSubGraph(List <ITinEdge> globalEdge, List <ITinNode> globalNode)
        {
            List <ASCDTSubGraph> subGraphList = new List <ASCDTSubGraph>();

            for (int i = 0; i < globalNode.Count; i++)
            {
                ITinNode startNode = globalNode[i];
                if (m_nodeFlag[startNode.Index - 1] != 0)
                {
                    continue;
                }


                List <ITinEdge> clusterEdges = new List <ITinEdge>();
                List <ITinNode> clusterNodes = new List <ITinNode>();
                ASCDTSubGraph   newSubGraph  = new ASCDTSubGraph(clusterNodes, clusterEdges);

                newSubGraph = ExpandSubGraph(startNode, globalEdge, newSubGraph);
                subGraphList.Add(newSubGraph);
            }
            return(subGraphList);
        }
        private ASCDTSubGraph ExpandSubGraph(ITinNode currentNode, List <ITinEdge> globalEdge, ASCDTSubGraph newSubGraph)
        {
            m_nodeFlag[currentNode.Index - 1] = 1;
            newSubGraph.AddNode(currentNode);

            ITinEdgeArray incidentEdges = currentNode.GetIncidentEdges();

            for (int i = 0; i < incidentEdges.Count; i++)
            {
                ITinEdge currentEdge = incidentEdges.get_Element(i);
                if (IsInEdges(currentEdge, globalEdge))
                {
                    newSubGraph.AddEdge(currentEdge);
                    ITinNode nextNode = currentEdge.ToNode;
                    if (m_nodeFlag[nextNode.Index - 1] == 0)
                    {
                        ExpandSubGraph(nextNode, globalEdge, newSubGraph);
                    }
                }
            }
            return(newSubGraph);
        }
        /// <summary>
        /// 划分子图
        /// </summary>
        /// <param name="globalEdge"></param>
        /// <param name="globalNode"></param>
        /// <returns></returns>
        private List<ASCDTSubGraph> ConstractSubGraph(List<ITinEdge> globalEdge, List<ITinNode> globalNode)
        {
            List<ASCDTSubGraph> subGraphList = new List<ASCDTSubGraph>();
            for (int i = 0; i < globalNode.Count; i++)
            {
                ITinNode startNode = globalNode[i];
                if (m_nodeFlag[startNode.Index - 1] != 0)
                    continue;

                List<ITinEdge> clusterEdges = new List<ITinEdge>();
                List<ITinNode> clusterNodes = new List<ITinNode>();
                ASCDTSubGraph newSubGraph = new ASCDTSubGraph(clusterNodes, clusterEdges);

                newSubGraph = ExpandSubGraph(startNode, globalEdge, newSubGraph);
                subGraphList.Add(newSubGraph);
            }
            return subGraphList;
        }
 /// <summary>
 /// 一阶邻接边长标准差平均值(子图)
 /// </summary>
 /// <param name="subGraph"></param>
 /// <returns></returns>
 private double Mean1StDev(ASCDTSubGraph subGraph)
 {
     List<ITinNode> globalNode = subGraph.GetNodeList();
     List<ITinEdge> globalEdge = subGraph.GetEdgeList();
     int nodeCount = globalNode.Count;
     double a = 0;
     for (int i = 0; i < nodeCount; i++)
     {
         ITinNode tinNode = globalNode[i];
         double local1Mean = Local1Mean(tinNode, globalEdge);
         double local1StDev = Local1StDev(tinNode, globalEdge, local1Mean);
         a = a + local1StDev;
     }
     return a / (double)nodeCount;
 }
Beispiel #10
0
 /// <summary>
 /// 二阶邻接边长均值
 /// </summary>
 /// <param name="currentNode"></param>
 /// <param name="subGraph"></param>
 /// <returns></returns>
 private double Local2Mean(ITinNode currentNode, ASCDTSubGraph subGraph)
 {
     double a = 0;
     List<ITinEdge> incident2Edges = Get2IncidentEdges(currentNode, subGraph);
     int edgeCount = incident2Edges.Count;
     for (int i = 0; i < edgeCount; i++)
     {
         a = a + incident2Edges[i].Length;
     }
     return a / (double)edgeCount;
 }
Beispiel #11
0
        /// <summary>
        /// 得到局部聚类的EdgeList
        /// </summary>
        /// <param name="subGraph"></param>
        /// <returns></returns>
        private List<ITinEdge> GetLocalEdgeList(ASCDTSubGraph subGraph)
        {
            List<ITinEdge> localEdge = new List<ITinEdge>();

            double mean1StDev = Mean1StDev(subGraph);
            for (int i = 0; i < subGraph.GetNodeList().Count; i++)
            {
                ITinNode localNode = subGraph.GetNodeList()[i];
                double local2Mean = Local2Mean(localNode, subGraph);
                double localConstraint = local2Mean + mean1StDev;

                ITinEdgeArray incidentEdges = localNode.GetIncidentEdges();
                for (int j = 0; j < incidentEdges.Count; j++)
                {
                    ITinEdge currenEdge = incidentEdges.get_Element(j);
                    if (IsInEdges(currenEdge, subGraph.GetEdgeList()) && currenEdge.Length < localConstraint)
                        localEdge.Add(currenEdge);
                }
            }
            //去掉多加的neighbor边
            localEdge = CompleteEdges(localEdge);
            return localEdge;
        }
Beispiel #12
0
        /// <summary>
        /// 得到二阶邻接边
        /// </summary>
        /// <param name="currentNode"></param>
        /// <param name="subGraph"></param>
        /// <returns></returns>
        private List<ITinEdge> Get2IncidentEdges(ITinNode currentNode, ASCDTSubGraph subGraph)
        {
            List<ITinEdge> incidentEdges = new List<ITinEdge>();
            List<ITinEdge> subGraphEdge = subGraph.GetEdgeList();
            List<ITinNode> subGraphNode = subGraph.GetNodeList();

            //加入一阶邻接边
            ITinEdgeArray incEdges = currentNode.GetIncidentEdges();
            for (int j = 0; j < incEdges.Count; j++)
            {
                if (IsInEdges(incEdges.get_Element(j), subGraphEdge))
                    incidentEdges.Add(incEdges.get_Element(j));
            }
            //查找相邻点,加入二阶邻接边
            ITinNodeArray adjNodes = currentNode.GetAdjacentNodes();
            for (int j = 0; j < adjNodes.Count; j++)
            {
                if (!IsInNodes(adjNodes.get_Element(j), subGraphNode))
                    continue;
                ITinEdgeArray inc2Edges = adjNodes.get_Element(j).GetIncidentEdges();
                for (int k = 0; k < inc2Edges.Count; k++)
                {
                    ITinEdge edge = inc2Edges.get_Element(k);
                    if (IsInEdges(edge, incidentEdges))
                        continue;
                    if (IsInEdges(edge, subGraphEdge))
                        incidentEdges.Add(edge);
                }
            }

            return incidentEdges;
        }
Beispiel #13
0
        private ASCDTSubGraph ExpandSubGraph(ITinNode currentNode, List<ITinEdge> globalEdge, ASCDTSubGraph newSubGraph)
        {
            m_nodeFlag[currentNode.Index - 1] = 1;
            newSubGraph.AddNode(currentNode);

            ITinEdgeArray incidentEdges = currentNode.GetIncidentEdges();
            for (int i = 0; i < incidentEdges.Count; i++)
            {
                ITinEdge currentEdge = incidentEdges.get_Element(i);
                if (IsInEdges(currentEdge, globalEdge))
                {
                    newSubGraph.AddEdge(currentEdge);
                    ITinNode nextNode = currentEdge.ToNode;
                    if (m_nodeFlag[nextNode.Index - 1] == 0)
                        ExpandSubGraph(nextNode, globalEdge, newSubGraph);
                }
            }
            return newSubGraph;
        }