RasterDataset(栅格数据)
其描述如下:The RasterDataset object represents a dataset on disk or in a geodatabase. It is composed of one or more persistent raster bands.
The RasterDataset object performs basic dataset management functions, such as copy, rename, and delete. It can also be used to examine dataset properties including raster format, extent, spatial reference, and number of bands, etc.
RasterDataset can be used to change some of the properties of the dataset. For example, RasterDataset can be used to change the spatial reference associated with the dataset, to manipulate the colormap of the raster dataset, to build pyramids (reduced-resolution datasets) which improve display performance for large raster datasets, and to build statistics which enhances raster renderering. RasterDataset object can merge pixels from another raster dataset to itself.
A RasterDataset can be saved to anther file format or geodatabase using ISaveAs or IRasterBandCollection.
The IRasterWorkspace interface and IRasterWorkspaceEx interface, through an Access workspace, create a file based RasterDataset; IRasterWorkspaceEx interface, through a database workspace, creates a databaseRasterDataset.
A file based RasterDataset and database RasterDataset work the same way except on a few interfaces. For example, ITemporyDataset and IWorldFileExport interfaces are not supported by a database RasterDataset.
栅格数据集是依赖Dataset,就好比是要要素数据集类似,是因为栅格数据集中存在着不同的波段的栅格数据。所以可以使用Dataset中的方法(如增删改查)等操作栅格要素数据集。
大多数影像和栅格数据(例如正射影像或 DEM)都以栅格数据集的形式提供。栅格数据集这个术语是指存储在磁盘或地理数据库中的任何栅格数据模型。它是构建其他数据的最基本的栅格数据存储模型 - 镶嵌数据集和栅格目录管理栅格数据集。栅格数据集是组织成一个或多个波段的任何有效的栅格格式。每个波段由一系列像素(单元)数组组成,每个像素都有一个值。栅格数据集至少有一个波段。可以采用许多格式存储栅格数据集,包括 TIFF、JPEG 2000、Esri Grid 和 MrSid。
RasterDataset, RasterBand,Raster之间关系如下:
打开栅格数据集代码如下:
private IRasterDataset OpenRasterDataset(string dirname,string filename
<span style="font-family: Arial, Helvetica, sans-serif;">IWorkspaceFactory rasterWSF = new RasterWorkspaceFactory(); ;//栅格工作工厂</span>
IWorkspace rasterWK = rasterWSF.OpenFromFile(dirname, 0);//栅格工作空间</span>
IRasterWorkspace rastWork = (IRasterWorkspace)rasterWK;
return rastWork.OpenRasterDataset(filename);//filename需要带有文件后缀
}
需要注意的是:使用工作空间打开的栅格数据是带有后缀的栅格数据集
创建栅格数据集,创建到文件夹中
public IRasterDataset createFileRasterDataset(string directoryName, string fileName)
{
// This function creates a new img file in the given workspace
// and then assigns pixel values
try
{
IRasterDataset rasterDataset = null;
IPoint originPoint = new PointClass();
originPoint.PutCoords(0, 0);
// Create the dataset
IRasterWorkspace2 rasterWorkspace2 = null;
rasterWorkspace2 = createRasterWorkspace(directoryName);
rasterDataset = rasterWorkspace2.CreateRasterDataset(fileName, "IMAGINE Image", originPoint, 200, 100, 1, 1, 1, rstPixelType.PT_UCHAR, new UnknownCoordinateSystemClass(), true);
IRawPixels rawPixels = null;
IPixelBlock3 pixelBlock3 = null;
IPnt pixelBlockOrigin = null;
IPnt pixelBlockSize = null;
IRasterBandCollection rasterBandCollection;
IRasterProps rasterProps;
// QI for IRawPixels and IRasterProps
rasterBandCollection = (IRasterBandCollection) rasterDataset;
rawPixels = (IRawPixels) rasterBandCollection.Item(0);
rasterProps = (IRasterProps) rawPixels;
// Create pixelblock
pixelBlockOrigin = new DblPntClass();
pixelBlockOrigin.SetCoords(0, 0);
pixelBlockSize = new DblPntClass();
pixelBlockSize.SetCoords(rasterProps.Width, rasterProps.Height);
pixelBlock3 = (IPixelBlock3) rawPixels.CreatePixelBlock(pixelBlockSize);
// Read pixelblock
rawPixels.Read(pixelBlockOrigin, (IPixelBlock) pixelBlock3);
// Get pixeldata array
System.Object[,] pixelData;
pixelData = (System.Object[,]) pixelBlock3.get_PixelDataByRef(0);
// Loop through all the pixels and assign value
for(int i = 0; i < rasterProps.Width; i++)
for (int j = 0; j < rasterProps.Height; j++)
pixelData[i,j] = (i * j) % 255;
// Write the pixeldata back
System.Object cachePointer;
cachePointer = rawPixels.AcquireCache();
rawPixels.Write(pixelBlockOrigin, (IPixelBlock) pixelBlock3);
rawPixels.ReturnCache(cachePointer);
// Return raster dataset
return rasterDataset;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
return null;
}
}
public IRasterWorkspace2 createRasterWorkspace(string pathName)
{
// Create RasterWorkspace
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
return workspaceFactory.OpenFromFile(pathName, 0) as IRasterWorkspace2;
}
创建栅格数据加创建到个人数据库中
// Libraries needed to run this code:
// ESRI.ArcGIS.Geodatabase, ESRI.ArcGIS.Geometry
public IRasterDataset createSDERasterDs(IRasterWorkspaceEx rasterWorkspaceEx,
string rasterDatasetName, int numberOfBands,
rstPixelType pixelType, ISpatialReference spatialReference,
IRasterStorageDef rasterStorageDef, IRasterDef rasterDef,
string keyword)
{
// Create a raster dataset in a geodatabase workspace
// rasterWorkspaceEx == destination geodatabase workspace (personal or ArcSDE)
// rasterDatasetName == Name of raster dataset to create
// numberOfBands == number of bands in the raster dataset that will be created
// pixelType == type of pixel in target raster dataset
// spatialReference == desired spatial reference in raster dataset
// rasterStorageDef == RasterStorageDef object of Raster dataset -- defines pyramids, tiling, etc
// rasterDef == definition for spatial reference
// sKeyword == ArcSDE only, configuration keyword
IRasterDataset rasterDataset = null;
IGeometryDef geometryDef;
// if rasterdef is missing, create one with specified/unknown spatialreference
if (rasterDef == null)
rasterDef = createRasterDef(false, spatialReference);
// if rasterstoragedef is missing, use default parameters
if (rasterStorageDef == null)
rasterStorageDef = createRasterStorageDef();
// create geometry definition
geometryDef = createGeometryDef(spatialReference);
// if keyword is missing, use default
if (keyword.Length == 0)
keyword = "DEFAULTS";
rasterDataset = rasterWorkspaceEx.CreateRasterDataset(rasterDatasetName, numberOfBands, pixelType,
rasterStorageDef, keyword, rasterDef, geometryDef);
return rasterDataset;
}
private IRasterDef createRasterDef(bool isManaged, ISpatialReference spatialReference)
{
// Create rasterdef
IRasterDef rasterDef = new RasterDefClass();
rasterDef.Description = "Raster Dataset";
if (spatialReference == null)
spatialReference = new UnknownCoordinateSystemClass();
rasterDef.SpatialReference = spatialReference;
return rasterDef;
}
private IRasterStorageDef createRasterStorageDef()
{
// Create rasterstoragedef
IRasterStorageDef rasterStorageDef = new RasterStorageDefClass();
rasterStorageDef.CompressionType = esriRasterSdeCompressionTypeEnum.esriRasterSdeCompressionTypeRunLength;
rasterStorageDef.PyramidLevel = 2;
rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation;
rasterStorageDef.TileHeight = 128;
rasterStorageDef.TileWidth = 128;
return rasterStorageDef;
}
private IGeometryDef createGeometryDef(ISpatialReference spatialReference)
{
// Create GeometryDef
IGeometryDefEdit geometryDefEdit = new GeometryDefClass();
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
geometryDefEdit.AvgNumPoints_2 = 4;
geometryDefEdit.GridCount_2 = 1;
geometryDefEdit.set_GridSize(0,1000);
// Set unknown spatial reference is not set
if (spatialReference == null)
spatialReference = new UnknownCoordinateSystemClass();
geometryDefEdit.SpatialReference_2 = spatialReference;
return (IGeometryDef) geometryDefEdit;
}
RasterCatalog(栅格目录)
官方解释:
RasterCatalog, a special type of FeatureClass in geodatabases, manages a collection of raster datasets as one entity. It has a Name field that stores the name of the raster dataset, a Geometry field that stores the footprint (bounding box) of the raster dataset, and a Raster field that stores the pixel values of the raster dataset. It can also contain other fields, such as metadata, text, and so on. Only one Raster field is allowed in a raster catalog
大概意思是说:是一个类型为矢量累的一个地理数据,管理一个栅格集合。通过属性字段name存储栅格数据,几何字段提供了栅格数据的外包矩形,删个字段记录 了栅格数据的像素值,也可以包含其他的一些字段。
从这上面大概能够理解栅格目录的作用,以及他的属性结构。也就是说栅格目录可以看成是一个存储栅格的大文件夹,这个文件夹有属性表,属性表中每一天记录就是一个栅格数据,其中name,geometry,raster是他必须的几个字段
下面是他的结构图
打开个人地理数据库中的栅格目录
public IRasterCatalog OpenPGDBRasterCatalog(string pathName, string rasterCatalogName)
{
//Open the Access workspace
IWorkspaceFactory2 workspaceFactory = new AccessWorkspaceFactoryClass();//个人数据库.mdbw文件
IRasterWorkspaceEx rasterWorkspaceEx = workspaceFactory.OpenFromFile(pathName, 0) as IRasterWorkspaceEx;
IRasterCatalog rasterCatalog = null;
rasterCatalog = rasterWorkspaceEx.OpenRasterCatalog(rasterCatalogName);
return rasterCatalog;
}
创建栅格目录的代码
/ Libraries needed to run this code:
// ESRI.ArcGIS.Geodatabase, ESRI.ArcGIS.Geometry
public IRasterCatalog createCatalog(IRasterWorkspaceEx rasterWorkspaceEx, string catalogName,
string rasterFieldName, string shapeFieldName,
ISpatialReference shapeSpatialReference, ISpatialReference rasterSpatialReference,
bool isManaged, IFields fields, string keyword)
{
// Create a raster catalog in a geodatabase workspace
// rasterWorkspaceEx == destination geodatabase workspace (personal or ArcSDE)
// catalogName == name of the raster catalog
// rasterFieldName == name of the raster column
// shapeFieldName == name of the geometry column
// shapeSpatialReference == spatial reference of the geometry column
// rasterSpatialReference == spatial reference fo the raster column
// isManaged == for personal geodatabase only, if true, the rasters are managed by the GDB
// fields == fields of the raster catalog table
// keyword == ArcSDE only, configuration keyword
if (fields == null)
fields = createFields(rasterFieldName, shapeFieldName, isManaged, shapeSpatialReference, rasterSpatialReference);
if (keyword.Length == 0)
keyword = "defaults";
// create raster catalog
IRasterCatalog newRasterCatalog = null;
newRasterCatalog = rasterWorkspaceEx.CreateRasterCatalog(catalogName, fields, shapeFieldName, rasterFieldName, keyword);
return newRasterCatalog;
}
private IFields createFields(string rasterFieldName, string shapeFieldName, bool isManaged,
ISpatialReference shapeSpatialReference, ISpatialReference rasterSpatialReference)
{
// create Fields
// add OID field
IFieldsEdit fieldsEdit = new FieldsClass();
fieldsEdit.AddField(createOIDField("ObjectID"));
// add NAME field
fieldsEdit.AddField(createNameField("name"));
// add RASTER field
fieldsEdit.AddField(createRasterField(rasterFieldName, isManaged, rasterSpatialReference));
// add SHAPE field
fieldsEdit.AddField(createShapeField(shapeFieldName, shapeSpatialReference));
// add XML field for METADATA
fieldsEdit.AddField(createXMLField());
return (IFields) fieldsEdit;
}
private IField createNameField(string fieldName)
{
// create Name field
IFieldEdit fieldEdit = new FieldClass();
fieldEdit.Name_2 = fieldName;
fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
return (IField) fieldEdit;
}
private IField createOIDField(string oidFieldName)
{
// Create OID field
IFieldEdit fieldEdit = new FieldClass();
fieldEdit.Name_2 = oidFieldName;
fieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
return (IField) fieldEdit;
}
private IField createRasterField(string rasterFieldName, bool isManaged, ISpatialReference spatialReference)
{
// create Raster field
IFieldEdit2 rasterFieldEdit = new FieldClass() as IFieldEdit2;
IRasterDef rasterDef = new RasterDefClass();
rasterDef.Description = "this is a raster catalog";
// only for PGDB
rasterDef.IsManaged = isManaged;
if (rasterFieldName.Length == 0)
rasterFieldName = "RASTER";
rasterFieldEdit.Name_2 = rasterFieldName;
rasterFieldEdit.Type_2 = esriFieldType.esriFieldTypeRaster;
// Set unknown spatial reference if not set
if (spatialReference == null)
spatialReference = new UnknownCoordinateSystemClass();
rasterDef.SpatialReference = spatialReference;
// Set rasterdef
rasterFieldEdit.RasterDef = rasterDef;
return (IField) rasterFieldEdit;
}
private IField createShapeField(string shapeFieldName, ISpatialReference spatialReference)
{
// Create Shape field
IFieldEdit fieldEdit = new FieldClass();
if (shapeFieldName.Length == 0)
shapeFieldName = "SHAPE";
fieldEdit.Name_2 = shapeFieldName;
fieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
fieldEdit.GeometryDef_2 = createGeometryDef(spatialReference);
return (IField) fieldEdit;
}
private IField createXMLField()
{
// create METADATA field
IFieldEdit fieldEdit = new FieldClass();
fieldEdit.Name_2 = "METADATA";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeBlob;
return (IField) fieldEdit;
}
private IGeometryDef createGeometryDef(ISpatialReference spatialReference)
{
// Create GeometryDef
IGeometryDefEdit geometryDefEdit = new GeometryDefClass();
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
geometryDefEdit.AvgNumPoints_2 = 4;
geometryDefEdit.GridCount_2 = 1;
geometryDefEdit.set_GridSize(0,1000);
// Set unknown spatial reference is not set
if (spatialReference == null)
spatialReference = new UnknownCoordinateSystemClass();
geometryDefEdit.SpatialReference_2 = spatialReference;
return (IGeometryDef) geometryDefEdit;
}
把栅格数据添加到栅格目录的代码很简单
void AddRasterToRasterCatalog(IRasterDataset rasterDataset, IRasterCatalog rasterCatalog)
{
IFeatureClass fClass = (IFeatureClass)rasterCatalog;
IFeature feature = fClass.CreateFeature();
//Create a raster value.
IRasterValue rasterValue = new RasterValueClass();
rasterValue.RasterDataset = rasterDataset;
feature.set_Value(rasterCatalog.NameFieldIndex, rasterValue);
feature.Store();
}
在调试过程中会发现,RasterCatalog会隐藏两个字段,而这两个字段是非常重要的字段。
栅格数据的打开也与众不同
void GetRasterDataset(IRasterCatalog rasterCatalog, int index)
{
IFeatureClass fClass = (IFeatureClass)rasterCatalog;
IRasterCatalogItem catalogItem = (IRasterCatalogItem)fClass.GetFeature
(index);
IRasterDataset rasterDataset = catalogItem.RasterDataset;
}
更改栅格数据的空间参考
public static IRaster reprojectRasterDataset(string rasterWorkspaceName, string inRasterDatasetName,
int projectedCoordinateCode)
{
IWorkspaceFactory rasterWorkspaceFactory = new RasterWorkspaceFactoryClass();
IRasterWorkspace rasterWorkspace = rasterWorkspaceFactory.OpenFromFile(rasterWorkspaceName, 0) as IRasterWorkspace;
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset(inRasterDatasetName);
// open rasterdataset and get default raster
IRaster raster = rasterDataset.CreateDefaultRaster();
System.Console.WriteLine("Created default raster: " + inRasterDatasetName);
// define spatial reference
SpatialReferenceEnvironment spatialReferenceEnvironment = new SpatialReferenceEnvironmentClass();
ISpatialReference projectedSpatialReference = spatialReferenceEnvironment.CreateProjectedCoordinateSystem(projectedCoordinateCode);
IRasterProps rasterProps = raster as IRasterProps;
System.Console.WriteLine("Orig Raster Coordinate System: ." + rasterProps.SpatialReference.Name.ToString());
rasterProps.SpatialReference = projectedSpatialReference;
System.Console.WriteLine("New Raster Coordinate System: ." + rasterProps.SpatialReference.Name.ToString());
// set raster property
rasterProps.Height = (rasterProps.Height / 2);
rasterProps.Width = (rasterProps.Width / 2);
return raster;
}
本文参考http://www.cnblogs.com/chen-whutgis/p/3824290.html博客实践后编写
赞助支付宝:505180987@qq.com
培训支持QQ:505180987