GIS二次开发05
第四讲 几何对象和空间参考
2011.04.01
主要内容
几何对象 坐标系统和空间参考 空间变换
几何对象
GeometryEnvironment
创建几何对象,并且控制几何方法的实现方式 单键对象,不管new多少次,都只有一个实例对象 几何对象的外包矩形 空间投影与几何对象的空间投影相同
坐标系统与空间参考
ISpatialReferenceFactory接口包含三类方 法
返回单个对象 返回相同类型的一系列对象 从prj文件或prj字符串中导入或导出空间投影对象的 方法
第二种方法
private void PrintPreDefinedProjections() { ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass(); ISet projectionSet = spatialReferenceFactory.CreatePredefinedProjections(); System.Windows.Forms.MessageBox.Show("Number of predefined Projections = " + projectionSet.Count); projectionSet.Reset(); for (int i = 0; i < projectionSet.Count; i++) { IProjection projection = projectionSet.Next()as IProjection; System.Windows.Forms.MessageBox.Show(); } }
private void ConstructCoordinateSystem(bool highPrecision) { ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass(); ISpatialReference3 spatialReference = spatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile( "C :\\Program Files\\ArcGIS\\Coordinate Systems\\Geographic Coordinate Systems\\World\\WGS 1984.prj")as ISpatialReference3; IControlPrecision2 controlPrecision = spatialReference as IControlPrecision2; //Determines whether you are constructing a high- or low-precision spatial reference. controlPrecision.IsHighPrecision = highPrecision; ISpatialReferenceResolution spatialReferenceResolution = spatialReference as ISpatialReferenceResolution; //These three methods are the keys; construct horizon, then set the default x,y resolution and tolerance. spatialReferenceResolution.ConstructFromHorizon(); //Set the default x,y resolution value. spatialReferenceResolution.SetDefaultXYResolution();
Envelope
几何对象
GeometryBag
所有几何对象都可以添加到GeometryBag对象中 不仅可以作为几何对象的容器,还可以对包含的几何 对象进行空间操作,如作为 ITopologicalOperator.ConstructUnion 方法 的参数 在添加几何对象之前,最好定义该对象的投影,添加 的几何对象的投影与该投影相同
几何对象
几何对象
MultiPatch
三维多面体对象 组成MultiPatch的部分包括:
TriangleStrips, TriangleFans, Triangles, rings(不 同于二维的ring) 拉伸、挤压Polyline,Polygon 通过IConstructMultiPatch接口,IExtrude接口 (GeometryEnvironment)构建MultiPatch对象
坐标系统与空间参考
SpatialReferenceEnvironment
单件模式,无论用new实例化多少次,实际上只生成 一个对象 ArcObjects中包含大量已经定义好的空间投影系统, 每个空间投影系统通过Factory code进行区分 Factory code通过esriSR枚举值指定,一般不用整 数值代替,因为整数值所代表的含义偶尔会发生变化 ISpatialReferenceFactory提供根据Factory code创建空间投影对象的方法
低分辨率与高分辨率投影之间的转换
private void LowHighConversion_Example(IFeatureClass pre92FeatureClass) { IGeoDataset pre92GeoDataset = pre92FeatureClass as IGeoDataset; ISpatialReference pre92SpatialReference = pre92GeoDataset.SpatialReference; double falseX; double falseY; double xyUnits; pre92SpatialReference.GetFalseOriginAndUnits(out falseX, out falseY, out xyUnits) ; System.Windows.Forms.MessageBox.Show( "Low precision coordinate grid definition:\n" + "false x: " + falseX + ", false y: " + falseY + ", scale factor: " + xyUnits);
几何对象
Point
二维点 多点,有序二维点集合 二维线,有序二维Path的集合 IPointCollection接口获取并操作Polyline对象的顶点集合的 副本 IGeometryCollection接口可以获取Polyline对象的Path集 合 ISegmentCollection接口可以获取Polyline对象的 Segment集合
几何对象
BufferConstruction
缓冲区构建对象 来自IBufferConstruction bc = new BufferConstruction(); Buffer = bc.Buffer(myInputGeometry, distance);
IBufferConstructionProperties提供缓冲区构建时新的选 项 线对象可以生成左半边缓冲区或右半边缓冲区 多边形的缓冲区生成时可以排除内部的多边形 缓冲区重叠时会融合在一起 单独的多边形可以合并在一起,即使缓冲区不重叠 不同类型的几何对象可以一起生成缓冲区 同一个几何对象集合可以在周围生成多个缓冲区 不同的要素可以以不同的距离生成缓冲区 构建缓冲区时会生成临时文件,结束后会删除
几何对象
几何对象
Surface Normals in MultiPatchs
每个点的法线
Materials and Textures
Materials指三维图形的外观,包括颜色,透明度, 可选的纹理 Texture:纹理,栅格图片,贴在MultiPatch的面 上 创建带纹理的MultiPatch应使用 GeometryMaterial、GeometryMaterialList、 GeneralMultiPatchCreator对象
MultiPoint
Polyline
几何对象
几何对象
Polygon
多边形,按包含关系排序的Ring集合,每个Ring是 Segment的集合 通过IPointCollection接口获取组成多边形的顶点 集合的副本 通过IGeometryCollection接口获取组成多边形的 Ring集合 通过ISegmentCollection接口获取组成多边形的 Segment集合
第三种方法
private IProjectedCoordinateSystem LoadProjectedCoordinateSystem() { ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass(); IProjectedCoordinateSystem projectedCoordinateSystem = spatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile( "C :\\Program Files\\ArcGIS\\Coordinate Systems\\Projected Coordinate Systems\\World\\Mollweide (world).prj")as IProjectedCoordinateSystem; return projectedCoordinateSystem; }