logo资料库

arcgis开发生成剖面线.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
剖面图,就是在具有高程值的 raster 上画一条直线,这条直线上的每个点除了 x,y 坐标为更 具附加了高程值,便可画出高程值随直线的一个曲线图。高程值只是一个最简单的例子,当 raster 不是以高程值而是以某个我们想要的值来渲染的时候,这条曲线图便表达的是,随直 线变化而变化的某个值的曲线图,开始做这个的时候遇到了一些无法解释的困难,如 Com 组件错误等,这里参考了韩鹏的<>,这里推荐一下,这是本好书,值得拥 有啊,以下是我的代码,我用的是 ArcgisEngine 来做的,不过 ArcgisServer 也可以实现 //得到要做剖面分析的面 IRasterLayer layer = this.axMapControl1.Map.get_Layer(0) as IRasterLayer; IRasterSurface rasterSurf = new RasterSurfaceClass(); rasterSurf.PutRaster(layer.Raster, 0); ISurface surface = rasterSurf as ISurface; //得到画的直线 IPolyline inputLine = new PolylineClass(); IPoint start = new PointClass(); start.X = -96.522; start.Y = 25.589; inputLine.FromPoint = start; IPoint end = new PointClass(); end.X = 1.048; end.Y = 28.664; inputLine.ToPoint = end; //用 ISurface 的 InterpolateShape 方法,得到这条直线做剖面后的 Geometry,方法说明详 见帮助 IGeometry OutShape;
object size = new object(); surface.InterpolateShape(inputLine, out OutShape, ref size); //将结果 QI 为 PointCollection,QI 成功显示结果是直线上单一的几个离散点, InterpolateShape 会自动将分析的结果直线上选取六个等分的离散点,以这六个点的值来作 曲线图 IPointCollection pointCollection = OutShape as IPointCollection; IMAware maware = pointCollection as IMAware; maware.MAware = true; IZAware zaware = pointCollection as IZAware; zaware.ZAware = true; IMSegmentation mseg = pointCollection as IMSegmentation; //设置 M 的值为距离 mseg.SetMsAsDistance(false); //建立 featureClass,为后面曲线图提供数据 IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass(); ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0); ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName; ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open(); IFields fields = new FieldsClass(); IFieldsEdit fieldsEdit = fields as IFieldsEdit; IField oidField = new FieldClass(); IFieldEdit oidFieldEdit = oidField as IFieldEdit; oidFieldEdit.Name_2 = "OID"; oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID; fieldsEdit.AddField(oidField);
IGeometryDef geometryDef = new GeometryDefClass(); IGeometryDefEdit geometryDefEdit = geometryDef as IGeometryDefEdit; geometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint; geometryDefEdit.HasM_2 = true; geometryDefEdit.HasZ_2 = true; ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass(); ISpatialReference spatialReference = e.esriSRGeoCS_WGS1984); ISpatialReferenceResolution spatialReferenceResolution = (ISpatialReferenceResolution)spatialReference; spatialReferenceResolution.ConstructFromHorizon(); ISpatialReferenceTolerance spatialReferenceTolerance = (ISpatialReferenceTolerance)spatialReference; spatialReferenceTolerance.SetDefaultXYTolerance(); geometryDefEdit.SpatialReference_2 = spatialReference; spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSTyp IField geometryField = new FieldClass(); IFieldEdit geometryFieldEdit = (IFieldEdit)geometryField; geometryFieldEdit.Name_2 = "Shape"; geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; geometryFieldEdit.GeometryDef_2 = geometryDef; fieldsEdit.AddField(geometryField); IField mField = new FieldClass(); IFieldEdit mFieldEdit = (IFieldEdit)mField; mFieldEdit.Name_2 = "M"; mFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; mFieldEdit.Length_2 = 8; fieldsEdit.AddField(mField);
IField zField = new FieldClass(); IFieldEdit zFieldEdit = (IFieldEdit)zField; zFieldEdit.Name_2 = "Z"; zFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; zFieldEdit.Length_2 = 8; fieldsEdit.AddField(zField); IFieldChecker fieldChecker = new FieldCheckerClass(); IEnumFieldError enumFieldError = null; IFields validatedFields = null; fieldChecker.ValidateWorkspace = inmemWor; fieldChecker.Validate(fields, out enumFieldError, out validatedFields); IFeatureClass featureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass("test", validatedFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IFeatureCursor cursor = featureClass.Insert(true); IFeatureBuffer buffer = featureClass.CreateFeatureBuffer(); int count = pointCollection.PointCount; for (int i = 0; i < count; ++i) { IPoint p = pointCollection.get_Point(i); buffer.Shape = p as IGeometry; buffer.set_Value(buffer.Fields.FindField("M"), p.M); buffer.set_Value(buffer.Fields.FindField("Z"), p.Z); cursor.InsertFeature(buffer); } cursor.Flush(); //开始做曲线图
IFeatureLayer featurelayer = new FeatureLayerClass(); featurelayer.FeatureClass = featureClass; ITable table = featurelayer as ITable; IDataGraph datagraph = new DataGraphClass(); datagraph.Table = table; datagraph.FieldSet1 = "Z"; datagraph.FieldSet2 = "M"; IDataGraphProperties proper = datagraph as IDataGraphProperties; proper.Title = "曲线图"; proper.SubTitle = "跟据 Z 和 M 值做的剖面图"; proper.GraphType = esriDataGraphTypeEnum.esriDataGraphTypeLine; proper.GraphSubtype = esriDataGraphSubtypeEnum.esriDataGraphSubtypeLine2DSimple; proper.ShowXAxisLabels = true; proper.ShowLegend = false; datagraph.Reload(); datagraph.Draw(); datagraph.ExportToFile("c://victorcxj.jpg"); 需要注意的是,如果是在 b/s 上做剖面图开发,上面的对象都不能用 new 而是用 serverContext 来创建, 但我在开发中遇到一个奇怪的问题就是 datagraph 导不出来图片, 我后来把 DataGraph 用 new 来创建就可以了,有时候 AO 的东西真是奇怪到你无法解释。。。。
分享到:
收藏