关于如何根据几何网络进行爆管分析

标签: 几何 网络 分析 | 发表时间:2015-08-30 20:52 | 作者:sx341125
出处:http://blog.csdn.net

之前写过一篇关于如何建立集合网络流向的文章: 如何建立几何网络流向,在这篇文章之中只是介绍如何建立流向,并没有介绍如何实现爆管分析的功能,我在网上也没百度谷歌出相关代码(应该有我没有找到吧),所以自己研究出来了,今天就分享给大家,并感谢给我找相关文献的同门们以及那些分享经验的大神们(本文实现代码并没有根据流向来找到阀门,而是找到所有的相连,但是整体的实现思路不会错,如果你需要根据流向来实现搜索,还需要将流向设置好了以后进一步判断,参考API以后相信根据本文你可以进一步完善)。

———————————————————————————————————————-
首先,我并不会将所有的代码都写出来,但是会介绍最关键的流程与主要代码。
1–找到目标数据的 几何网络。因为我们是在这个数据基础上进行分析的,就是QI到这个接口 INetworkCollection,通过ArcGIS API的帮助文档,我们可以发现类FeatureDataset实现了这个接口,所以思路就是从操作的图层之中尽享QI转换过去就可以了;

  iFeatureLayer = iLayer as IFeatureLayer;
iFeatureDataset = iFeaLayer.FeatureClass.FeatureDataset;
iNetCollec = iDataset as INetworkCollection;

2-找到Edge边。因为爆管分析是我们需要先选中我们确定的已经的爆管的管道,所以需要根据鼠标点击数据找到那条边;这里主要用到了 IPointToEID接口的GetNearestEdge方法获取到当前的爆管位置
3-找到Edge首末节点。根据第二步找到Edge以后得到的是该边的EID,在几何网络之中会根据Feature重新生成一个EID对应每个要素;所以我们可以使用 INetTopologyEditGEN接口的GetFromToJunctionEIDs方法找到首末节点的EID
4–判断首末节点是否为阀门(爆管分析就是要关闭连通的阀门),如果是阀门,那么这个节点相连的边线就不用继续搜索了,否则根据该节点的EID继续往下搜索所有相连的边线Edges;这里我们使用队列Enqueue数据结构来处理节点EID,所有检索到的非节点的EID全部保存在队列之中,因为队列是先进先出的,而且出列的同时会返回该出列值,适用于当前的数据结构,而检索到的所有Edges全部保存在字典Dictionary之中,其中Key是连接节点,而Value是与该点连接Edges;这样,当我们从队列中取出非阀门节点的EID的时候就可以去字典中找到相连的Edge,然后根据这条连接边继续寻找节点,直到队列为空为止。
这一步相对较为复杂,所以会将所有代码全部贡献出来

  while (true)
                {
                    dictionary.Clear();
                    //判断2个起始节点是否为阀门
                    if (IsWaterValue(fromFuncEID, iGeoNetwork) && IsWaterValue(toFuncEID, iGeoNetwork))//首尾皆为阀门
                    {
g_WaterValues.Add(GetFeatureByEID(fromFuncEID, iGeoNetwork));                    g_WaterValues.Add(GetFeatureByEID(toFuncEID, iGeoNetwork));
                        break;//跳出
                    }
                    else if (IsWaterValue(fromFuncEID, iGeoNetwork) && !IsWaterValue(toFuncEID, iGeoNetwork))//起点是阀门
                    {
                        g_WaterValues.Add(GetFeatureByEID(fromFuncEID, iGeoNetwork));
                        juncQueue.Enqueue(toFuncEID);
                        dictionary.Add(toFuncEID, nearestEdgeEID);
                    }
                    else if (!IsWaterValue(fromFuncEID, iGeoNetwork) && IsWaterValue(toFuncEID, iGeoNetwork))//终点是阀门
                    {
                        g_WaterValues.Add(GetFeatureByEID(toFuncEID, iGeoNetwork));
                        juncQueue.Enqueue(fromFuncEID);
                        dictionary.Add(fromFuncEID, nearestEdgeEID);
                    }
                    else//都不是阀门
                    {
                        juncQueue.Enqueue(fromFuncEID);
                        juncQueue.Enqueue(toFuncEID);
                        dictionary.Add(fromFuncEID, nearestEdgeEID);
                        dictionary.Add(toFuncEID, nearestEdgeEID);
                    }

                    IForwardStarGEN iForwardStarGEN = iGeoNetwork.Network.CreateForwardStar(true, null, null, null, null) as IForwardStarGEN;//这个接口主要负责根据EID查找连通的要素EID
                    while (juncQueue.Count != 0)//判断队列是否为空,递归...
                    {
                        int adgacentEdgesCount = 0;//指定的搜索节点连接的除源edge以外的邻接边线个数
                        int eid = (int)juncQueue.Dequeue();//队列移除eid并获取eid

                        iForwardStarGEN.FindAdjacent(dictionary[eid], eid, out adgacentEdgesCount);//首次判断使用起始边线作为输入参数
                        if (adgacentEdgesCount != 0)//如果邻接线为0
                        {
                            int[] refEdgesEIDs = new int[adgacentEdgesCount];//查询到的边线集合
                            bool[] refReverseOrirntation = new bool[adgacentEdgesCount];//默认为false
                            object[] refWeightValue = new object[adgacentEdgesCount];
                            iForwardStarGEN.QueryAdjacentEdges(ref refEdgesEIDs, ref refReverseOrirntation, ref refWeightValue);//获得与指定节点的边线EID集合
                            //遍历边线集合
                            for (int i = 0; i < refEdgesEIDs.Length; i++)
                            {
                                int adgacentJunc;
                                object weight;
                                iForwardStarGEN.QueryAdjacentJunction(i, out adgacentJunc, out weight);
                                //判断这个输出的节点EID是否为阀门
                                if (IsWaterValue(adgacentJunc, iGeoNetwork))
                                {//如果是阀门加入到集合中
                                    g_WaterValues.Add(GetFeatureByEID(adgacentJunc, iGeoNetwork));
                                }
                                else
                                {
                                    if (!dictionary.ContainsKey(adgacentJunc))//因为没有设置流向,所以是双向查找,所以要判断是否已经查过了
                                    {
                                        dictionary.Add(adgacentJunc, refEdgesEIDs[i]); //成对添加到字典中去
                                        juncQueue.Enqueue(adgacentJunc);//如果不是阀门,那么将该节点加入到队列中去
                                    }
                                }
                            }
                        }
                    }
                    //最后需要break
                    break;
                }

