《gis二次开发几何形体对象Geometry.ppt》由会员分享,可在线阅读,更多相关《gis二次开发几何形体对象Geometry.ppt(70页珍藏版)》请在三一办公上搜索。
1、第5讲 几何对象与空间参考,王佳,本章内容,6.1 Geometry模型6.2 Point和MultiPoint对象6.3 Segment,Path,Ring和Polyline对象6.4 Polyline对象和曲线Curve6.5 Geometry集合接口6.6 动态跟踪6.7 空间参考6.8 程序开发实例,第一节 Geometry模型,Geometry是ArcObjects中使用最广泛的对象集之一新建、删除、编辑和进行地理分析空间选择、要素着色制作专题图、标注编辑Geometry模型中,几何形体对象被分为两个层次高级几何对象构件几何对象,而在ArcGIS Engine中和这个模型对应的对象如
2、下:,在这上面的模型图中,位于最上面的Geomtry是一个抽象的对象,因而在使用它的时候需要由其子类完成实例,在ArcGIS Engine中Geometry类实现IGometry接口,而IGeometry接口定义了所有几何对象通用的属性和方法,如投影,获取空间参考等,IGeometry接口的方法和属性如下:,其中IGeometry.Dimension属性获取几何对象的拓扑唯度,如返回0 就表示该几何对象为点对象或者多点多线,1表示该对象为多线,具体的可参看下图:,IGeometry.Envelope返回一个IEnvelope对象,Envelope是所有几何对象的外接矩形,用于表示几何对象的最小
3、边框,所有的几何对象都有一个Envelope对象,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax,XMin,YMax,YMin,Height,Width属性,下图为不同几何对象的Envelope:,IGeometry.SpatialReference用于返回该几何对象的空间参考信息。IGeometry.Project方法用于对该几何对象做参考系的转换。,包络线Envelope,包络线Envelope是一个矩形区域它是作为任何一个几何形体的最小边框区域而存在的每一个Geometry对象都拥有一个Envelope对象,即使是Envelope本身它也常常作为地图
4、的视图或地理数据库的范围和用户交互操作的结果而返回,IEnvelope接口,属性空间坐标XMax XMin YMax YMin Height Width四个角点的坐标:UpperLeft UpperRight LowerLeft LowerRight方法PutCoords:构造包络线的方法QueryCoords:查询包络线的Expand:按比例缩放包络线的范围offset:偏移包络线本身CenterAt:改变包络线的中心点Intersect:两个包络线相交的方法Union:两个包络线对象的并集,第二节 Point和MultiPoint对象,Point是一个0维的具有X、Y坐标的几何对象,具有三
5、种可以选择的属性,即Z值、M值和ID值。用于描述点类型的要素在寻址和符号化中使用用于组成一个网络NetWork任何几何对象都可以使用点来产生,世界的本质是物质,对于GIS来说,点就应该是矢量数据的本质,点生线,线生面,如此组合,构成了GIS世界中的矢量空间。,第二节 Point和MultiPoint对象,创建一个点的代码:IPoint pPoint=new PointClass();pPoint.PutCoords(x,y);,MultiPoint对象是一系列无序的点的群集,这些点具有相同的属性信息。例如可以用一个点集来表示整个城市天然气调压站。如下图所示:一个Multipoint对象由8个P
6、oint对象组成。,private object pMissing=Type.Missing;public IGeometry GetMultipointGeometry()const double MultipointPointCount=25;IPointCollection pPointCollection=new MultipointClass();for(int i=0;i MultipointPointCount;i+)pPointCollection.AddPoint(GetPoint(),ref pMissing,ref pMissing);return pPointColle
7、ction as IGeometry;private IPoint GetPoint()const double Min=-10;const double Max=10;Random pRandom=new Random();double x=Min+(Max-Min)*pRandom.NextDouble();double y=Min+(Max-Min)*pRandom.NextDouble();return ConstructPoint(x,y);,构建Multipoint对象,第三节 Segment,Path,Ring和Polyline对象,Segment几何对象,Segment对象是一
8、个有起点和终点的“线“,也就是说Segement只有两个点,至于两点之间的线是直的,还是曲的,需要其余的参数定义。所以Segment是由起点,终点和参数三个方面决定的。Segment有4个子类,它的4个子类(直线,圆弧,椭圆弧,贝赛尔曲线)如下图:,Path几何对象,Path是连续的Segment的集合,除了路径的第一个Segment和最后一个Segment外其余的Segment的起始点都是前一个Segment的终止点,即Path对象的中的Segment不能出现分离,Path可以是任意数的Segment子类的组合。,Path几何对象,该Path对象有很多我们经常用到的方法,如平滑曲线,对曲线抽
9、稀等操作,如下图:。,Ring几何对象,Ring是一个封闭的Path即起始和终止点有相同的坐标值,它有内部和外部属性。,Polyline几何对象,Polyline对象是由一个或多个相连或者不相连的path对象的有序集合,通常用来代表线状地物如道路,河流,管线等等.该对象在ArcGIS Engine中的模型图如下:,Polyline几何对象,在这个模型中,我们看到某些几何对象可以组合产生新的几何形体,如polyline由path构成,path又可以由segement组成,但是这并不意味着用户必须按照这种层次去构造polyline,实际上Point集合直接构成Polyline,组成Polyline
10、的这些路径既可以是连续的,也可以是不连续的,如下图:,Polyline几何对象,Polyline是有序path组成的集合,可以拥有M、Z和ID属性值,Polyline对象的IPointCollection接口包含了所有的节点信息,IGeometryCollection接口可以获取polyline的paths,ISegmentCollection接口可以获取 polyline的segments。一个Polyline对象必须满足以下准则:1.组成Polyline对象的所有Path对象必须是有效的。2.组成Polyline对象的所有Path对象不能重合,相交或自相交。3.组成Polyline对象的多
11、个Path对象可以连接与某一点,也可以分离。4.Path对象的长度不能为0.IPolyline是Polyline类的主要接口,IPolyline的Reshape方法可以使用一个Path对象为一个Polyline对象整形,IPolyline的SimplifyNetwork方法用于简化网络。Polyline对象可以使用IGeometryCollection接口添加Path对象的方法来创建,使用该接口需注意以下情况:1.每一个Path对象必须是有效的,或使用IPath:Simplify方法后有效。2.由于Polyline是Path对象的有序集合,所以添加Path对象时必须注意顺序和方向。3.为了保证
12、Polyline是有效的,可以创建完Polyline对象后使用ITopologicalOperator接口的Simplify方法。,Segment,Path,Ring和Polyline的区别,在这四者当中Segment是最小的单位具体的构成路线可以分为两个条:Segment-Path-Ring(封闭的Path)Segment-Path-Polyline 我们可以这样说Segment是Path,只不过是这个Path由一个Segment组成,Ring也是一种Path,只不过是一个起点和终点重合的Path,至于Polyline那就很明显了,他们的区别可以从下图看出:,第四节 Polygon对象和Cu
13、rve对象,Polylgon几何对象,Polylgon对象是由一个或多个Ring对象的有序集合,它可以是由单个Ring 对象构成,也可以使用多个Ring组成。Polygon通常用来代表有面积的多边形矢量对象,如行政区,建筑物等。Polygon的组成结构可以看下图:,从这个图上可以看出 Polygon是由Rings构成,而Ring又是由Segment构成,但是这并不意味着用户必须按照这种层次去构造Polygon,实际上用Point的集合可以构成Polygon,Polylgon几何对象,组成Polygon的是Ring,其中Ring可以分为Outer Ring(外环)和Inner Ring(内环)之
14、分。外环和内环都是有方向的,它们的区别是外环的方向是顺时针的,内环的方向是逆时针。如下图:,Polygon对象实现了一个接口IArea,而该接口用来对Poylgon的中心,重心,以及面积进行访问,下面片段用来获取Polygon的面积:IArea pArea=pPolygon as IArea;Double S=pArea.Area,Curve几何对象,除去Point,MultiPoint和Envelope外,其他所有的几何体都可以看做是Curve(曲线)。Line,Polyline,Polygon,CircularArc,BezierCurve,EllipticArc和CircularArc都
15、是曲线的一种,它们都实现了ICurve接口。,ICurve接口的Length属性用于返回一个Curve对象的长度。ICurve接口的FromPoint和ToPoint属性可以获得Curve对象的起止点。ICurve接口的Reverseorientation方法可以改变一个Curve对象的节点次序即调动Curve对象的起始点和终止点互相调换。ICurve接口的IsClosed属性则可以判断一个Curve对象起始点和终止点是否在一个位置上。,Curve几何对象,ICurve接口的GetSubcurve方法可以复制一条Curve对象的特定部分,例如一条10千米公路的Curve对象,获取2-5千米处的
16、公路的曲线代码片段如下所示:/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对象上某一点的曲线的切线和法线。,IConstructPoint接口,可以使用多达10种方法来创建所需要的点:ConstructAlong
17、沿线创建法ConstructAngleBisector角平分线创建法ConstructAngleIntersection构造角度交点ConstructAngleDistance构造角度距离点,IConstructPoint接口,可以使用多达10种方法来创建所需要的点:ConstructDeflection构造偏转角度点ConstructDeflectionIntersection构造偏移角交点ConstructOffset构造偏移点ConstructParallel构造平行线上点,IConstructPoint接口,可以使用多达10种方法来创建所需要的点:ConstructPerpendicu
18、lar构造垂直线上点ConstructThreePointResection后方交会定点,IPoint pt=mapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X,Y);IElement marker=new MarkerElementClass();marker.Geometry=pt;mapControl.ActiveView.GraphicsContainer.AddElement(marker,0);for(int j=0;j 6;j+)IConstructPoint construct=new P
19、ointClass();construct.ConstructAngleDistance(pt,j*2*3.14/6,5000);IElement mark=new MarkerElementClass();mark.Geometry=(IPoint)construct;mapControl.ActiveView.GraphicsContainer.AddElement(mark,0);mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);,ConstructAngleDistanc
20、e构造角度距离点,IConstructPointPtr ipCPoint;const double dDist=20000;double dAngleRad;IPointPtr ipNewPoint;ipFeatLayer-get_FeatureClass(,IConstructMultipoint接口,Multipoint对象也有众多构造方法ConstructArcPoints构造圆弧点ConstructDivideLength构造等长度点ConstructDivideEqueal构造等分点ConstructIntersection构造交点ConstructTangent构造切线点,第五节
21、Geometry集合接口,通过对具体的Geometry对象的介绍可知,除了Point对象之外,其他几何对象都是通过其他几何对象集合构建而成。如MultiPoint对象是点的集合,Path对象是Segment对象的集合,Polyline对象是Path对象的集合,Polygon对象是Ring对象的集合,Multipatch对象是Triangle Strip和Trangle Fan,Trangle,Ring对象的集合。,ArcGIS Engine提供了三个主要的几何图形集合接口用于对几何对象的操作,分别是IPointCollection,ISegmentCollection和IGeometryCol
22、lection,这些接口揭示出ArcGIS Engine的几何模型的实质它们是一种组合构成的模式,这种组合并不一定按照严格的层次结构组织。,IGeometryCollection接口,实现该接口的几何对象包括:PolygonRing、PolylinePath、MultiPointPoint、GeometryBag任何类型几何对象和MultiPatch、Triangle、TriangleStrip、TriangleFan等三维几何对象,IGeometryCollection接口,IGeometryCollection这个接口是具有相同类型的几何对象的集合,该接口的的Geometry 属性可以通过
23、一个索引值返回一个组成该几何对象的某个子对象,而GeometryCount返回组成该几何对象的子对象的数目。IGeometryCollection的AddGeometry和AddGeometries方法都用于向一个几何对象添加子对象,它们的区别是前者一次只能添加一个几何对象,而后者可以一次添加一个几何对象数组。除此之外,AddGeometry方法可以将子对象添加到几何的指定索引值的位置,而AddGeometries方法将子对象数组添加到集合的最后。在使用AddGeometry方法添加子对象到Polygon对象的过程中,如果子对象即Ring出现覆盖现象,那么多边形就没有封闭或出现了包含关系,那么
24、这个Polygon就不是简单Polygon,因此通过IGometryCollection来创建一个Polygon时,需要使用ITopologicalOperator 的Simplify方法保证其有效性。,ISegmentCollection接口,ISegmentCollection接口被Path,Ring,Polyline和Polygon四个类所实现,它们被称作是Segment集合对象,使用这个接口可以处理组成Segment集合对象中的每一个子Segment对象。使用ISegmentCollection接口可以为一个Segment集合对象添加,插入,删除Segment子对象。ISegmentC
25、ollection接口SetCircle和SetRectangle方法提供了一种简单不需要添加Segment的情况下构建一个完成的Path,Ring,Polyline和Polygon的方法。,IPointCollection接口,IPointCollection可以被多个几何对象类所实现,这些对象都是由多个点构成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它们都可以称作PointCollection对象,通过IPointCollection接口定义的方法可以获取,添加,
26、插入,查询,移除几何对象中的某个顶点。同以上两个接口一样它也定义了操作一个点集合对象的方法,例如通过AddPoint方法可以向PointCollection对象中的特定索引位添加一个点对象,如果不指定位置,则添加到最后。通过IPointCollection的Point属性通过顶点索引可以得到某一顶点。,总结:几何对象的分类,在Geometry模型中的几何对象分为两种类型,一类是用来直接构建要素类的称为高级几何对象,一类用来构建高级几何对象相对低一级的几何对象,总结:几何对象的分类,第六节 动态跟踪,在AO中可以通过移动一个Element的方法来达到这个目的。首先取得一条曲线上的点集,在计时器事
27、件中不断改变一个MarkerElement的Geometry属性,将它有顺序地设置为MultiPoint中不同的点,这样就可以让这个点元素在线上不断移动,第七节 空间参考,空间参考(Spatial Reference)是GIS数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确的坐标。在同一个地图上显示的地图数据的空间参考必须是一致的,如果两个图层的空间参考不一致,往往会导致两幅地图无法正确拼合,因此开发一个GIS系统时,为数据选择正确的空间参考非常重要。,在 ArcGIS 中,每个数据集都具有一个坐标系,该坐标系用于将数据集与通用坐标框架(如地图)内的其他地理数据图层集
28、成。通过坐标系可在地图中集成数据集,以及执行各种集成的分析操作,例如叠加不同的源和坐标系中的数据图层。,相关知识1大地水准面:大地水准面是由静止海水面并向大陆延伸所形成的不规则的封闭曲面。它是重力等位面,即物体沿该面运动时,重力不做功(如水在这个面上是不会流动的)。因为地球的质量并非在各个点均匀分布,因此重力的方向也会相应发生变化,所以大地水准面的形状是不规则的,如下图:,相关知识2地球椭球体:大地水准面的形状也是不规则的,仍不能用简单的数学公式表示,为了测量成果的计算和制图的需要,人们选用一个同大地水准面相近的可以用数学方法来表达的椭球体来代替,简称地球椭球体,它是一个规则的曲面,是测量和制
29、图的基础,因地球椭球体是人们选定的跟大地水准面很接近的规则的曲面,所以地球椭球体就可以有多个,地球椭球体是用长半轴、短半轴和扁率来表示的。下表列出了一些最常见的参考椭球:,相关知识3基准面:基准面是在特定区域内与地球表面极为吻合的椭球体。椭球体表面上的点与地球表面上的特定位置相匹配,也就是对椭球体进行定位,该点也被称作基准面的原点。原点的坐标是固定的,所有其他点由其计算获得。,基准面的坐标系原点往往距地心有一定偏移(有的也在地心,如WGS1984),如西安80的基准面和北京54的基准面.因为椭球体通过定位以便能更好的拟合不同的地区,所以同一个椭球体可以拟合好几个基准面.因为原点不同,所以不同的
30、基准面上,同一个点的坐标是不相同的,这点我们应该清楚.下面以华盛顿州贝灵厄姆市为例来说明。使用 NAD27、NAD83 和 WGS84 以十进制为单位比较贝灵厄姆的坐标。显而易见,NAD83 和 WGS84 表示的坐标几乎相同,但 NAD27 表示的坐标则大不相同,这是因为所使用的基准面和旋转椭球体对地球基本形状的表示方式不同。,相关知识4地图投影:简单的说地图投影就是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方法。,相关知识2地球椭球体:大地水准面的形状也是不规则的,仍不能用简单的数学公式表示,为了测量成果的计算和制图的需要,人们选用一个同大地水准面相近的可以用数学方法来
31、表达的椭球体来代替,简称地球椭球体,它是一个规则的曲面,是测量和制图的基础,因地球椭球体是人们选定的跟大地水准面很接近的规则的曲面,所以地球椭球体就可以有多个,地球椭球体是用长半轴、短半轴和扁率来表示的。下表列出了一些最常见的参考椭球:,相关知识2地球椭球体:大地水准面的形状也是不规则的,仍不能用简单的数学公式表示,为了测量成果的计算和制图的需要,人们选用一个同大地水准面相近的可以用数学方法来表达的椭球体来代替,简称地球椭球体,它是一个规则的曲面,是测量和制图的基础,因地球椭球体是人们选定的跟大地水准面很接近的规则的曲面,所以地球椭球体就可以有多个,地球椭球体是用长半轴、短半轴和扁率来表示的。
32、下表列出了一些最常见的参考椭球:,两种坐标系统,地理坐标系统:以经纬度为地图存储单位投影坐标系统:是将三维地理坐标系统上的经纬网投影到二维平面地图上使用的坐标系统(等角投影、等积投影、正形投影等),地图单位通常为米,地理坐标系:地理坐标系也可称为真实世界的坐标系,是用于确定地物在地球上位置的坐标系,它用经纬度来表示地物的位置,经度和纬度是从地心到地球表面上某点的测量角,通常以度或百分度为单位来测量该角度。下图将地球显示为具有经度和纬度值的地球。,地理坐标系(GCS)是基于基准面的使用三维球面来定义地球上的位置,GCS 往往被误称为基准面,而基准面仅是 GCS 的一部分,GCS 包括角度测量单位
33、、本初子午线和基准面。下图来自ArcGIS说明了了地理坐标系的组成:,投影坐标系:基于地理坐标系,它使用基于X,Y值的坐标系统来描述地球上某个点所处的位置,可以这样认为投影坐标系=地理坐标系(如:北京54、西安80、WGS84)+投影方法(如:高斯克吕格、Lambert投影、Mercator投影)+线性单位。下图来自ArcGIS说明了投影坐标系的组成:,ArcGIS Engine对空间参考支持,ArcGIS Engine提供了一系列对象供开发者管理GIS系统的坐标系统。对大部分开发者而言了解ProjectedCoordinateSystem,GeographicCoordinateSystem
34、,SpatialReference Environment这三个组件类是非常有必要的,对于高级开发者而言,可能需要自定义坐标系统可以使用这些对象Projection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。在ArcGIS中除了我们上面介绍的两种坐标系,还有一种称之为Unknown的坐标系,这种坐标系是当我们的数据没有坐标(jpg等文件)或者坐标文件丢失的时候ArcMap不能识别数据的投影信息而赋予的,在ArcGIS Engine中下面三个类分别对应了三个坐标系:,利用ArcGIS Engine创建一个坐标系或者基准
35、面用的是SpatialReferenceEnvironmentClass类,该类实现了ISpatialReferenceFactory接口,该接口定义了创建坐标系,基准面等方法和属性,如下图:,在利用ISpatialReferenceFactory创建坐标系的时候往往需要一个int类型的参数,这个int其实就是这些坐标系的代号,如我们熟悉的4326就是WGS1984,下面为部分截图:,获取图层空间参考,private void geoRefToolStripMenuItem_Click(object sender,EventArgs e)MessageBox.Show(axMapControl
36、1.Map.SpatialReference.Name);ISpatialReferenceDialog ipDialog=new SpatialReferenceDialogClass();ISpatialReference sr=ipDialog.DoModalEdit(axMapControl1.Map.SpatialReference,true,false,false,false,false,0);,获取图层空间参考,void CMyMapView:OnGetReference()IGeoFeatureLayerPtr iplayer;iplayer=GetLyrByName(jumi
37、ndian_changsha);IFeatureClassPtr ipFeatureClass;iplayer-get_FeatureClass(,设置图层空间参考,void CMyMapView:OnSetReference()IGeoFeatureLayerPtr iplayer;iplayer=GetLyrByName(jumindian_changsha);IFeatureClassPtr ipFeatureClass;iplayer-get_FeatureClass(,使用空间参考对话框,void CMyMapView:OnReferenceDlg()ISpatialReferencePtr ipSpatialRef;ISpatialReferenceDialogPtr ipDialog(CLSID_SpatialReferenceDialog);m_ipMap-get_SpatialReference(,第八节 程序开发实例,采用前方交会的方法实现火点添加实现符号化的救火车在路上的动态跟踪,