属性错误'function'对象没有属性'DataType'。

0 人关注

我想这是一个很容易解决的问题,可能是由于我对Python不了解。

我想做的是把这个4个带状的 北亚裔美国人协会 并创建一个432的假彩色图像。最终要创建一个脚本,通过数以百计的这些图像来完成,但这显然是很遥远的事情。

我一直收到一个错误 AttributeError: 'function' object has no attribute 'DataType' 。 如果我输入一个数据类型,例如。替换代码1】(我并不完全理解),然后我就会收到错误 AttributeError: 'function' object has no attribute 'shape' 。这让我相信,要么这个栅格和我在一个类似的函数中使用的栅格有什么不同,要么我从根本上读错了栅格。

Here is my full code:

import os
from osgeo import gdal
#change directory to data location
data_folder = r'my directory'
os.chdir(data_folder)
#open the .tif file and its bands, make sure they opened properly
ds = gdal.Open('example.tif') 
if ds is None: 
    raise IOError('Cound not open raster ya n00b')
band1 = ds.GetRasterBand(1).ReadAsArray
if band1 is None:
    raise IOError('bandz 1 didnt make her dance')
band2 = ds.GetRasterBand(2).ReadAsArray
if band2 is None:
    raise IOError('bandz 2 didnt make her dance')
band3 = ds.GetRasterBand(3).ReadAsArray
if band3 is None:
    raise IOError('bandz 3 didnt make her dance')
band4 = ds.GetRasterBand(4).ReadAsArray
if band4 is None:
    raise IOError('bandz 4 didnt make her dance')
#Get the GeoTiff driver to create an output raster    
gtiff_driver = gdal.GetDriverByName('GTiff')
#Get the data type name
data_type = band1.DataType
data_type = gdal.GetDataTypeName(data_type)
test_1 = gtiff_driver.Create('test_v1.tif', ds.RasterXSize, ds.RasterYSize, 3, gdal.GDT_Byte)
if test_1 is None:
    raise IOError('Could not create raster test_1')
test_1.SetProjection(ds.GetProjection())
test_1.SetGeoTransform(ds.GetGeoTransform())
t1_band1 = test_1.GetRasterBand(1)
t1_band1.WriteArray(band4)
t1_band2 = test_1.GetRasterBand(2)
t1_band2.WriteArray(band3)
t1_band3 = test_1.GetRasterBand(3)
t1_band3.WriteArray(band2)
del t1_band1, t1_band2, t1_band3, test_1, ds 

我觉得我在这里只是很笨,但真的很感谢一些帮助。哦,我还在使用Python 2,我知道我需要尽快转换。谢谢您的帮助。

1 个评论
函数通常没有属性,所以band1不是你想的那样。作为一个大胆的猜测,如果你做band1 = ds.GetRasterBand(1).ReadAsArray() {注意最后的括号}会发生什么?
python
gis
python-2.x
raster
Richard
Richard
发布于 2019-12-19
1 个回答
Tim Richardson
Tim Richardson
发布于 2019-12-19
已采纳
0 人赞同

I think try

band1 = ds.GetRasterBand(1).ReadAsArray()

并在最后加上括号。

小括号是Python的语法,用于调用函数并获得结果。 如果没有括号,你就把band1变成了ReadAsArray函数的同义词。 这在其他情况下会有帮助,你可以这样做

 band1 = ds.GetRasterBand(1).ReadAsArray    
 x = band1()