———————————————————————————————————————-
这就是主要的流程逻辑与代码了,希望可以帮到大家,另外有什么不足之处请大家不吝指教!

作者:sx341125 发表于2015/8/30 12:52:46 原文链接
阅读:84 评论:0 查看评论

相关 [几何 网络 分析] 推荐:

关于如何根据几何网络进行爆管分析

- - CSDN博客综合推荐文章
首先,我并不会将所有的代码都写出来,但是会介绍最关键的流程与主要代码. 1–找到目标数据的 几何网络. 因为我们是在这个数据基础上进行分析的,就是QI到这个接口 INetworkCollection,通过ArcGIS API的帮助文档,我们可以发现类FeatureDataset实现了这个接口,所以思路就是从操作的图层之中尽享QI转换过去就可以了;.

30天改造您的网络分析

- liang - SEM WATCH
在30天内改造?我几乎能听到读者的自言自语:“这怎么可能?”. 为什么不可能的原因有很多——他们是理解为什么快速的分析发展几乎从未发生的关键. 然而,一旦我们明确了为什么不可能的原因,我们就可以像清除路障一样清除他们,因为如果您以合适的速度和深思熟虑来处理,就完全有可能快速改造网络分析. 改造网络分析的首要一步是清除不必要的障碍.

网络数据的背后——网络日志的分析指标

- cRabdanceR - 腾讯CDC
  常用的定量分析是问卷调查,这可以收集到用户对产品的主观反馈,它的结果受问卷题目的影响,不能完全客观地反映用户如何使用产品,他们在实际环境中遇到了哪些问题. 而针对网站的定量分析,网络服务器的日志文件能真实反映用户的当前体验,解释行为的深层特点,能够更有效地改进产品.   网络日志可以帮我们回答很多问题,比如用户在什么时间段浏览网站;对网站的什么板块比较感兴趣;是怎样了解到网站;多少用户会转成重复用户;在网站上找到兴趣点的路径是什么;应该怎样优化使用过程,提高用户体验,等等.

网络营销行为经济学分析: Amazon Apple Netflix Groupon Facebook

- zementary - 互联网营销|Internet Marketing
7月1日,Wired杂志,中文名为连线,最近杜克大学 行为经济学家 丹•艾瑞里(Dan Ariely)撰文在线公司如何让我们共享更多,消费更多. Ariely经济学家用行为经济学理论分别对亚马逊Amazon、Netflix、团购Groupon、 Zynga、Facebook和苹果的网络营销做了分析.

网络营销行为经济学分析: Amazon Apple Facebook…

- ~Wing~ - 互联网的那点事
7月1日,Wired杂志,中文名为连线,最近杜克大学 行为经济学家 丹•艾瑞里(Dan Ariely)撰文在线公司如何让我们共享更多,消费更多. Ariely经济学家用行为经济学理论分别对亚马逊Amazon、Netflix、团购Groupon、 Zynga、Facebook和苹果的网络营销做了分析.

网络数据包的捕获及分析软件简介(下)

- - 博客园_首页
  自由转载 ^_^   同时请注明原文出处: http://www.cnblogs.com/wangvsa/archive/2012/07/19/2600013.html.   上一篇简单介绍了几个捕获数据包的工具,这篇整理一下数据包及日志分析工具.   二、数据包及日志分析工具.   很多数据包捕获工具记录log采用pcap格式,因此也就有很多工具分析pcap文件.

数据包分析技术与网络基础

- - 技术改变世界 创新驱动中国 - 《程序员》官网
文/ Chris Sanders. 在计算机网络中,每天都可能发生成千上万的问题,从简单的间谍软件感染,到复杂的路由器配置错误. 我们永远也不可能立即解决所有问题,而只能期盼充分地准备好相关的知识和工具,从而能够快速地响应各种类型的错误. 所有的网络问题都源于数据包层次,即使是有着最漂亮外表的应用程序,它们也可能是“金玉其外”但“败絮其中”,有着混乱的设计与糟糕的实现,又或是看起来是可信的,但背地里在搞些恶意的行为.

社交网络分析:大伙如何看待新 iPad?

- - 爱范儿 · Beats of Bits
大数据分析渐渐流行起来,那么人们对于这次的苹果新品发布会又有什么看法呢. 《财富》汇集了两家公司基于 Twitter 给出的分析,目前看来过半评论是积极的. 第一个分析是 Crimson Hexagon 给出的,这家来自哈佛大学的公司分析了与新 iPad 有关的近两百万条 Twitter 消息,提炼出下列内容:.

「社会网络分析」是怎样的学科?

- - 知乎每日精选
我是研究这个领域的,在这里简单介绍一下social network analysis的几个研究热点. 一般来说,一个network被定义为一个random matrix,即网络中有哪些nodes是确定的,而nodes之间是否有edge相连是随机的,任何两个nodes之间有一个edge probability,整个网络上的edge probabilities就构成了一个probability matrix.