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. 解决:Eclipse安装Pydev插件报错: An error occurred while collecting items to be installed session context was:(profile=...

    今天在Elipse上安装Pydev插件时报错: An error occurred while collecting items to be installed session context was ...

  2. Wannafly挑战赛4 B,小AA的数列

    题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数 题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次++,从大于r的点每次--,记录二 ...

  3. BW里转换简单常用ABAP

    用户查看的是当时的物料折让,那你必然要给物料加个时间,才好区分.总是以现在最新的物料状态查看历史数据会出现问题.当时这个物料是折让的,现在不折让了.数据会有问题.加个DSO.做一个时间记录.读取系统时 ...

  4. LeetCode OJ:Balanced Binary Tree(平衡二叉树)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  5. 微服务:Eureka配置集群环境

    一.注册中心编码 1.使用idea创建一个spring boot项目,pom如下: <?xml version="1.0" encoding="UTF-8" ...

  6. unity 四元数, 两行等价的代码

    Vector3 tmpvc; 1. tmpvc = Quaternion.Euler (new Vector3 (0, 30, 0)) * new Vector3 (0, 0, 1); 2. tmpv ...

  7. UVA - 1608 Non-boring sequences (分治,中途相遇法)

    如果一个序列中是否存在一段连续子序列中的每个元素在该子序列中都出现了至少两次,那么这个序列是无聊的,反正则不无聊.给你一个长度为n(n<=200000)的序列,判断这个序列是否无聊. 稀里糊涂A ...

  8. MySQL实战 | 02-MySQL 如何恢复到半个月内任意一秒的状态?

    原文链接:MySQL是如何做到可以恢复到任意一秒状态的? 看到这个题目是不是觉得数据库再也不用担心服务器 crash 了? 那我们需要学习为什么可以这么做?以及如何做? 即为什么可以恢复到任意时间点? ...

  9. Docker-安装与部署

    本文在CentsOS下安装Docker 1.安装前准备工作 系统要求: 在CentOS下需要64位的CentsOS 7  OS requirements To install Docker, you ...

  10. ASP.net之HttpModel

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...