GDAL 驱动程序.创建() 类型错误



我已经使用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)它会返回<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)

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

从回溯中可以看出,driver.Create是一个用于_gdal.Driver_Create的 API,它具有不同的参数序列。当异常提到argument 5 of type 'int'时,它指的是波段计数。您的'int'数据类型可能不适用于bands参数

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

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

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

很难准确回答,不知道您要为数据类型放入哪种内容。

相关内容

最新更新