To access a raster dataset in a geodatabase, first open a geodatabase workspace
Then use the IRasterWorkspaceEx interface
static IRasterDataset OpenGDBRasterDataset(string folderName, string datasetName)
{
//打开工作空间
//创建打开工作空间的对象
IWorkspaceFactory2 workspaceFactory = new FileGDBWorkspaceFactoryClass();
//folderName就是根目录,0是默认参数
//创建栅格工作空间 空作空间.OpenFromFile(根目录, 0)
IRasterWorkspaceEx rasterWorkspace = (IRasterWorkspaceEx)workspaceFactory.OpenFromFile(folderName, 0);
//打开栅格数据
//栅格工作空间.OpenRasterDataset(文件名)
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(datasetName);
return rasterDataset;
}
2 创建栅格数据集
2.1 在文件夹中创建
public static IRasterDataset CreateRasterDataset(string Path, string FileName)
{
//IRasterWorkspace2是ArcObjects中的接口,用于访问栅格数据存储。它提供了管理和操作栅格数据的方法,如打开、创建、复制和删除栅格数据集等。
//此接口继承自IRasterWorkspace接口,并添加了一些额外的方法,比如获取栅格数据集属性和元数据等
//Path根目录
IRasterWorkspace2 rasterWs = OpenRasterWorkspace(Path);
//定义栅格数据的空间参考
//ISpatialReference是ArcObjects中的接口,用于描述和管理空间参考信息。这个接口提供了许多方法来定义和处理地理坐标系、投影坐标系、大地水准面和椭球体等相关参数。
//它还支持将数据从一个空间参考系统转换为另一个空间参考系统
ISpatialReference sr = new UnknownCoordinateSystemClass();
//定义栅格数据集的原点,即左下角坐标.
IPoint origin = new PointClass();
origin.PutCoords(15.0, 15.0);
//定义栅格数据集的属性
int width = 100; //一行有多少个像元
int height = 100; //一列有多少个像元
double xCell = 30; //像元宽度
double yCell = 30; //像元高度
int NumBand = 1; // 像元波段数
//创建栅格数据
IRasterDataset rasterDataset = rasterWs.CreateRasterDataset(FileName, "TIFF", origin, width, height, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, sr, true);
//如果还需要设置Nodata值的话,代码如下
//获取波段
IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset;
IRasterBand rasterBand;
//创建IRasterProps对象,操作属性
IRasterProps rasterProps;
//获取第一波段
rasterBand = rasterBands.Item(0);
rasterProps = (IRasterProps)rasterBand;
//设置Nodata值
rasterProps.NoDataValue = 255;
//Create a raster from the dataset.
IRaster raster = rasterDataset.CreateDefaultRaster();
//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);
//使用CreatePixelBlock方法创建一个像素块pixelblock,该方法以blocksize作为参数,并将其强制转换为IPixelBlock3类型
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);
//set_PixelData方法将像素数据pixels赋值给像素块
pixelblock.set_PixelData(0, (System.Array)pixels);
//定义像素块写的起点,从左上角开始
IPnt upperLeft = new PntClass();
upperLeft.SetCoords(0, 0);
//写像素块
IRasterEdit rasterEdit = (IRasterEdit)raster;
rasterEdit.Write(upperLeft, (IPixelBlock)pixelblock);
//Release rasterEdit explicitly.
System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);
return rasterDataset;
}
//创建栅格工作空间
public static IRasterWorkspace2 OpenRasterWorkspace(string PathName)
{
IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass();
//强制转换成IRasterWorkspace2
return (IRasterWorkspace2)workspaceFact.OpenFromFile(PathName, 0);
}