代码之家  ›  专栏  ›  技术社区  ›  corvus

GDAL驱动程序。Create()类型错误

  •  0
  • corvus  · 技术社区  · 7 年前

    我使用了 osgeo.gdal 模块将numpy数组保存为GeoTIFF文件,并在python中成功保存一段时间。今天,我决定编写一个简单的模块来处理驱动程序和文件创建例程。调用我的模块以保存numpy数组会出现以下错误:

    Traceback (most recent call last):
    File "saveRaster.py", line 30, in <module>
        save_raster(destination,1,array,srs,gt)
    File "saveRaster.py", line 10, in save_raster
        dataset_out = driver.Create(path, cols, rows, bands, dtype)
    File "/Library/Frameworks/GDAL.framework/Versions/2.1/Python/2.7/site-packages/osgeo/gdal.py", line 1440, in Create
        return _gdal.Driver_Create(self, *args, **kwargs)
    TypeError: in method 'Driver_Create', argument 5 of type 'int'
    

    这很奇怪,因为参数5是datatype参数,它应该采用gdal数据类型,例如 gdal.GDT_Float32 . 但是,如果它尝试 type(gdal.GDT_Float32) 它返回 <type 'int'> . 那为什么gdal给我一个 TypeError 如果一个整数应该正好是它所期望的?

    我的代码如下:

    #! /usr/bin/env python
    
    from osgeo import gdal,osr
    import numpy as np
    
    def save_raster(path, band_count, bands, srs, gt, format='GTiff', dtype=gdal.GDT_Float32):
        cols,rows = bands.shape
        # Initialize driver & create file
        driver = gdal.GetDriverByName(format)
        dataset_out = driver.Create(path, cols, rows, bands, dtype)
        dataset_out.SetGeoTransform(gt)
        dataset_out.SetProjection(srs)
        # Write the array to raster bands
        for b in range(band_count):
            out_band = dataset_out.GetRasterBand(b+1)
            out_band.WriteArray(bands[b])
        # Write file to disk
        dataset_out.FlushCache()
    
    gt = [0,1,0,0,0,-1]
    
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(epsg)
    srs = srs.ExportToWkt()
    
    destination = '~/Desktop/arr.tif'
    
    array = np.arange(0,25).reshape(5,5)
    
    save_raster(destination,1,array,srs,gt)
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Devin Cairns    4 年前

    这个问题有点老,但我遇到了这个问题并确定了问题。

    从回溯中可以看出, driver.Create 是的API _gdal.Driver_Create ,它具有不同的参数序列。当异常提到 argument 5 of type 'int' 它指的是频带计数。很可能您的数据类型不是 'int' 为你 bands 参数

    在使用 numpy 和GDAL结合在一起,因为GDAL Python API对接受的类型有严格的控制。

        2
  •  0
  •   JackLidge    6 年前

    我认为问题可能是您试图将列表作为数据类型传入。所以也许把这个改成 gdal.GDT_Float32 .

    或者,如果每个频带中有不同类型的数据类型,则可能是由以下值组成的数组 [gdal.GDT_Float32,gdal.GDT_Byte] 等等可能有用。此外,仅输入1不会引发错误,但在不知道其他值的情况下,我无法确定这是否正确。

    如果不知道您想要为数据类型输入什么类型的内容,很难准确地回答。