ArcGIS Geometry对象介绍

您所在的位置:网站首页 gis处理、管理的对象不包括 ArcGIS Geometry对象介绍

ArcGIS Geometry对象介绍

2024-04-05 02:10| 来源: 网络整理| 查看: 265

        Geometry是一种基本类。它是一种抽象类。是ArcGIS Engine中使用最为广泛的对象集之一,用户在创建、删除、编辑和进行地理分析的时候,就是处理一个包含几何形体的矢量对象;除了显示要素以外,控件对象选择,要素符号化,标注要素,编辑要素都需要Geometry参与。

 

        在Geometry模型中的几何对象分为两种类型,一类是用来直接构建要素类的称为高级几何对象,一类用来构建高级几何对象的相对低一级的几何对象称为构建几何对象如下表所示。

几何对象名称中文名所属类别构成子几何对象用于创建和编辑的接口Polyline多义线高级PathIGeometryCollection,IPointCollectionPolygon多边形高级RingIGeometryCollection,IPointCollectionMultiPoint点集高级PointIGeometryCollection,IPointCollectionMultiPatch多面体高级

TrangleFan,Ring,

TrangleStrip,Trangles

IGeometryCollection,IPointCollectionRing环低级SegmentISegmentCollection,IPointCollectionPath路径低级SegmentISegmentCollection,IPointCollectionSegment线低级PointIPoint,ILine, ICurveTriangleFan三角扇低级PointIGeometryCollection,IPointCollectionTriangleStrip三角片低级PointIGeometryCollection,IPointCollectionTriangles三角形低级PointIGeometryCollection,IPointCollectionPoint点高级/低级无IPoint 几何对象

1、Point:是一个0维的几何图形,具有X,Y坐标值,以及一些可选的属性:如高程值(Z值),度量值(M值)。

2、MultiPoint:点集对象是一系列无序的点的群集,这些点具有相同的属性信息。例如可以用一个点集来表示整个城市天然气调压站。以下代码片段演示如何构建Multipoint对象。

//定义第一个点 IPoint pPoint1 = new PointClass(); pPoint1.X = 100; pPoint1.Y = 100; //定义第二个点 IPoint pPoint2 = new PointClass(); pPoint2.PutCoords(200, 200); //……构建其他点 IPointCollection pMultipoint = new MultipointClass(); object o = Type.Missing; //添加第一个点,不需要设置点的顺序,参数设置为Type.Missing pMultipoint.AddPoint(pPoint1, ref o, ref o); //添加第二个点,不需要设置点的顺序,参数设置为Type.Missing pMultipoint.AddPoint(pPoint2, ref o, ref o); //……添加其他点

3、Segment:是一个有起点和终点的“线“,也就是说Segement只有两个点,至于两点之间的线是直的,还是曲的,需要其余的参数定义。所以Segment是由起点,终点和参数三个方面决定的。Segment 有4个子类,直线 Line,圆弧 CircularArc,椭圆弧 EllipticArc,贝赛尔曲线 BezierCurve。

4、Path:是连续的Segment的集合,除了路径的第一个Segment和最后一个Segment外,其余的Segment的起始点都是前一个Segment的终止点,即Path对象的中的Segment不能出现分离。一个或多个Path组成一个Polyline对象。

5、Ring:是一个封闭的Path即起始和终止点有相同的坐标值。它有内部和外部属性。一个或多个Ring对象组成一个Polygon对象。

6、Polyline:是由一个或多个相连或者不相连的path对象的有序集合。Polyline通常用来代表线状地物如道路,河流,管线等等。 一个Polyline对象必须满足以下准则: 1).组成Polyline对象的所有Path对象必须是有效的。 2).组成Polyline对象的所有Path对象不能重合,相交或自相交。 3).组成Polyline对象的多个Path对象可以连接与某一点,也可以分离。 4).Path对象的长度不能为0。IPolyline是Polyline类的主要接口,IPolyline的Reshape方法可以使用一个Path对象为一个Polyline对象整形,IPolyline的SimplifyNetwork方法用于简化网络。 Polyline对象可以使用IGeometryCollection接口添加Path对象的方法来创建,使用该接口需注意以下情况: 1).每一个Path对象必须是有效的,或使用IPath::Simplify方法后有效。 2).由于Polyline是Path对象的有序集合,所以添加Path对象时必须注意顺序和方向。 3).为了保证Polyline是有效的,可以创建完Polyline对象后使用ITopologicalOperator接口的Simplify方法。 以下代码片段为使用IGeometryCollection接口创建一个Polyline对象。

