GDAL driver.Create() 类型错误

GDAL driver.Create() TypeError

我已经使用 osgeo.gdal 模块在 python 中成功将 numpy 数组保存为 GeoTIFF 文件一段时间了。今天我决定编写一个简单的模块来处理驱动程序和文件创建例程。调用我的模块来保存一个 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 是数据类型参数,它应该采用 gdal 数据类型,例如 gdal.GDT_Float32。但是,如果它尝试 type(gdal.GDT_Float32) 它 returns <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)

我认为问题可能出在您试图将列表作为数据类型传递。所以也许将其更改为 gdal.GDT_Float32.

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

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

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

正如您从回溯中看到的那样,driver.Create_gdal.Driver_Create 的 API,它具有不同的参数序列。当异常提到 argument 5 of type 'int' 时,它指的是波段数。您的 bands 参数的数据类型可能不是 'int'

在同时使用 numpy 和 GDAL 时,这些类型的问题经常让我感到困惑,因为 GDAL Python API 对接受的类型有严格的控制。