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. 计算客网络赛 Coin 二项式定理+逆元

    https://nanti.jisuanke.com/t/17115 Bob has a not even coin, every time he tosses the coin, the proba ...

  2. Android中播放DSD音乐

    Github上有个简单的Alsa DSD测试程序,可以播放DSD,地址位于:https://github.com/zonque/alsa-dsd-player 细看其代码,发现有ALSA_FORMAT ...

  3. C++Builder XE5对于C++11的支持真蛋疼

    好不容易下载个XE5,安装,破解,准备测试一下C++11中的lambda,写了一个最简单的表达式: [](){}; 居然编译通不过. 查了帮助文档,才晓得它的编译器分为BCC32和BCC64, BCC ...

  4. XML DOM - Range 对象

    Range对象 Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域.   dom标准Range对象 在IE中使用TextRange对象 range对象常用的建立方法在开发中 ...

  5. 应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用

    此时会输出两个null. Users类的实例是myUsers,但是由于javabean的作用范围是page,所以前面页面传送的javabean的设置的属性全部不能接收到.所以对象myUsers属性为自 ...

  6. linux查看网络链接状况命令netstat

    linux查看网络链接状况命令 netstat 参数如下: -a 显示所有socket,包括正在监听的. -c 每隔1秒就重新显示一遍,直到用户中断它. -i 显示所有网络接口的信息,格式同“ifco ...

  7. main函数的参数的用法

    说明:main函数的参数的用法源代码: #include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[] ...

  8. js中的点击事件(click)的实现方式

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. keepalived 检测脑裂切换脚本

    #!/bin/bash count=0 run1=`curl -I 192.168.30.12:8000 | grep "200 OK" | wc -l` run2=`curl - ...

  10. php system()

    学习源头: https://blog.csdn.net/ltx06/article/details/53992905 system(“nohup ./test.py $s &”); 这个不会在 ...