栅格数据数据入库管理

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值