//定义第一个点 IPoint pPoint1 = new PointClass(); pPoint1.X = 100; pPoint1.Y = 100; //定义第二个点 IPoint pPoint2 = new PointClass(); pPoint2.X = 200; pPoint2.Y = 200; //创建一个Line对象 ILine pLine = new LineClass(); //设置Line对象的起始终止点 pLine.PutCoords(pPoint1, pPoint2); //QI到ISegment ISegment pSegment = pLine as ISegment; //创建一个Path对象 ISegmentCollection pPath = new PathClass(); object o = Type.Missing; //通过ISegmentCollection接口为Path对象添加Segment对象 pPath.AddSegment(pSegment, ref o, ref o); //创建一个Polyline对象 IGeometryCollection pPolyline = new PolylineClass(); //通过IGeometryCollection为Polyline对象添加Path对象 pPolyline.AddGeometry(pPath as IGeometry, ref o, ref o);

以下代码片段为通过点集生成线:

//通过点集生成线 IPolyline polyline = new PolylineClass(); //思路是通过点集接口IPointCollection添加线的点,创建线和面同样可用此方法 IPointCollection pointColl = polyline as IPointCollection; IPoint point = new PointClass(); point.PutCoords(100, 200); pointColl.AddPoint(point); point = new PointClass(); point.PutCoords(300, 100); pointColl.AddPoint(point); //通过点集生成线 完成~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //获取线的起点和终点 IPoint pointStart = polyline.FromPoint; IPoint pointEnd = polyline.ToPoint; //获取线的长度 double length = polyline.Length; //获取线的矩形范围(envelop),面的获取方式也一样 IEnvelope envelope = polyline.Envelope; //获取线是否是闭合的线 bool isClosed = polyline.IsClosed; //把线的方向反转,就是起点和终点,点的顺序反转 polyline.ReverseOrientation(); //获取线的所有点,对于面同样可用此方法 for (int i = 0; i < pointColl.PointCount; i++) { IPoint point1 = pointColl.Point[i]; }

7、Polylgon:是由一个或多个Ring对象的有序集合,它可以是由单个Ring对象构成,也可以使用多个Ring组成。其中Ring可以分为Outer Ring(外环)和Inner Ring(内环)之分。外环和内环都是有方向的,它们的区别是外环的方向是顺时针的,内环的方向是逆时针。Polygon通常用来代表有面积的多边形矢量对象,如行政区,建筑物等。Polygon是由 Ring 构成,而Ring又是Segment构成,但是这并不意味着用户必须按照这种层次去构造 Polygon,实际上用 Point 的集合可以构成Polygon,生成面时点集要求第一个点做坐标和最后一个点的坐标一样,也可理解为同一个点添加了两次,否则会出错。        以下代码片段演示如何构建一个Polygon。

//创建一个Ring对象,通过ISegmentCollection接口向其中添加Segment对象 ISegmentCollection pSegCollection = new RingClass(); object o = Type.Missing; pSegCollection.AddSegment(pSegment1, ref o, ref o); pSegCollection.AddSegment(pSegment2, ref o, ref o); //QI到IRing接口封闭Ring对象,使其有效 IRing pRing = pSegCollection as IRing; pRing.Close(); //使用Ring对象构建Polygon对象 IGeometryCollection pGeometryColl = new PolygonClass(); pGeometryColl.AddGeometry(pRing, ref o, ref o);

       Polygon对象实现了一个接口 IArea,而该接口用来对 Poylgon 的中心、重心,以及面积进行访问,下面片段用来获取 Polygon 的面积:

IArea pArea = pPolygon as IArea; double S = pArea.Area;

8、Envelope:是所有几何对象的外接矩形,用于表示几何对象的最小边框,所有的几何对象都有一个Envelope对象,不过点的envelop没有意义,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax,XMin,YMax,YMin,Height,Width属性。通过IEnvelope的Expand方法还可以按比例缩放Envelope对象的范围。CenterAt方法把矩形中心点移到某个点(实际是整个矩形移动)。

//通过坐标创建矩形 IEnvelope envelope2 = new EnvelopeClass(); envelope2.PutCoords(100, 200, 300, 400);

9、Curve:除去Point,MultiPoint和Envelope外,其他所有的几何体都可以看做是Curve(曲线)。Line,Polyline,Polygon,CircularArc,BezierCurve,EllipticArc和CircularArc都是曲线的一种,它们都实现了ICurve接口。Length属性用于返回一个Curve对象的长度。FromPoint和ToPoint属性可以获得Curve对象的起止点。Reverseorientation方法可以改变一个Curve对象的节点次序即调动Curve对象的起始点和终止点互相调换。IsClosed属性则可以判断一个Curve对象起始点和终止点是否在一个位置上。ICurve接口的GetSubcurve方法可以复制一条Curve对象的特定部分,例如一条10千米公路的Curve对象,获取2-5千米处的公路的曲线代码片段如下所示。

