ArcEngine中多边形内外环的处理

原创 2012年09月06日 22:49:11
  • 3462

Polylgon对象是由一个或多个Ring对象的有序集合,它可以是由单个Ring对象构成,也可以使用多个Ring组成如下图所示。其中Ring可以分为Outer Ring(外环)和Inner Ring(内环)之分。外环和内环都是有方向的,它们的区别是外环的方向是顺时针的,内环的方向是逆时针。如果多边形只有外环,没有内环,很好处理,难得是如何将内环和外环区分开来,并且保证正确的内外环包含关系。

前段时间做MDB数据库的坐标转换功能,由于针对的是地方坐标系,所以无法用7参数构建投影坐标统一转换。我采用的是将featureLayer中的Feature一个一个取出来,将每个点的起始点坐标取出来进行转换,然后再组合回去。现在将多边形部分代码贴出来:

IPolygon4 polygon = pFeature.ShapeCopy as IPolygon4;  
                        IGeometryBag bag = polygon.ExteriorRingBag;     //获取多边形的所有外环
                        IEnumGeometry geo = bag as IEnumGeometry;
                        geo.Reset();
                        IRing exRing = geo.Next() as IRing;
                        while (exRing != null)
                        {
                            IGeometryBag bags = polygon.get_InteriorRingBag(exRing);   //获取当前外环所包含的内环
                            IEnumGeometry geos = bags as IEnumGeometry;
                            geos.Reset();
                            IRing inRing = geos.Next() as IRing;
                            while (inRing != null)   //先处理内环
                            {
                                ISegmentCollection segs = inRing as ISegmentCollection;
                                ISegmentCollection ring = new RingClass();   //创建新的ring对象,以重新组合polygon
                                for (int i = 0; i < segs.SegmentCount; i++)
                                {
                                    object o = Type.Missing;
                                    ISegment s = segs.get_Segment(i);
                                    IPoint fromPoint = s.FromPoint;
                                    IPoint toPoint = s.ToPoint;

x = fromPoint.X;
                                    y = fromPoint.Y;
                                    fromPoint.PutCoords(ConvertTo2000X(x, y), ConvertTo2000Y(x, y));  //将X、Y坐标转换
                                    s.FromPoint = fromPoint;

x1 = toPoint.X;
                                    y1 = toPoint.Y;
                                    toPoint.PutCoords(ConvertTo2000X(x1, y1), ConvertTo2000Y(x1, y1));
                                    s.ToPoint = toPoint;
                                    ring.AddSegment(s, ref o, ref o);
                                }
                                IRing ir = ring as IRing;
                                ir.Close();
                                ppolygon.AddGeometry(ir);
                                inRing = geos.Next() as IRing;
                            }
                            ISegmentCollection seg = exRing as ISegmentCollection;
                            ISegmentCollection rings = new RingClass();
                            for (int i = 0; i < seg.SegmentCount; i++)  //处理外环
                            {
                                object o = Type.Missing;
                                ISegment s = seg.get_Segment(i);
                                IPoint fromPoint = s.FromPoint;
                                IPoint toPoint = s.ToPoint;

x = fromPoint.X;
                                y = fromPoint.Y;
                                fromPoint.PutCoords(ConvertTo2000X(x, y), ConvertTo2000Y(x, y));
                                s.FromPoint = fromPoint;

x1 = toPoint.X;
                                y1 = toPoint.Y;
                                toPoint.PutCoords(ConvertTo2000X(x1, y1), ConvertTo2000Y(x1, y1));
                                s.ToPoint = toPoint;
                                rings.AddSegment(s, ref o, ref o);
                            }
                            IRing irr = rings as IRing;
                            irr.Close();
                            ppolygon.AddGeometry(irr);
                            exRing = geo.Next() as IRing;                           
                        }
                        IPolygon p = ppolygon as IPolygon;
                        p.SimplifyPreserveFromTo();    //保证多边形封闭
                        pFeature.Shape = p;  
                        pFeature.Store();

