精华内容
下载资源
问答
  • 该示例从存有点信息的Excel表中读取数据,生成栅格数据集
  • 创建栅格数据集失败解析

    万次阅读 2017-05-03 19:57:49
    创建栅格数据集所需磁盘空间过大,而当前使用的磁盘空间不足引起,可能情况如下:栅格数据集从文件/SQL 数据源复制至另一文件/SQL 数据源,复制失败; 栅格数据集从 Oracle 数据源复制至一文件数据源,复制失败; ...

    在执行创建栅格集或相关操作时,若操作执行失败,很可能是如下两种原因引起:

    1. 创建的栅格数据集所需磁盘空间过大,而当前使用的磁盘空间不足引起,可能情况如下:

      1. 栅格数据集从文件/SQL 数据源复制至另一文件/SQL 数据源,复制失败;

      2. 栅格数据集从 Oracle 数据源复制至一文件数据源,复制失败;

      3. 点数据集通过【插值向导】向文件/SQL
        数据源创建行列数较大的栅格数据集,插值失败;

      4. 矢量数据集通过【矢量栅格化】向文件/SQL
        数据源创建行列数较大的栅格数据集,栅格化失败;

    2. 创建的栅格数据集所需磁盘空间过大,Oracle 表空间内存不足,且无自动扩展功能,

    可能情况如下:

    1. 文件/SQL/Oracle 数据源中栅格数据集复制至 Oracle 数据源,复制失败;

    2. 点数据集通过【插值向导】向 Oracle
      数据源创建行列数较大的栅格数据集,插值失败;

    3. 矢量数据集通过【矢量栅格化】向 Oracle
      数据源创建行列数较大的栅格数据集,栅格化失败;
      栅格数据集占用磁盘空间大小为:栅格行数*栅格列数*栅格数据位数(单位
      Byte)。栅

    格数据位数可通过【数据集】——【属性】——【图像属性】——【图像格式】得到,其中

    单精度浮点型表示 32 位,双精度浮点型表示 64 位。

    展开全文
  • 通过指定栅格单元格的宽度分辨率和高度分辨率来创建一个栅格数据集
  • Arcgis Engine中关于创建栅格数据集的NoData问题 我们知道在ArcMap中生成一张栅格图像时,其有效值所包含的区域内形状不一定是和屏幕横向或纵向平行的,而ArcMap在生成栅格图像时,也是和我们一样创建了格网,通过...

    Arcgis Engine中关于创建栅格数据集的NoData问题

    我们知道在ArcMap中生成一张栅格图像时,其有效值所包含的区域内形状不一定是和屏幕横向或纵向平行的,而ArcMap在生成栅格图像时,也是和我们一样创建了格网,通过分析他的数据,我个人认为ArcMap也是创建了规则格网,因为在其四个角点组成的最大外接矩形框内,透明白色区域的值会显示“NoData”,而之外的透明白色区域都无值可查。如下图所示(自己也可以在ArcMap中生成一副栅格试验一下):
    在这里插入图片描述
    据此可以推断,在生成栅格时,其建立格网均是以规则切与屏幕方向平行的方向建立的,遍历规则也需从左上角(ArcEngine遍历规则)或者左下角(哈希表遍历规则)依次遍历。
    ArcGIS Engine 10 开发手册中的创建栅格数据集是这样的:

    public IRasterDataset CreateRasterDataset (string pRasterFolderPath,string pFileName, string pRasterType, ISpatialReference pSpr)
    {
      IRasterWorkspace2 pRasterWs = GetRasterWorkspace (pRasterFolderPath) as IRasterWorkspace2;
    
      IPoint pPoint = new PointClass ();
      pPoint.PutCoords (15.0, 15.0);
    
      int pWidth = 300;
      int pHeight = 300;
      double xCell = 30;
      double yCell = 30;
      int NumBand = 1;
    
      IRasterDataset pRasterDataset = pRasterWs.CreateRasterDataset (pFileName, pRasterType,pPoint, pWidth, pHeight, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, pSpr,true);
    
      IRasterBandCollection pRasterBands = (IRasterBandCollection) pRasterDataset;
    
      IRasterBand pRasterBand = pRasterBands.Item (0);
      IRasterProps pRasterProps = (IRasterProps) pRasterBand;
    
      pRasterProps.NoDataValue = 255;
    
      IRaster pRaster = pRasterDataset.CreateDefaultRaster ();
    
      IPnt pPnt = new PntClass ();
      pPnt.SetCoords (30, 30);
    
      IRaster2 pRaster2 = pRaster as IRaster2;
      IRasterEdit pRasterEdit = (IRasterEdit) pRaster2;
    
      IRasterCursor pRasterCursor = pRaster2.CreateCursorEx (pPnt);
    
      do
      {
        IPixelBlock3 pPixelblock = pRasterCursor.PixelBlock as IPixelBlock3;
    
        System.Array pixels = (System.Array) pPixelblock.get_PixelData (0);
    
        for (int i = 0; i & lt; pPixelblock.Width; i++)
    
          for (int j = 0; j & lt; pPixelblock.Height; j++)
            if (i == j)
    
              pixels.SetValue (Convert.ToByte (255), i, j);
            else
              pixels.SetValue (Convert.ToByte ((i* j + 30) / 255), i, j);
    
        pPixelblock.set_PixelData (0,(System.Array) pixels);
        IPnt pUpperLeft = pRasterCursor.TopLeft;
    
        pRasterEdit.Write (pUpperLeft,(IPixelBlock) pPixelblock);
    
      } while (pRasterCursor.Next ());
    
      System.Runtime.InteropServices.Marshal.ReleaseComObject (pRasterEdit);
    
      return pRasterDataset;
    }
    

    其中,有这样一句pRasterProps.NoDataValue = 255;,我们可以按F12查看此接口IRasterProps的定义。关于NoDataValue的定义如下:
    在这里插入图片描述
    我们由此可知,用此接口来设置“NoData”,我们知道灰度图像的值范围为0-255,因此,如果超出这个值,在输出灰度图像栅格时,我们将这些值统一标记为“NoData”即可。具体代码如下:
    PS:我是以哈希表来传递值的,因此在后面遍历传值时,涉及到ArcEngine的遍历和HashTable的遍历转换问题。

            /// <summary>
            /// 创建栅格数据集
            /// </summary>
            /// <param name="pFileDirectoryName"></param>
            /// <param name="pFielName"></param>
            /// <param name="pXmin">格网最小X</param>
            /// <param name="pYmin">格网最小Y</param>
            /// <param name="pGridSide">一个格网长</param>
            /// <param name="pHashtable">输入的哈希表</param>
            /// <param name="pRowSum">格网总行数</param>
            /// <param name="pColumnSum">格网总列数</param>
            /// <returns></returns>
            public IRasterDataset CreateRasterDataset(string pFileDirectoryName, string pFielName, double pXmin, double pYmin, double pGridSide, Hashtable pHashtable, int pRowSum, int pColumnSum)
            {
                //原点
                IPoint pOriginPoint = new PointClass();
                pOriginPoint.PutCoords(pXmin, pYmin);
    
                //创建数据集
                IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass();//using ESRI.ArcGIS.DataSourcesRaster;
                IRasterWorkspace2 pRasterWorkspace = pWorkspaceFactory.OpenFromFile(pFileDirectoryName, 0) as IRasterWorkspace2;
                IRasterDataset pRasterDataset = pRasterWorkspace.CreateRasterDataset(pFielName, "TIFF", pOriginPoint, pColumnSum, pRowSum, pGridSide, pGridSide, 1, rstPixelType.PT_DOUBLE, new UnknownCoordinateSystemClass(), true);
    
                IRasterBandCollection pIRasterBandCollection = (IRasterBandCollection)pRasterDataset;
                IRasterBand pIRasterBand;
                IRasterProps pIRasterProps;
                pIRasterBand = pIRasterBandCollection.Item(0);
                pIRasterProps = (IRasterProps)pIRasterBand;
                //Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band.
                pIRasterProps.NoDataValue = 256; //以此值来标记“NoData”
                IRaster pIRaster = ((IRasterDataset2)pRasterDataset).CreateFullRaster();
    
                IPnt blocksize = new PntClass();
                blocksize.SetCoords(pColumnSum, pRowSum);
                IPixelBlock3 pIPixelBlock3 = pIRaster.CreatePixelBlock(blocksize) as IPixelBlock3;
    
                System.Array pPixelData;
                pPixelData = (System.Array)pIPixelBlock3.get_PixelData(0);
                byte[] outputArray = (byte[])pIPixelBlock3.get_NoDataMaskByRef(0);
                for (int i = 0; i < pColumnSum; i++)//列数
                {
                    for (int j = 0; j < pRowSum; j++)//行数
                    {
                        int pGridIndex = (pRowSum - j - 1) * pColumnSum + (i + 1);//遍历顺序转换
                        if (pHashtable.ContainsKey(pGridIndex))
                        {
                            pPixelData.SetValue(Convert.ToDouble(pHashtable[pGridIndex]), i, j);
                        }
                        else
                        {
                            pPixelData.SetValue(Convert.ToDouble(256), i, j);  //将此值输出,结果为“NoData”
                        }
                    }
                }
    
                pIPixelBlock3.set_PixelData(0, (System.Object)pPixelData);
                IPnt upLeft = new PntClass();
                upLeft.SetCoords(0, 0);
                IRasterEdit rasterEdit = (IRasterEdit)pIRaster;
                rasterEdit.Write(upLeft, (IPixelBlock)pIPixelBlock3);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);
                return pRasterDataset;
            }
        }
    

    至此,我们可以达到和ArcMap中一样的效果。
    感谢各位浏览支持,多多交流。

    展开全文
  • 打开栅格文件打开GDAL支持的栅格数据之前需要注册驱动,GDALAllRegister()函数将尝试注册所有已知的驱动,包含那些用GDALDriverManager::AutoLoadDrivers()函数自动加载的.so文件。 GDALAllRegister(); GDALDataset ...

    打开栅格文件

    打开GDAL支持的栅格数据之前需要注册驱动,GDALAllRegister()函数将尝试注册所有已知的驱动,包含那些用GDALDriverManager::AutoLoadDrivers()函数自动加载的.so文件。

        GDALAllRegister();
        GDALDataset *poDataset;
        const char* pszFileName = "C:\\Users\\jinun\\Desktop\\SCRH\\dataset\\sub-TM-Spot-GS.img";
        poDataset = (GDALDataset *)GDALOpen( pszFileName, GA_ReadOnly);
        if( poDataset == NULL){
            printf( "Open the file failed!");
        }
        else{
            printf( "Open succeed!\n" );
        }

    如果GDALOpen()函数返回NULL,则打开失败,失败信息可以通过CPLError()函数获取。

    获取数据集信息

    可以使用adfGeoTransform[]表示一些信息:

    adfGeoTransform[0] /* top left x */
    adfGeoTransform[1] /* w-e pixel resolution */
    adfGeoTransform[2] /* 0 */
    adfGeoTransform[3] /* top left y */
    adfGeoTransform[4] /* 0 */
    adfGeoTransform[5] /* n-s pixel resolution (negative value) */

    下面代码是获取数据集中的一些信息:

        double adfGeoTransform[6];
        printf( "Driver: %s / %s\n",
                poDataset->GetDriver()->GetDescription(),
                poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ));
        printf( "Size is %dx%dx%d\n",
                poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
                poDataset->GetRasterCount());
        if ( poDataset->GetProjectionRef() != NULL)
        {
            printf( "Projection is '%s'\n",
                    poDataset->GetProjectionRef() );
        }
        if (poDataset->GetGeoTransform( adfGeoTransform ) == CE_None){
            printf( "Origin = (%.6f,%.6f)\n",
                    adfGeoTransform[0], adfGeoTransform[3] );
            printf( "Pixel Size = (%.6f,%.6f)\n",
                    adfGeoTransform[1], adfGeoTransform[5] );
        }

    获取栅格波段

    获取栅格波段可以通过GDAL来完成,同时还会获得元数据、块大小、颜色表以及其他不同的信息。

        GDALRasterBand *poBand;
        int nBlockXSize, nBlockYSize;
        int nGotMin, nGotMax;
        double adfMinMax[2];
        poBand = poDataset->GetRasterBand( 1 );
        poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
        printf( "Block = %dx%d Type = %s, ColorInterp = %s\n",
                nBlockXSize, nBlockYSize,
                GDALGetDataTypeName( poBand->GetRasterDataType()),
                GDALGetColorInterpretationName( poBand->GetColorInterpretation()) );
        adfMinMax[0] = poBand->GetMinimum( &nGotMin );
        adfMinMax[1] = poBand->GetMaximum( &nGotMax );
        if( !( nGotMin && nGotMax )){
            GDALComputeRasterMinMax( (GDALRasterBandH)poBand, TRUE, adfMinMax );
        }
        printf( "Min = %.3fd, Max = %.3f\n",adfMinMax[0], adfMinMax[1] );
    
        if( poBand->GetOverviewCount() > 0 ){
            printf( "Band has %d overviews.\n", poBand->GetOverviewCount() );
        }
        if( poBand->GetColorTable() != NULL){
            printf( "Band has a color table with %d entries.\n",
                    poBand->GetColorTable()->GetColorEntryCount() );
        }

    读取栅格数据

    有几种方法来读取栅格数据,最常用的是通过 GDALRasterBand::RasterIO()方法,这种方法会自动的进行数据类型转换,向上或向下采样。下面代码是读取相同大小缓冲区的数据的第一行,然后将其转换为浮点型。

    float *pafScanline;
    int   nXSize = poBand->GetXSize();
    pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
    poBand->RasterIO( GF_Read, 0, 0, nXSize, 1,
                      pafScanline, nXSize, 1, GDT_Float32,
                      0, 0 );

    关于GDALRasterBand::RasterIO()的使用,可以参考这篇博客

    创建文件

    在GDAL支持的文件格式中,如果格式驱动支持创建,则可以创建新文件。有两种方法创建新文件:CreateCopy()和Create()。第一个方法是调用CreateCopy()函数,传递一个需要拷贝的源数据集参数。第二个方法是调用Create()函数。创建新文件的所有驱动支持CreateCopy方法,只有部分驱动支持Create方法。
    为了确定驱动支持CreateCopy方法还是Create方法,需要检查格式驱动对象中的DCAP_CREATE 和DCAP_CREATECOPY 元数据。在调用GetDriverByName函数之前,需要用GDALAllRegister()进行驱动注册。下面代码是测试该驱动支持哪种方法:

        GDALAllRegister();
        /*
         * 目前,子数据集支持的驱动有ADRG、ECRGTOC、GEORASTER、GTiff、HDF4、HDF5、netCDF、
         * NITF、NTv2、OGDI、PDF、PostGISRaster、Rasterlite、RPFTOC、RS2、WCS和WMS。
         */
        const char *pszFormat = "GTiff";
        GDALDriver *poDriver;
        char **papszMetadata;
        poDriver = GetGDALDriverManager()->GetDriverByName( pszFormat );
        if (poDriver == NULL){
            exit(1);
        }
        papszMetadata = poDriver->GetMetadata();
        if (CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ))
            printf( "Driver %s supports Create() method.\n", pszFormat );
        if ( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE) )
            printf( "Driver %s supports CreateCopy() method.\n", pszFormat );

    使用CreateCopy方法

    该方法需要指明需要拷贝的文件以及要保存的文件。

     const char* pszSrcFileName = "C:\\Users\\jinun\\SCRH\\dataset\\sub-TM-Spot-GS.img";
        const char* pszDstFileName = "C:\\Users\\jinun\\SCRH\\dataset\\dst.img";;
    
        GDALDataset *poSrcDS = (GDALDataset *) GDALOpen( pszSrcFileName, GA_ReadOnly );
        GDALDataset *poDstDS;
        poDstDS = poDriver->CreateCopy( pszDstFileName, poSrcDS, FALSE,
                                        NULL, NULL, NULL );
        if( poDstDS != NULL){
            GDALClose( (GDALDatasetH) poDstDS );
        }
        GDALClose( (GDALDatasetH) poSrcDS );

    当需要传入更多的参数并且显示拷贝的进度,可以进行如下设计:

        char **papszOptions = NULL;
        papszOptions = CSLSetNameValue( papszOptions, "TILED", "YES" );
        papszOptions = CSLSetNameValue( papszOptions, "COMPRESS" ,"PACKBITS" );
        poDstDS = poDriver->CreateCopy( pszDstFileName, poSrcDS, FALSE,
                                        papszOptions, GDALTermProgress, NULL);
    
        if( poDstDS != NULL){
                GDALClose( (GDALDatasetH) poDstDS );
            }
            GDALClose( (GDALDatasetH) poSrcDS );

    使用Create方法

    如果不只是将现有文件拷贝到指定位置,则可以利用 GDALDriver::Create()方法创建新的文件。create()方法接受参数和createcopy()类似,但是必须要提供图像的大小、波段数及波段类型。

    GDALDataset *poDstDS;
    char **papszOptions = NULL;
    poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte,
                                papszOptions );

    当数据集创建成功,所有恰当的元数据和栅格数据信息就必须写到新建的文件中。

    double adfGeoTranform[6] = { 444720, 30, 0, 3751320, 0, -30 };
        OGRSpatialReference oSRS;//该类需要#include "ogr_spatialref.h"头文件
        char *pszSRS_WKT = NULL;
        GDALRasterBand *poBand;
        GByte abyRaster[512 * 512];
        poDstDS->SetGeoTransform( adfGeoTranform );
    
        oSRS.SetUTM( 11, TRUE );
        oSRS.SetWellKnownGeogCS( "NAD27" );
        oSRS.exportToWkt( &pszSRS_WKT );
        CPLFree( pszSRS_WKT );
    
        poBand = poDstDS->GetRasterBand(1);
        poBand->RasterIO( GF_Write, 0, 0, 512, 512,
                          abyRaster, 512, 512, GDT_Byte, 0, 0);
        GDALClose( (GDALDatasetH) poDstDS );
    展开全文
  • /// 创建RasterDataset数据集 /// </summary> /// <param name="pWs">打开的工作空间</param> /// <param name="sDatasetName">Dataset的名字</param> /// <param name=...
            /// <summary>
            /// 创建RasterDataset数据集
            /// </summary>
            /// <param name="pWs">打开的工作空间</param>
            /// <param name="sDatasetName">Dataset的名字</param>
            /// <param name="iBands">波段值</param>
            /// <param name="iPixelType">Pixel Type</param>
            /// <param name="iCellSizeX">X CellSize</param>
            /// <param name="iCellSizeY">Y CellSize</param>
            /// <param name="pSR">坐标参考系</param>
            /// <param name="iPyramid">金字塔值</param>
            /// <param name="iType">压缩算法</param>
            /// <param name="sKeyword"></param>
            /// <param name="iCompressRate">压缩比例</param>
            /// <returns>返回创建的数据集</returns>
            public static IRasterDataset CreateNewRasterDataset(IRasterWorkspaceEx pWs, string sDatasetName, int iBands, int iPixelType, int iCellSizeX, int iCellSizeY, ISpatialReference pSR, int iPyramid, int iType, string sKeyword, int iCompressRate) {
                IRasterDef rasterDef = createRasterDef(false, pSR);
                IRasterStorageDef rasterStoreDef = createRasterStorageDef(iPyramid, iType, iCompressRate, iCellSizeX, iCellSizeY);
                // Bug Fix:下面这句会引发错误,暂时屏蔽掉
                //IGeometryDef geoDef = createGeoDefds(pSR);
                IGeometryDef geoDef = null;
    
                if (sKeyword == null)
                    sKeyword = "defaults";
    
                IRasterDataset pRasterDataset = null;
    
                try {
                    pRasterDataset = pWs.CreateRasterDataset(sDatasetName, iBands,
                        (rstPixelType)iPixelType, rasterStoreDef, sKeyword, rasterDef, geoDef);
                }
                catch {
                    throw;
                }
    
                return pRasterDataset;
            }
    
           private static IRasterStorageDef createRasterStorageDef(int iPyramid, int iType, int iCompressRate, int iCellSizeX, int iCellSizeY) {
                IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass();
                pRasterStorageDef.CompressionQuality = iCompressRate;
                pRasterStorageDef.CompressionType = (esriRasterCompressionType)iType;
                pRasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_NearestNeighbor;
                pRasterStorageDef.PyramidLevel = iPyramid;
                pRasterStorageDef.TileHeight = 128;
                pRasterStorageDef.TileWidth = 128;
                if (iCellSizeX > 0 && iCellSizeY > 0) {
                    IPnt pntCellSize = new ESRI.ArcGIS.DataSourcesRaster.DblPntClass();
                    pntCellSize.SetCoords(iCellSizeX, iCellSizeY);
                    pRasterStorageDef.CellSize = pntCellSize;
                }
    
                return pRasterStorageDef;
            }

     

    展开全文
  • 打开栅格目录中的一个数据 IRasterDataset GetRasterCatalogItem(IRasterCatalog pCatalog, int pObjectID) { //栅格目录继承了IFeatureClass IFeatureClass pFeatureClass = (IFeature...
  • 矢量数据快速符号化,可以将常用的样式保存到样式符号库,栅格数据快速符号化,需要创建色彩映射表。本文以GlobeLand30土地覆盖数据为例,详解ArcGIS中创建与使用色彩映射表。 文章目录一、 ArcGIS色彩映射表介绍二...
  • 这段时间我一直在研究如何用PIE创建带压缩的栅格数据集,由于我在比赛中使用的原始影像大小普遍都在300M以上,软件加载较慢,因此希望能对原始影像进行压缩,加快加载时间。 首先,该方法的关键是修改DataSource....
  • 使用Rasterio创建栅格数据

    千次阅读 2018-06-10 10:26:08
    使用Rasterio创建栅格数据 作者:阿振 邮箱:tanzhenyugis@163.com 博客:https://blog.csdn.net/theonegis/article/details/80089375 修改时间:2018-06-09 声明:本文为博主原创文章,转载请注明原文出处 ...
  • 创建文件栅格数据集的代码

    千次阅读 2005-08-30 22:05:00
    创建文件栅格数据集的代码,来自...
  • 1.地理数据库中的数据集 ArcGIS是围绕着Geodatabase数据库构建的,它使用对象关系型数据库来存储空间数据。Geodatabase是一个存储数据集的容器,同时将空间...2.栅格数据集 3.表  地理数据库存储既包括各个
  • arcgis如何求两个栅格数据集的差集

    千次阅读 2018-12-06 10:25:00
    栅格数据集没有擦除功能,现在有栅格A和栅格B,怎么求两个栅格的差集C 具体步骤如下: 1、首先利用栅格计算器,把栅格B中的value全部赋值为0 输入语句:"栅格B" * 0 2 建立一个面图层:在ArcCataLog...
  • 客户提出一个问题,我的ArcGIS10.1 for Desktop,我并没有使用Esri提供的RasterDataset、RasterCatalog、MosaicDataset存储模型,直接将tiff数据导入到ArcSDE地理数据库中,第一次导入已经默认创建了金字塔,...
  • 栅格数据创建与保存

    千次阅读 2018-05-26 02:23:27
    栅格数据创建与保存 作者:阿振 邮箱:tanzhenyugis@163.com 博客:https://blog.csdn.net/theonegis/article/details/80089375 修改时间:2018-05-24 声明:本文为博主原创文章,转载请注明原文出处 思路...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,736
精华内容 2,294
关键字:

创建栅格数据集