//QI到ICurve接口 ICurve pCurve = pPolyline as ICurve; //创建一个Polyline对象 ICurve pNewCurve = new PolylineClass(); bool btrue = true; //获取2-5千米间的曲线对象 pCurve.GetSubcurve(2, 5, btrue, out pNewCurve);

此外ICurve的QueryTangent和QueryNormal方法分别用于获取Curve对象上某一点的曲线的切线和法线。

10、TriangelStrip:是由一系列点定义的曲面片组成,而曲面片是有若干个三角形所组成,所以这个曲面可以定义为:(0,1,2) ,(2, 1, 3), (2, 3, 4), (4, 3, 5)。

11、Trangle Fan:一个Trangle Fan对象由一系列点定义的曲面片组成,所不同的是所有的三角形共享一个顶点。所以这个曲面可以定义为:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。

12、Triangles:由三个点所确定,一个Triangles可定义为(0,1,2)等。

13、Multipatch:用于描述3D图形,可以由TriangleStrip,TriangleFan,Triangles和ring对象组合构成组成。Multipatch可以通过多种方式创建,一种是通过导入外部3D格式数据文件(3D Studio Max .3ds files, OpenFlight .flt files, COLLADA .dae files, Sketchup .skp files, VRML .wrl files),另外ArcGIS Engine提供了多种创建Multipatch几何对象的方法:    1)如果创建没有贴图纹理,没有法向,没有组成部分信息的Multipatch时,只需创建好组成的Multipatch的各个部分即可,然后通过MultiPatch的IGeometryCollection接口添加各个组成部分即可。    2)如果要为Multipatch每个组成部分添加纹理信息,法向信息,属性信息就必须使用GeneralMultiPatchCreator对象来创建,通过其IGeneralMultiPatchInfo接口来为MultiPatch各个组成部分定义法向,材质,属性信息。通过IGeneralMultiPatchInfo接口可以获取这些MultiPatch的各个组成部分的信息。    3)通过IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment对象可以通过拉伸Polyline对象(拉伸为墙)和Polygon对象(拉伸为多面体)来创建MultiPatch.    4)通过访问3D符号库,获取3DSymbol来渲染点,把三维符号放置在点的位置从而生成Multipatch。接下来介绍通过GeneralMultiPatchCreator创建一个有纹理MultiPatch的方法,需要使用以下三个对象:     GeometryMaterial:用于构建材质,通过IGeometryMaterial创建的材质可以作为TextureLineSymbol或者TextureFillSymbol属性用来创建这些符号,也可以把它添加到GeometryMaterialList对象中,用于GeneralMultipatchCreator对象构建Multipatch对象。     GeometryMaterialList:材质对象的容器用于GeneralMultiPatchCreator对象调用Init方法时使用。     GeneralMultiPatchCreator:用于创建有纹理的贴图的Multipatch。

集合接口

        通过前面对于具体的Geometry对象的介绍可知,除了Point对象之外,其他几何对象都是通过其他几何对象集合构建而成。如MultiPoint对象是点的集合,Path对象是Segment对象的集合,Polyline对象是Path对象的集合,Polygon对象是Ring对象的集合,Multipatch对象是Triangle Strip和Trangle Fan, Trangles,Ring对象的集合。

//获取几何类型,可以区分出点,线,面等 esriGeometryType geometryType = geometry.GeometryType;

         ArcGIS Engine提供了三个主要的几何图形集合接口用于对几何对象的操作,分别是IPointCollection,ISegmentCollection和IGeometryCollection,这些接口揭示出ArcGIS Engine的几何模型的实质——它们是一种组合构成的模式,这种组合并不一定按照严格的层次结构组织。在前面介绍一些几何对象的时候,也给大家演示了部分使用功能,以下三个接口在程序开发中经常使用到,接下来简单阐述以下这三个接口的使用方法。

1、IGeometryCollection接口

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方法保证其有效性。

2、ISegmentCollection接口

        ISegmentCollection接口被Path,Ring,Polyline和Polygon四个类所实现,它们被称作是Segment集合对象,使用这个接口可以处理组成Segment集合对象中的每一个子Segment对象。使用ISegmentCollection接口可以为一个Segment集合对象添加,插入,删除Segment子对象。ISegmentCollection接口SetCircle和SetRectangle方法提供了一种简单不需要添加Segment的情况下构建一个完成的Path,Ring,Polyline和Polygon的方法。

3、IPointCollection接口

        IPointCollection可以被多个几何对象类所实现,这些对象都是由多个点构成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它们都可以称作PointCollection对象,通过IPointCollection接口定义的方法可以获取,添加,插入,查询,移除几何对象中的某个顶点。同以上两个接口一样它也定义了操作一个点集合对象的方法,例如通过AddPoint方法可以向PointCollection对象中的特定索引位添加一个点对象,如果不指定位置,则添加到最后。通过IPointCollection的Point属性通过顶点索引可以得到某一顶点。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3