本文大部分内容参考AO帮助文档和ArcMap帮助文档,大家实际使用中遇到的问题也可以在本帖下方留言交流,谢谢!
欢迎浏览,拒绝转载!
栅格数据基础知识:传送门
栅格数据是由一系列等间距的格网矩阵组成,用来表达完整的主题、光谱、图像信息。
栅格数据模型分为栅格数据集(Raster dataset)、栅格目录(Raster catalog)、镶嵌数据集(Mosaic dataset)。他们以文件系统、个人地理数据库、文件地理数据库、企业地理数据库为数据源进行存储。
栅格数据集也就是我们经常所得的jpg、tif文件等, ArcGIS 将这些栅格数据抽象为 RasterDataset,栅格数据集就代表了磁盘中的一个文件,它由一个或多个波段组成。在使用栅格数据集的时候,栅格数据会被转换成 IMG 文件存储在数据库中。我们可以对栅格数据集进行一些操作,如改变空间参考,建立影像金字塔等。
栅格目录,正如其名字一样是一个目录,跟书的目录相似,它记录了一个或者多个栅格数据集,每一个栅格数据集都作为一条记录存储在栅格目录中。栅格目录对栅格数据集的管理有两种方式,托管和非托管。托管方式的时候,栅格数据是存储在数据库中, 非托管的时候,栅格目录记录了栅格数据集的路径,也就是栅格数据并没有存储在数据库中。当我们删除一条记录的时候,对我们的栅格数据没有任何影响。
镶嵌数据集可以说是栅格数据集和栅格目录的混合技术,它的存储方式和栅格目录类似,但是在使用的时候和普通的栅格数据集是一样的,镶嵌数据集用于管理和发布海量多分辨率,多传感器影像,对栅格数据提供了动态镶嵌和实时处理的功能。
对文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较:
在线地址:传送门
本地路径:本地路径:如 C:\Program Files (x86)\ArcGIS\DeveloperKit10.2\Diagrams\DataSourcesRasterObjectModel.pdf
//Open a file geodatabase workspace as RasterWorkspace.static IRasterWorkspaceEx OpenFGDB(string FGDBPath){ //FGDBPath string example: c:\data\raster.gdb. IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass(); return (IRasterWorkspaceEx)workspaceFactory.OpenFromFile(FGDBPath, 0);}//Open an ArcSDE workspace as RasterWorkspace.static IRasterWorkspaceEx OpenSDE(string conString){ //conString example: SERVER=ais;INSTANCE=9200;VERSION=sde.DEFAULT;USER=raster;PASSWORD=raster. IWorkspaceFactory2 workspaceFactory = new SdeWorkspaceFactoryClass(); return (IRasterWorkspaceEx)workspaceFactory.OpenFromString(conString, 0);}//Open an accessed workspace as RasterWorkspace.static IRasterWorkspaceEx OpenAccess(string PGDBPath){ //FGDBPath string example: c:\data\rasters.mdb. IWorkspaceFactory2 workspaceFactory = new AccessWorkspaceFactoryClass(); return (IRasterWorkspaceEx)workspaceFactory.OpenFromFile(PGDBPath, 0);}//Open a file workspace as RasterWorkspace.static IRasterWorkspace OpenFileWorkspace(string wsPath){ //wsPath example: c:\data\rasters. IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass(); return (IRasterWorkspace)workspaceFact.OpenFromFile(wsPath, 0);}
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(datasetName);
IRasterDataset rasterDataset = rasterWorkspaceEx.OpenRasterDataset(datasetName);
public static IRasterDataset CreateRasterDataset(string Path, string FileName){ try { IRasterWorkspace2 rasterWs = OpenRasterWorkspace(Path); //Define the spatial reference of the raster dataset. ISpatialReference sr = new UnknownCoordinateSystemClass(); //Define the origin for the raster dataset, which is the lower left corner of the raster. IPoint origin = new PointClass(); origin.PutCoords(15.0, 15.0); //Define the dimensions of the raster dataset. int width = 100; //This is the width of the raster dataset. int height = 100; //This is the height of the raster dataset. double xCell = 30; //This is the cell size in x direction. double yCell = 30; //This is the cell size in y direction. int NumBand = 1; // This is the number of bands the raster dataset contains. //Create a raster dataset in TIFF format. IRasterDataset rasterDataset = rasterWs.CreateRasterDataset(FileName, 'TIFF', origin, width, height, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, sr, true); //If you need to set NoData for some of the pixels, you need to set it on band //to get the raster band. IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset; IRasterBand rasterBand; IRasterProps rasterProps; rasterBand = rasterBands.Item(0); rasterProps = (IRasterProps)rasterBand; //Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band. rasterProps.NoDataValue = 255; //Create a raster from the dataset. IRaster raster = rasterDataset.CreateFullRaster(); //Create a pixel block using the weight and height of the raster dataset. //If the raster dataset is large, a smaller pixel block should be used. //Refer to the topic 'How to access pixel data using a raster cursor'. IPnt blocksize = new PntClass(); blocksize.SetCoords(width, height); IPixelBlock3 pixelblock = raster.CreatePixelBlock(blocksize)as IPixelBlock3; //Populate some pixel values to the pixel block. System.Array pixels; pixels = (System.Array)pixelblock.get_PixelData(0); for (int i = 0; i < width;="" i++)="">for (int j = 0; j < height;="" j++)="">if (i == j) pixels.SetValue(Convert.ToByte(255), i, j); else pixels.SetValue(Convert.ToByte((i * j) / 255), i, j); pixelblock.set_PixelData(0, (System.Array)pixels); //Define the location that the upper left corner of the pixel block is to write. IPnt upperLeft = new PntClass(); upperLeft.SetCoords(0, 0); //Write the pixel block. IRasterEdit rasterEdit = (IRasterEdit)raster; rasterEdit.Write(upperLeft, (IPixelBlock)pixelblock); //Release rasterEdit explicitly. System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit); return rasterDataset; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); return null; }}public static IRasterWorkspace2 OpenRasterWorkspace(string PathName){ //This function opens a raster workspace. try { IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass(); return workspaceFact.OpenFromFile(PathName, 0)as IRasterWorkspace2; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); return null; }}
IWorkspaceFactory wsf = new FileGDBWorkspaceFactoryClass();IRasterWorkspaceEx ws = (IRasterWorkspaceEx)wsf.OpenFromFile(@'c:\temp\fgdb.gdb', 0);//Define the raster storage.IRasterStorageDef storage = new RasterStorageDefClass();storage.Tiled = true;storage.TileHeight = 128;storage.TileWidth = 128;//Define the spatial reference.IRasterDef rasterDef = new RasterDefClass();rasterDef.SpatialReference = new UnknownCoordinateSystemClass();//Create data.IRasterDataset rasterDs = ws.CreateRasterDataset('newraster', 3,rstPixelType.PT_SHORT, storage, 'sde.DEFAULT', rasterDef, null);
一些栅格格式,如分层数据格式(HDF),可以在单个文件中包含多个subdatasets。访问HDF subdatasets使用IRasterDatasetJukebox接口,请参见下面的代码示例:
IWorkspaceFactory wsf = new FileGDBWorkspaceFactoryClass();IRasterWorkspaceEx ws = (IRasterWorkspaceEx)wsf.OpenFromFile(@'c:\temp\fgdb.gdb', 0);//Define the raster storage.IRasterStorageDef storage = new RasterStorageDefClass();storage.Tiled = true;storage.TileHeight = 128;storage.TileWidth = 128;//Define the spatial reference.IRasterDef rasterDef = new RasterDefClass();rasterDef.SpatialReference = new UnknownCoordinateSystemClass();//Create data.IRasterDataset rasterDs = ws.CreateRasterDataset('newraster', 3,rstPixelType.PT_SHORT, storage, 'sde.DEFAULT', rasterDef, null);
public static void JPEG_EXIFtag(IRasterDataset exifDataset){ //exifDataset represents a raster dataset opened from a JPEG file that has EXIF tags. IDataset dataset = (IDataset)exifDataset; //Get the EXIF tags and the associated values. IPropertySet propertySet = dataset.PropertySet; System.Object tag_names; System.Object tag_values; propertySet.GetAllProperties(out tag_names, out tag_values); string[] stringNames = (string[])tag_names; object[] stringValues = (object[])tag_values; for (int i = 0; i < stringnames.length="" -="">1; i++) { System.Console.WriteLine(stringNames[i]); System.Console.WriteLine(stringValues[i]); }}
public static void UsingRasterCursorWithPixelBlock(IRasterDataset2 rasterDs){ try { //Create a raster. IRaster2 raster2 = rasterDs.CreateFullRaster()as IRaster2; //Create a raster cursor with a system-optimized pixel block size by passing a null. IRasterCursor rasterCursor = raster2.CreateCursorEx(null); //Use the IRasterEdit interface. IRasterEdit rasterEdit = raster2 as IRasterEdit; //Loop through each band and pixel block. IRasterBandCollection bands = rasterDs as IRasterBandCollection; IPixelBlock3 pixelblock3 = null; long blockwidth = 0; long blockheight = 0; System.Array pixels; IPnt tlc = null; object v; long bandCount = bands.Count; do { pixelblock3 = rasterCursor.PixelBlock as IPixelBlock3; blockwidth = pixelblock3.Width; blockheight = pixelblock3.Height; pixelblock3.Mask(255); for (int k = 0; k < bandcount;="" k++)="" {="">//Get the pixel array. pixels = (System.Array)pixelblock3.get_PixelData(k); for (long i = 0; i < blockwidth;="" i++)="" {="">for (long j = 0; j < blockheight;="" j++)="" {="">//Get the pixel value. v = pixels.GetValue(i, j); //Do something with the value. } } //Set the pixel array to the pixel block. pixelblock3.set_PixelData(k, pixels); } //Write back to the raster. tlc = rasterCursor.TopLeft; rasterEdit.Write(tlc, (IPixelBlock)pixelblock3); } while (rasterCursor.Next() == true); System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); }}
public static void ReadWriteRawBlocks(IRasterDataset rasDs){ IRasterBandCollection rasBandCol = (IRasterBandCollection)rasDs; IRawBlocks rawBlocks; IRasterInfo rasInfo; IPixelBlock pb; // Iterate through each band of the dataset. for (int m = 0; m <= rasbandcol.count="" -="" 1;="">=> { // QI to IRawBlocks from IRasterBandCollection. rawBlocks = (IRawBlocks)rasBandCol.Item(m); rasInfo = rawBlocks.RasterInfo; // Create the pixel block. pb = rawBlocks.CreatePixelBlock(); // Determine the tiling scheme for the raster dataset. int bStartX = (int)Math.Floor((rasInfo.Extent.Envelope.XMin - rasInfo.Origin.X) / (rasInfo.BlockWidth * rasInfo.CellSize.X)); int bEndX = (int)Math.Ceiling((rasInfo.Extent.Envelope.XMax - rasInfo.Origin.X) / (rasInfo.BlockWidth * rasInfo.CellSize.X)); int bStartY = (int)Math.Floor((rasInfo.Origin.Y - rasInfo.Extent.Envelope.YMax) / (rasInfo.BlockHeight * rasInfo.CellSize.Y)); int bEndY = (int)Math.Ceiling((rasInfo.Origin.Y - rasInfo.Extent.Envelope.YMin) / (rasInfo.BlockHeight * rasInfo.CellSize.Y)); // Iterate through the pixel blocks. for (int pbYcursor = startY; pbYcursor < endy;=""> { for (int pbXcursor = startX; pbXcursor < endx;=""> { // Get the pixel block. rawBlocks.ReadBlock(pbXcursor, pbYcursor, 0, pb); System.Array safeArray; // Put the pixel block into a SafeArray for manipulation. safeArray = (System.Array)pb.get_SafeArray(0); // Iterate through the pixels in the pixel block. for (int safeArrayHeight = 0; safeArrayHeight <> safeArrayHeight++) { for (int safeArrayWidth = 0; safeArrayWidth <> safeArrayWidth++) { // Use System.Array.SetValue to write the new pixel value back into the SafeArray. safeArray.SetValue(Convert.ToByte(128), safeArrayWidth, safeArrayHeight); } } // Set the SafeArray back to the pixel block. pb.set_SafeArray(0, safeArray); // Write the pixel block back to the dataset. rawBlocks.WriteBlock(pbXcursor, pbYcursor, 0, pb); } } }}
static void BuildRasterAttributeTable(IRasterDataset rasterDataset, ITable table){ //Cast to IRasterDatasetEdit2 to build a raster attribute table. IRasterDatasetEdit2 rasterDatasetEdit = (IRasterDatasetEdit2)rasterDataset; //Build a default raster attribute table with VALUE and COUNT fields. if (table == null) { rasterDatasetEdit.BuildAttributeTable(); } else { //Assign the given table as the raster attribute table. rasterDatasetEdit.AlterAttributeTable(table); }}
主要用到的接口:
1) IRasterProps
2) IRasterBandCollection
3) IRasterDataset
4) IRasterPyramid3
5) IRasterBand
栅格属性列表:
列数和行数(Columns and Rows):通过IRasterProps的Width和Height属性获取
波段数量(Number of Bands):通过IRasterBandCollection接口获取(可以由IRaster对象跳转接口到此接口)
像元大小(CellSize(X,Y)):通过IRasterProps的MeanCellSize
格式(Format):通过IRasterDataset的Format属性获取
源类型(Source Type):可以通过GP工具SetRasterProperties来设置。
像素类型(Pixel Type):通过IRasterProps接口的PixelType 属性获取
像素位深(Pixel Depth):根据像素类型来判断像素位深
无数据值(NoData Value):通过IRasterProps 的NoDataValue属性获取
颜色表/色带(Colormap):通过IRaster2接口的Colormap属性获取色带
金字塔(Pyramids):通过IRasterPyramid3接口来创建、获取、删除金字塔(PS:用IRasterDataset接口跳转到IRasterPyramid3接口)
压缩(Compression):通过IRasterDataset的CompressionType属性获取压缩类型
范围(Extent):将IRasterDataset接口对象转换成IGeoDataset对象来范围信息
空间参考(Spatial Reference):1)将IRasterDataset接口对象转换成IGeoDataset对象来获取空间参考信息 2)通过IRasterProps 的属性SpatialReference获取 3)其它方法
统计(Statistics):通过IRasterBand接口的Statistics属性获取波段的统计信息
波段集合:通过IRasterBandCollection 接口来添加、删除、获取波段。
构建金字塔有两种方式:1)利用IRasterPyramid3接口来创建金字塔 2)利用GP工具创建金字塔
示例代码:
1)
IRasterPyramid3 pRasterPyramid = rasterDataset as IRasterPyramid3;if (pRasterPyramid != null && !pRasterPyramid.Present){ //-1代表创建全部级别的金字塔,0代表删除金字塔,其它代表创建对应级别的金字塔 pRasterPyramid.BuildPyramid(-1, rstResamplingTypes.RSP_NearestNeighbor);}
2)
//如何监听GP消息请参考文章《ArcEngine GP笔记(持续补充中......)》ESRI.ArcGIS.DataManagementTools.BuildPyramids buildPyramids = new ESRI.ArcGIS.DataManagementTools.BuildPyramids();buildPyramids.in_raster_dataset = sRasterFile; //栅格数据源buildPyramids.resample_technique = cmbEditResample.Text; //重分类方法buildPyramids.compression_type = cmbEditCompressType.Text; //压缩类型buildPyramids.compression_quality = Convert.ToInt32(txtCompressQuality.Text); //压缩质量IGeoProcessorResult gpResult = m_geoProcesser.Execute(buildPyramids, null);if (gpResult.Status == ESRI.ArcGIS.esriSystem.esriJobStatus.esriJobSucceeded){ //do something }
个人经验:遇到数据量大的数据创建金字塔比较耗时,建议使用第二种方式GP工具创建金字塔,可以对GP工具进行监听,实时输出动态消息;数据量小的时候可以使用接口,简单快捷。个人经验仅供参考,如有意见,请留言!
栅格数据另存有两种方式:1)一种利用ISaveAs和ISaveAs2接口 2)利用GP工具另存
示例代码:
1)
ISaveAs2 pSaveAs = pSaster as ISaveAs2;if (!pSaveAs.CanSaveAs(sFormat)){ XtraMessageBox.Show('不支持指定像素类型或文件格式的输出', '提示', MessageBoxButtons.OK, MessageBoxIcon.Information); return ;}IWorkspaceFactory worksapceFactory = new RasterWorkspaceFactoryClass();workspace = worksapceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(m_sOutputPath), 0);IDataset dataset = pSaveAs.SaveAs(System.IO.Path.GetFileName(m_sOutputPath), workspace, sFormat);
2)
可以利用CopyRaster工具拷贝一份栅格数据实现栅格数据的另存。
个人经验: ISaveAs 保存Grid格式数据技巧
栅格数据裁切有两种方式:1)利用接口进行裁切 2)利用GP工具进行裁切
1)
①基于IEnvelope对象裁切,主要用到的接口:IRasterGeometryProc
IRasterGeometryProc pRasterGeometryProc = new RasterGeometryProcClass();pRasterGeometryProc.Clip(pClipEnvelope,pInputRaster)
②利用 IExtractionOp2接口进行裁切,然后用ISaveAs2接口保存裁切后的结果。代码链接:传送门
③ 其它可能的方法
2)
调用Clip工具进行裁切,代码略(这块我做过基于范围、文件、ROI绘制图形的裁切,不会的可以留言,我可以把示例代码发过去)。
这块有几个注意事项:
① 注意输入数据和裁切范围要有坐标系
② 注意被裁切的数据和裁切范围是否可以叠加上
③ 注意将裁切范围转换到输入数据的坐标系上去
④ 如果基于栅格文件裁切,clipping_geometry设置为 “NONE”;如果基于矢量文件裁切,clipping_geometry设置为 “ClippingGeometry”;
⑤ 如果基于四角坐标裁切,注意rectangle参数格式;如果in_template_dataset不为空字符串或空对象,设置rectangle参数为“#”即可。
in_rectangle = string.Format('{0} {1} {2} {3}', pEnvelope.XMin, pEnvelope.YMin, pEnvelope.XMax, pEnvelope.YMax);
1.栅格数据渲染包括一下几种:
- Raster Unique value Renderer 唯一值渲染
- Raster Classify Renderer 分类渲染
- Raster Stretch Renderer 色带拉伸渲染
- RGB渲染,必须为多波段影像
主要用到的接口:
1) IRasterLayer
2) IRasterRenderer
2.栅格图层的显示效果
栅格图层的显示效果受亮度、对比度、透明度等因素的影响。
用到的接口:
1)ILayerEffects
2)IRasterDisplayProps
分享几个我项目中用到的栅格分析功能的例子:
1)坡度分析
private IRaster ProduceSlopeData(DirectoryInfo demFile, string outputFolder, string strOutputMeasurement, double zFactor, IGeoDataset inputGeoDataset, IWorkspace pWorkspace){ IRaster solpeRaster = null; ISurfaceOp pSurface = new RasterSurfaceOpClass(); esriGeoAnalysisSlopeEnum enumSlope = (strOutputMeasurement == 'DEGREE') ? esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopeDegrees : esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopePercentrise; IGeoDataset outSlopeDataset = pSurface.Slope(inputGeoDataset, enumSlope, zFactor); //输出坡度数据 ISaveAs pSlopeSaveAs = outSlopeDataset as ISaveAs; string outputSlopeName = demFile.Parent.Name.ToUpper() +'SLP'; //string outputSlopeName = demFile.Parent.Name + 'SLP.tif'; if (System.IO.File.Exists(System.IO.Path.Combine(outputFolder, outputSlopeName))) { IRasterDataset oldRasterDataset = (pWorkspace as IRasterWorkspace).OpenRasterDataset(outputSlopeName); (oldRasterDataset as IDataset).Delete(); } IDataset solpeDataset = pSlopeSaveAs.SaveAs(outputSlopeName, pWorkspace, 'GRID'); //IDataset solpeDataset = pSlopeSaveAs.SaveAs(outputSlopeName, pWorkspace, 'TIFF'); IRasterDataset solpeRasterDataset = solpeDataset as IRasterDataset; if (solpeRasterDataset != null) { solpeRaster = solpeRasterDataset.CreateDefaultRaster(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(outSlopeDataset); System.Runtime.InteropServices.Marshal.ReleaseComObject(solpeRasterDataset); return solpeRaster;}
2)坡向分析
private void ProduceAspectData(DirectoryInfo demFile, string outputFolder, IGeoDataset inputGeoDataset, IWorkspace pWorkspace){ ISurfaceOp pSurface = new RasterSurfaceOpClass(); IGeoDataset outAspectDataset = pSurface.Aspect(inputGeoDataset); ISaveAs pAspectSaveAs = outAspectDataset as ISaveAs; string outputAspectName = demFile.Parent.Name.ToUpper() + 'SPD'; //string outputAspectName = demFile.Parent.Name + 'SPD.tif'; string outputAspectFilePath = System.IO.Path.Combine(outputFolder, outputAspectName); if (System.IO.File.Exists(outputAspectFilePath)) { IRasterDataset oldRasterDataset = (pWorkspace as IRasterWorkspace).OpenRasterDataset(outputAspectName); (oldRasterDataset as IDataset).Delete(); } IDataset aspectDataset = pAspectSaveAs.SaveAs(outputAspectName, pWorkspace, 'GRID'); //IDataset aspectDataset = pAspectSaveAs.SaveAs(outputAspectName, pWorkspace, 'TIFF'); System.Runtime.InteropServices.Marshal.ReleaseComObject(outAspectDataset); System.Runtime.InteropServices.Marshal.ReleaseComObject(aspectDataset);}
3)重分类
private IRasterDataset ProduceSlopeZone(DirectoryInfo demFile, string outputFolder, IWorkspace pWorkspace, IRaster pInRaster){ if (pInRaster == null) { m_richTxtBoxLog.SelectionColor = System.Drawing.Color.Red; m_richTxtBoxLog.AppendText('生成高程带数据失败!\r\n'); return null; } IReclassOp pReclassOp = new RasterReclassOpClass(); IGeoDataset pGeodataset = pInRaster as IGeoDataset; INumberRemap pNumRemap = new NumberRemapClass(); IRasterStatistics pRasterStatistic = GetRasterStatistics(pInRaster); pNumRemap.MapRange(0, 2, 0); pNumRemap.MapRange(2, 3, 2); pNumRemap.MapRange(3, 5, 3); pNumRemap.MapRange(5, 6, 5); pNumRemap.MapRange(6, 8, 6); pNumRemap.MapRange(8, 10, 8); pNumRemap.MapRange(10, 15, 10); pNumRemap.MapRange(15, 25, 15); pNumRemap.MapRange(25, 35, 25); pNumRemap.MapRange(35, 45, 35); if (pRasterStatistic.Maximum > 45) { pNumRemap.MapRange(45, 90, 45); } IRemap pRemap = pNumRemap as IRemap; IRaster2 pOutRaster = pReclassOp.ReclassByRemap(pGeodataset, pRemap, false) as IRaster2; //保存 ISaveAs pAspectSaveAs = pOutRaster as ISaveAs; string outputAspectName = demFile.Parent.Name.ToUpper() + 'SPZA.tif'; if (System.IO.File.Exists(System.IO.Path.Combine(outputFolder, outputAspectName))) { IRasterDataset oldRasterDataset = (pWorkspace as IRasterWorkspace).OpenRasterDataset(outputAspectName); (oldRasterDataset as IDataset).Delete(); } IDataset aspectDataset = pAspectSaveAs.SaveAs(outputAspectName, pWorkspace, 'TIFF'); System.Runtime.InteropServices.Marshal.ReleaseComObject(pInRaster); return (aspectDataset as IRasterDataset); }/// /// 获取栅格统计/// /// /// private IRasterStatistics GetRasterStatistics(IRaster pRaster){ if (null == pRaster) return null; IRasterBandCollection pRBandCol = pRaster as IRasterBandCollection; IRasterBand pRBand = pRBandCol.Item(0); if (pRBand.Statistics == null) { pRBand.ComputeStatsAndHist(); } return pRBand.Statistics;}
和栅格数据有关的工具箱:3D Analyst Tools 、Data Management Tools、Spatial Analyst Tools 等工具箱。
具体内容不在此赘述,有问题的可以留言。
本文书写参考内容:
1)官方帮助文档
2)个人项目经验
3)参考博客:arcengine栅格数据使用总结
4)相关文档资料:CSDN下载-》ArcEngine 栅格数据总结.ppt
联系客服