1ArcGISEngine中的几何对象•课题:第三讲几何对象•目的要求:通过本章的学习,学习了解GIS二次开发中用到的各种几何对象,如Geometry对象、Envelope对象、Curve对象等。•教学重点:掌握GIS二次开发中的各种几何对象•教学难点:实际开发中熟练应用各种几何对象•教学课时:6•学术前沿:3主要内容•Geometry对象•Envelope对象•Curve对象Segment对象Path对象Ring对象PolyCurve对象•点对象•线对象•面对象GeometryEnvelopePointCurveMultipointPathSegmentPolyCurveRingPolylinePolygonBezierCurCircularArEllipticArLineGeometry主要对象模型4Geometry对象Geometry对象具有坐标信息,它确定了要素在地球上的位置。Geometry对象具有如下特征:•用户可以通过空间过滤器(SpatialFilter)对这些要素进行空间查询操作;•可以进行空间运算,如缓冲区分析、相交、合并等。Geometry对象及其坐标信息Geometry对象的空间查询5Geometry对象Geometry类是所有几何形体对象的父类,是一个抽象类,Geometry类实现了IGeometry接口。Geometry类和Geometry对象的关系是什么?Geometry类和IGeometry接口的关系是什么?IGeometry接口的主要属性和方法:Dimension—查询几何形体对象的维度;Project—设置几何对象的空间参考属性;GeometryType—返回对象的几何类型;IsEmpty—查看对象是否为空。?6Geometry对象C:\ProgramFiles\ArcGIS\DeveloperKit\Diagrams\GeometryObjectModel.pdf7Geometry对象例:添加Geometry对象PrivatevoidAddFeature(stringLayerName,IGeometryGeometry){FeatureCursor=FeatureClass.Insert(true);FeatureBuffer.shape=Geometry;objectFeatureOID=FeatureCursor.InsertFeature(FeatureBuffer);FeatureCursor.Flush();}•思考题:•1.各几何对象有哪些重要属性和方法?•2.如何在某个图层中添加点、线、面要素?请写出关键代码。•教学总结:•本次课程介绍了ArcGISEngine开发中用到的各种几何对象,重点在于理解这些对象及其属性、方法,并能在实际开发中熟练运用这些属性和方法。Envelope对象•Envelope也称包络线,是一个矩形区域,是每个几何形体的最小外接矩形。2GIS二次开发湖南城市学院属性:•XMax•Xmin•YMax•Xmin•Height•Width方法:•Expand•Offset•CenterAt•PutCoords•Intersect•UnionCurve对象•曲线对象。除了点、点集、包络线外,可以将其他的几何体都看做是曲线(Curve),如Line、Polyline、Path、CircularArc、Polygon等,这些对象都实现了ICurve接口。3GIS二次开发湖南城市学院主要属性:•FromPoint•ToPoint•ReverseOrientation•IsCloseICurve说明:ICurve接口的属性和方法,只能操作已有曲线对象,不能用于产生新的曲线对象。Curve对象4GIS二次开发湖南城市学院Curve对象子对象SegmentPathRingPolyCurveCircularArcLineEllipticArcBezierCurveCurve对象-Segment对象•Segment是由一个起点和终点,以及定义这两点之间的曲线函数组成的几何形体对象。•Segment对象是有Curve对象继承而来,因此拥有Curve对象的方法和属性。5GIS二次开发湖南城市学院ISegment是Segment对象的主要接口,该接口提供了两个方法:•SplitAtDistance•SplitDivideLength注意:在分割Segment前会自动复制一份副本,然后对副本进行分割,分割操作对源对象不产生影响。Curve对象-Segment-CircularArc•CircularArc的主要接口为ICircularArc,主要属性:6GIS二次开发湖南城市学院FromAngleToAngleCentralAngleCenterPointChordHeightIsLineIsPointIsMinorIsCounterClockwiseCircularArc对象可用IConstructCircularArc接口提供的方法进行构造,该接口提供了34种构造方法。Curve对象-Segment-Line•由起点和终点构成的一条直线段,用于构造Polyline、Polygon、Ring和Path等对象。7GIS二次开发湖南城市学院ILine•QueryCoords•PutCoordsLineIConstructLine•ConstructAngleBisectoris•ConstructExtendedCurve对象-Path对象•连续多个Segment对象的集合,每个Segment通过首尾相连构成一条路径。IPath是Path对象的主要接口。•Path对象可以由两种途径构造:使用ISegmentCollection接口的AddSegment方法为Path对象添加子元素;使用IConstructPath接口的ConstructRigidStretch方法,旋转或缩放一个已经存在的Path对象的形状。8GIS二次开发湖南城市学院点对象•点对象为0维的具有X、Y坐标的几何对象,没有任何形状,可用来描述点类型的要素。•Geometry中的任何类型都是由点对象产生的。•点集:具有相同属性的点的集合,用于构成高级几何对象。•IPoint接口定义了Point对象的属性和方法。Point对象可以用IPoint接口的PutCoords方法创建,也可以用IConstructPoint接口创建。9GIS二次开发湖南城市学院点对象•IConstructPoint接口提供了10种创建Point对象的方法:10GIS二次开发湖南城市学院ConstructAlong沿线创建法ConstructAngleBisector角平均线构建法ConstructAngleDistance构造偏转角度法ConstructAngleIntersection构造角度交点法ConstructDeflection构造偏转角度法ConstructDeflectionIntersection构造偏转角交点法ConstructOffset构造偏移点法ConstructParallel构造平行线上点法ConstructPerpendicular构造垂直线上点法ConstructThreePointResection后方交会定点法点对象•Multipoint对象是具有相同结构的点的集合,通过使用Add方法来添加一个点到集合中。•IConstructMultipoint接口定义了Multipoint对象的属性和方法,接口中定义了5种构造方法:11GIS二次开发湖南城市学院ConstructArcPoints构造圆弧点ConstructDivideEqual构造等分点法ConstructDivideLength构造等长点法ConstructIntersection构造交点法ConstructTangent构造切线法线、面对象•Polyline(多义线)对象是相连或不相连的路径(Path)对象的有序集合。•组成Polyline的Path对象都是有效的,Path不会重合、相交或自相交。•Polygon对象是一个有序Ring对象的集合,外部Ring方向是顺时针的,内部Ring方向是逆时针的。•IPolygon接口是Polygon对象的主要接口,它定义了一系列的方法和属性来控制Ring。•Polygon对象也可以使用IGeometryCollection的AddSegment方法添加Ring来产生。12GIS二次开发湖南城市学院面对象•IPolygon对象的主要属性和方法:ExteriorRingCount属性返回一个Polygon对象的外部环的数目;InteriorRingCount属性返回一个Polygon对象的内部环的数目;QueryExteriorRings查询全部外部环;QueryInteriorRings查询全部内部环。13GIS二次开发湖南城市学院21例:在某个图层中添加新的要素思路:1、设置要素保存的图层(Layer);2、通过在地图控件中绘制图形,获取要添加的Geometry对象;3、调用自定义的AddFeature方法,将Geometry对象添加到Layer图层中。设置图层(Layer)获取Geometry对象调用AddFeature方法22程序界面23AddFeature方法关键代码一、方法名称及参数privatevoidAddFeature(stringstrLayerName,IGeometrypGeometry)二、设置图层ILayerpLayer=null;for(inti=0;iaxMapControl1.LayerCount;i++){pLayer=axMapControl1.get_Layer(i);if(pLayer.Name.Equals(strLayerName)){break;}}24三、定义相关变量IFeatureLayerpFeatureLayer=pLayerasIFeatureLayer;IFeatureClasspFeatureClass=pFeatureLayer.FeatureClass;IDatasetpDataset=pFeatureClassasIDataset;IWorkspacepWorkspace=pDataset.Workspace;四、开始编辑IWorkspaceEditpWorkspaceEdit=pWorkspaceasIWorkspaceEdit;pWorkspaceEdit.StartEditing(true);pWorkspaceEdit.StartEditOperation();IFeatureBufferpFeatureBuffer=pFeatureClass.CreateFeatureBuffer();IFeatureCursorpFeatureCursor=pFeatureClass.Search(null,true);25三、插入新的对象pFeatureCursor=pFeatureClass.Insert(true);pFeatureBuffer.Shape=pGeometry;objectpFeatureOID=pFeatureCursor.InsertFeature(pFeatureBuffer);pFeatureCursor.Flush();四、结束编辑pWorkspaceEdit.StopEditOperation();pWorkspaceEdit.StopEditing(true);System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);26问题:如何获取Geometry对象?axMapControl1.TrackLine();返回值为IGeometry对象