一想到面积的计算,就可能使用IArea接口。实现IArea接口的常用类包括:Envelope、Polygon和Ring。Envelope表示的是一个矩形对象,Polygon表示的是一个任意复杂的区域,Ring表示一个简单的环,这个环由一组相互连接的段(segment)组成。所以,只要对象实现了IArea接口,那么获取面积就非常简单了。下面是一段获取面积的代码:
IArea pArea = theGeometry as IArea;
if (pArea != null)
{
double area = pArea.Area;
//...
}
一切就这么简单。但是,实际运行过程中,居然会出现面积小于0的情况,真是百思不得其解啊。仔细查看了帮助文档,才发现原来Ring还分为两类,一类是外环(exterior ring),一类是内环(interior ring)。区分这二者的直接办法是看坐标点的方向,如果是顺时针,那么就是外环,如果逆时针就是内环。内环的面积是小于0的,外环的面积是大于0的。假设有如下图所示的四个点:
假设有如下代码:
IPoint p1, p2, p3, p4;
//创建第一个环
RingClass pc1 = new RingClass();
pc1.AddPoint(p1);
pc1.AddPoint(p2);
pc1.AddPoint(p3);
pc1.AddPoint(p4);
double d1 = pc1.Area;
bool isExterior1 = pc1.IsExterior();
//创建第二个环
RingClass pc2 = new RingClass();
pc2.AddPoint(p1);
pc2.AddPoint(p4);
pc2.AddPoint(p3);
pc2.AddPoint(p2);
double d2 = pc2.Area;
bool isExterior2 = pc2.IsExterior;
你仔细比较才能发现,pc1添加坐标点的次序是顺时针的,pc2的添加坐标点顺序是逆时针的,所以pc1是外环,pc2是内环。这样,下面的几个结论就显而易见了:
d1>0
isExterior1 = true
d2<0
isExterior2 = false