Geometry是ArcGIS Engine中使用最为广泛的对象集之一,用户在创建、删除、编辑和进行地理分析的时候,就是处理一个包含几何形体的矢量对象;除了显示要素意外,控件对象选择,要素符号化,标注要素,编辑要素都需要Geometry参与。图1是Geometry的主要几何对象模型图,接下来将一一介绍这些几何对象。
ICurve接口的Length属性用于返回一个Curve对象的长度。
ICurve接口的FromPoint和ToPoint属性可以获得Curve对象的起止点。
ICurve接口的Reverseorientation方法可以改变一个Curve对象的节点次序即调动Curve对象的起始点和终止点互相调换。
ICurve接口的IsClosed属性则可以判断一个Curve对象起始点和终止点是否在一个位置上。
ICurve接口的GetSubcurve方法可以复制一条Curve对象的特定部分,例如一条10千米公路的Curve对象,获取2-5千米处的公路的曲线代码片段如下所示:
//QI到ICurve接口
ICurve pCurve = pPolyline as ICurve;
//创建一个Polyline对象
ICurve pNewCurve = new PolylineClass();
bool btrue= true;
//获取-5千米间的曲线对象
pCurve.GetSubcurve(2, 5, btrue, out pNewCurve);
此外ICurve的QueryTangent和QueryNormal方法分别用于获取Curve对象上某一点的曲线的切线和法线。
2.4.7 Triangle Strip和Trangle Fan, Trangle,Ring几何对象
Triangle Strip和Trangle Fan, Trangle,Ring是构成MultiPatch几何对象的构建对象。
2.4.7.1Triangle Strip几何对象
TriangelStrip对象是由一系列点定义的曲面片组成,而曲面片是有若干个三角形所组成,所以这个曲面可以定义为:(0,1,2) ,(2, 1, 3), (2, 3, 4), (4, 3, 5)。
2Trangle Fan几何对象
一个Trangle Fan对象由一系列点定义的曲面片组成,所不同的是所有的三角形共享一个顶点。如下图所示,所以这个曲面可以定义为:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。
3Triangle几何对象
Triangle由三个点所确定如下图,一个Triangle可定义为(0,1,2)等。
4Ring几何对象
Ring和前边介绍的组成Polygon的Ring一样,例如下边一个房屋组成它的墙是个OutRing对象,而窗户和门是InnerRing对象
8Multipatch几何对象
Multipatch几何对象用于描述3D图形,可以由TriangleStrip, TriangleFan, Triangle和ring对象组合构成组成。Multipatch可以通过多种方式创建,一种是通过导入外部3D格式数据文件(3D Studio Max .3ds files, OpenFlight .flt files, COLLADA .dae files, Sketchup .skp files, VRML .wrl files),另外ArcGIS Engine提供了多种创建Multipatch几何对象的方法:
如果创建没有贴图纹理,没有法向,没有组成部分信息的Multipatch时,只需创建好组成的Multipatch的各个部分即可,然后通过MultiPatch的IGeometryCollection接口添加各个组成部分即可。
如果要为Multipatch每个组成部分添加纹理信息,法向信息,属性信息就必须使用GeneralMultiPatchCreator
通过IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment对象可以通过拉伸Polyline对象(拉伸为墙)和Polygon对象(拉伸为多面体)来创建MultiPatch.
通过访问3D符号库,获取3DSymbol来渲染点,把三维符号放置在点的位置从而生成Multipatch.
接下来给大家介绍通过GeneralMultiPatchCreator
GeometryMaterial:用于构建材质,通过IGeometryMaterial创建的材质可以作为TextureLineSymbol或者 TextureFillSymbol属性用来创建这些符号,也可以把它添加到GeometryMaterialList对象中,用于GeneralMultipatchCreator
GeometryMaterialList:材质对象的容器用于GeneralMultiPatchCreator
GeneralMultiPatchCreator
9Geometry集合接口
通过前边对于具体的Geometry对象的介绍可知,除了Point对象之外,其他几何对象都是通过其他几何对象集合构建而成。如MultiPoint对象是点的集合,Path对象是Segment对象的集合,Polyline对象是Path对象的集合,Polygon对象是Ring对象的集合,Multipatch对象是Triangle Strip和Trangle Fan, Trangle,Ring对象的集合。
ArcGIS Engine提供了三个主要的几何图形集合接口用于对几何对象的操作,分别是IPointCollection,ISegmentCollection和IGeometryCollection,这些接口揭示出ArcGIS Engine的几何模型的实质——它们是一种组合构成的模式,这种组合并不一定按照严格的层次结构组织。
在前面介绍一些几何对象的时候,也给大家演示了部分使用功能,这三个接口在程序开发中经常使用到,接下来简单阐述以下这三个接口的使用方法。
2.4.9.1IGeometryCollection接口IGeometryCollection接口被Polygon,Polyline, Multipoint, Multipatch, Trangle,T rangle Strip,Trangle Fan和GeometryBag所实现。IGeometryCollection接口提供的方法可以让开发者对一个几何对象的组成元素即子对象进行添加,改变和移除。例如:
组成Polyline对象的子对象是Path对象。
组成Polygon对象的子对象是Ring对象。
组成Multipoint对象的子对象是Point对象。
组成MultiPatch对象的子对象是TrangleFan TrangleStrip,Triangle或Ring对象。
组成GeometryBag对象的是任何类型的几何体对象,实际上GeometryBag是一个可以容纳任何类型几何对象的容器。
IGeometryCollection的Geometry 属性可以通过一个索引值返回一个组成该几何对象的某个子对象,而GeometryCount返回组成该几何对象的子对象的数目。
IGeometry的AddGeometry和AddGeometries方法都用于向一个几何对象添加子对象,它们的区别是前者一次只能添加一个几何对象,而后者可以一次添加一个几何对象数组。除此之外,AddGeometry方法可以将子对象添加到几何的指定索引值的位置,而AddGeometries方法将子对象数组添加到集合的最后。
在使用AddGeometry方法添加子对象到Polygon对象的过程中,如果子对象即Ring出现覆盖现象,那么多边形就没有封闭或出现了包含关系,那么这个Polygon就不是简单Polygon,因此通过IGometryCollection来创建一个Polygon时,需要使用ITopologicalOperator 的Simplify方法保证其有效性。
.4.9.2ISegmentCollection接口
ISegmentCollection接口被Path,Ring,Polyline和Polygon四个类所实现,它们被称作是Segment集合对象,使用这个接口可以处理组成Segment集合对象中的每一个子Segment对象。使用ISegmentCollection接口可以为一个Segment集合对象添加,插入,删除Segment子对象。ISegmentCollection接口SetCircle和SetRectangle方法提供了一种简单不需要添加Segment的情况下构建一个完成的Path,Ring,Polyline和Polygon的方法。
2.4.9.3IPointCollection接口
IPointCollection可以被多个几何对象类所实现,这些对象都是由多个点构成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它们都可以称作PointCollection对象,通过IPointCollection接口定义的方法可以获取,添加,插入,查询,移除几何对象中的某个顶点。同以上两个接口一样它也定义了操作一个点集合对象的方法,例如通过AddPoint方法可以向PointCollection对象中的特定索引位添加一个点对象,如果不指定位置,则添加到最后。通过IPointCollection的Point属性通过顶点索引可以得到某一顶点。
在本章节最后的Demo 实例将为大家演示IPointCollection提供的功能。
2.4.10几何对象总结
在Geometry模型中的几何对象分为两种类型,一类是用来直接构建要素类的称为高级几何对象,一类用来构建高级几何对象相对低一级的几何对象成为构建几何对象如下表所示:
几何对象名称 |
所属类别 |
构成子几何对象 |
用于创建和编辑的接口 |
Polyline |
高级 |
Path |
IGeometryCollection, IPointCollection |
Polygon |
高级 |
Ring |
IGeometryCollection, IPointCollection |
MultiPoint |
高级 |
Point |
IGeometryCollection, IPointCollection |
MultiPatch |
高级 |
TrangleFan,Ring TrangleStrip ,Trangle, |
IGeometryCollection, IPointCollection |
Ring |
低级 |
Segment |
ISegmentCollection, IPointCollection |
Path |
低级 |
Segment |
ISegmentCollection, IPointCollection |
Segment |
低级 |
Point |
IPoint,ILine, ICurve |
TriangleFan |
低级 |
Point |
IGeometryCollection, IPointCollection |
TriangleStrip |
低级 |
Point |
IGeometryCollection, IPointCollection |
Triangle |
低级 |
Point |
IGeometryCollection, IPointCollection |
Point |
高级/低级 |
无 |
IPoint |