ArcEngine中多边形内外环的处理(转)
ArcEngine中多边形内外环的处理
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中多边形内外环的处理(转)的更多相关文章
- 2D空间中求一点是否在多边形内
参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...
- Mysql中判断一个点是否落在多边形内
关于地理空间数据,经常需要处理两个空间数据的关联关系.有很多种方法可以处理,通过编写程序算法,或者是调用数据库中对应的function.在mysql数据库中,https://dev.mysql.com ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项
首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...
- ZOJ3720 Magnet Darts(点在多边形内)
第一道点在多边形内的判断题,一开始以为是凸的.其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内. 如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了.但对 ...
- 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 ...
- c# 判断点是否在区域内 点在区域内 在多边形内 判断
方法一 算法 : public int isLeft(Point P0, Point P1,Point P2) { int abc= ((P1.X - P0.X) ...
- 查看某一个点是否在某个多边形内 使用ST_Contains函数
查看某一个点是否在某个多边形内 使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...
- C#+ArcEngine中com对象的释放问题
1.问题描述 最近在写C#下AE的开发,在循环获取数据并修改时碰到了两个问题"超出系统资源"和"超出打开游标最大数":在网上看了一些资料,发现都是说在循环中没有 ...
随机推荐
- JS中的“use strict” 严格模式
1.介绍严格模式 2.严格模式影响范围 变量: var.delete.变量关键字 对象: 只读属性. 对象字面量属性重复申明 函数:参数重名.arguments对象.申明 其他:this.eval. ...
- 快速构建一个 Springboot
快速构建一个 Springboot 官网:http://projects.spring.io/spring-boot/ Spring Boot可以轻松创建可以“运行”的独立的,生产级的基于Spring ...
- eShopOnWeb
eShopOnWeb https://www.cnblogs.com/sheng-jie/p/9616675.html 构建现代Web应用 1.引言 eShopOnWeb是基于ASP.NET Core ...
- 对django rest_framework的个人理解
首先要搞清楚web service 和rest都是一种API设计的架构,简单点说 作为一个api开发者,为了保证跨语言.跨平台的高效api,我们可以采用架构师提出的设计架构的理念去设计符合条件的api ...
- Oracle job procedure 存储过程定时任务(转自hoojo)
Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...
- centos7 安装 mysql-python时 报错 EnvironmentError: mysql_config not found
pip install mysql-python 然后报错 EnvironmentError: mysql_config not found 网上搜解决方法,需要安装 mysql-devel 然后 ...
- JDK7和JDK8新特性
参考:http://www.cnblogs.com/langtianya/p/3757993.html JDK 1.7 新特性 1,switch中可以使用字串了 String s = "te ...
- 几种排序方式的java实现(02:希尔排序,归并排序,堆排序)
代码(部分为别人代码): 1.希尔排序(ShellSort) /* * 希尔排序:先取一个小于n的整数d1作为第一个增量, * 把文件的全部记录分成(n除以d1)个组.所有距离为d1的倍数的记录放在同 ...
- (转)AppCan中调用系统浏览器打开网页
<!DOCTYPE html> <html> <head> <style>body{ background:#fff; font-size:30px;} ...
- 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务
目录(?)[-] Client的AIDL文件 Client的代码 建立连接 请求服务 断开连接 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://bl ...