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. 《Advanced Bash-scripting Guide》学习(四):一个显示时间日期登录用户的脚本

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者杨春敏 黄毅 编写一个脚本,显示时间和日期,列出所有的登录用户,显示系统的更新时间.然后这个脚本 ...

  2. 安装Xcode 7 beta后Xcode 6崩溃的问题

    最新解决方案:把OSX El Capitan升级到Beta 7  (15A263e),Xcode6可使用! 解决方案:http://stackoverflow.com/questions/318035 ...

  3. hzau 1199 Little Red Riding Hood

    1199: Little Red Riding Hood Time Limit: 1 Sec  Memory Limit: 1280 MBSubmit: 918  Solved: 158[Submit ...

  4. ionic2——apk签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  5. nyoj-3-多边形重心问题(求多边形面积和中心)

    题目链接 /* Name:nyoj-3-多边形重心问题 Copyright: Author: Date: 2018/4/26 21:25:41 Description: ACM国际大学生程序设计竞赛 ...

  6. stl_relops.h

    stl_relops.h // Filename: stl_relops.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http ...

  7. Smarty的模板中不允许PHP的代码?

    /****************************************************************************** * Smarty的模板中不允许PHP的代 ...

  8. ecshop彻底去版权把信息修改成自己的全教程

    前台部分: 一.去掉头部title部分的ECSHOP演示站-Powered by ecshop 1.问题:“ECSHOP演示站”方法:在后台商店设置 – 商店标题修改2.问题:“ Powered by ...

  9. Unity项目UI图片压缩格式(UGUI)

    http://blog.csdn.net/bobodan123/article/details/70316538 UI制作时候使用的是Ps 8位 RGB通道的色彩. 但导出的是16位RGBA色彩的图片 ...

  10. sntp协议简介

    SNTP(Simple Network Time Protocal简单网络时间协议),用于跨广域网或局域网同步时间的协议,具有较高的精确度(几十毫秒).SNTP是NTP协议的简化版,两者分别在RFC1 ...