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 对接受的类型有严格的控制。
我已经使用 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 对接受的类型有严格的控制。