通过以上的方法能够将polygon取出来,实现自定义的坐标转换过程,由于先取出来然后再重新组合,所以效率不是很高,但是经过大数据量的验证,表明效率能够接受。

ArcEngine中多边形内外环的处理(转)的更多相关文章

  1. 2D空间中求一点是否在多边形内

    参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...

  2. Mysql中判断一个点是否落在多边形内

    关于地理空间数据,经常需要处理两个空间数据的关联关系.有很多种方法可以处理,通过编写程序算法,或者是调用数据库中对应的function.在mysql数据库中,https://dev.mysql.com ...

  3. PHP 判断点是否在多边形内

    如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...

  4. 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项

    首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...

  5. ZOJ3720 Magnet Darts(点在多边形内)

    第一道点在多边形内的判断题,一开始以为是凸的.其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内. 如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了.但对 ...

  6. POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内)

    A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4438   Acc ...

  7. c# 判断点是否在区域内 点在区域内 在多边形内 判断

    方法一 算法 : public int isLeft(Point P0, Point P1,Point P2)        {            int abc= ((P1.X - P0.X) ...

  8. 查看某一个点是否在某个多边形内 使用ST_Contains函数

    查看某一个点是否在某个多边形内  使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...

  9. C#+ArcEngine中com对象的释放问题

    1.问题描述 最近在写C#下AE的开发,在循环获取数据并修改时碰到了两个问题"超出系统资源"和"超出打开游标最大数":在网上看了一些资料,发现都是说在循环中没有 ...

随机推荐

  1. Swift中如何使用 #if DEBUG

    Swift暂时还不支持大多数的预处理宏操作,但是可以支持“#if/#else/#endif”语句. 下面进行简单的设置使 #if DEBUG 有效,更详细的内容见:http://stackoverfl ...

  2. IIFE 立即执行的函数表达式

    介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的 ...

  3. IDT 查询 hana SQL 聚合问题。

    因为业务需要,用HANA的数据做成DASHBOARD.工厂运营概况.结果发现奇怪的问题.明明是一个类型的但是不会聚合.(数据量特别大,一个月的应该就一条,但是有几千条做不下去.) 比如车辆类型是 焊装 ...

  4. 【Prism】MEF版HelloWorld

    引言 Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codepl ...

  5. 烂泥Linux学习笔记

    把最近学习过程中所写的文章整理了下:注意:本帖会持续性更新!!! 虚拟化篇:<烂泥:虚拟化KVM安装与配置><烂泥:KVM安装centos6.5系统><烂泥:KVM中安装 ...

  6. 机器学习(六)— logistic回归

    最近一直在看机器学习相关的算法,今天学习logistic回归,在对算法进行了简单分析编程实现之后,通过实例进行验证. 一 logistic概述 个人理解的回归就是发现变量之间的关系,也就是求回归系数, ...

  7. UI及物体渲染顺序

    1.决定UI渲染在所有物体前,ZTest Always,Canvas中的RenderMode影响该值. 2.都是ZTest Always 时影响覆盖的因素: 父子及先后关系: 渲染队列: sortin ...

  8. 关于DO、VO的一些新的认识

    今天在开发前的定案以及业务介绍过程中,讲到了一些关于VO和DO的知识和理解. 听到之后就觉得很惊奇,也或许是自己以前不够深入理解开发的过程.认知的很浅薄. DO VO以前的认知里面,都是一样的,都属于 ...

  9. Java编程思想第七章复用类

    7.1组合语法 在一个类中引入多个对象,以提高代码的复用性与功能. 7.2继承语法 使用继承子类可以获得,导出类可以获得基类的成员(变量与方法). 注:这里注意权限控制,若基类中的成员为默认权限,只有 ...

  10. Python 算法之冒泡排序

    冒泡排序 冒泡排序算法的原理如下:(从后往前) 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是 ...