格达尔文字

2024-05-15 23:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PythonGDAL将光栅数据写入.tif文件。代码如下:

import numpy, sys
from osgeo import gdal, utils
from osgeo.gdalconst import *

# register all of the GDAL drivers
gdal.AllRegister()

# open the image
inDs = gdal.Open("C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\color_a1.tif",GDT_UInt16)
if inDs is None:
  print "couldn't open input dataset"
  sys.exit(1)
else:
  print "opening was successful!"
cols = inDs.RasterXSize
rows = inDs.RasterYSize
bands =  inDs.RasterCount
driver = inDs.GetDriver()
driver.Create("C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\newfile.tif",cols,rows,3,GDT_UInt16)
outDs = gdal.Open("C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\newfile.tif")

if outDs is None:
  print "failure to create new file"
  sys.exit(1)


outBand1 = outDs.GetRasterBand(1)
outBand2 = outDs.GetRasterBand(2)
outBand3 = outDs.GetRasterBand(3)
data1 = inDs.GetRasterBand(1).ReadAsArray()
data2 = inDs.GetRasterBand(2).ReadAsArray()
data3 = inDs.GetRasterBand(3).ReadAsArray()

outBand1.WriteArray(data1,0,0)
outBand2.WriteArray(data2,0,0)
outBand3.WriteArray(data3,0,0)

print "before closing out the file"
print outDs.GetRasterBand(1).ReadAsArray(700,700,5,5)
print outDs.GetRasterBand(2).ReadAsArray(700,700,5,5)
print outDs.GetRasterBand(3).ReadAsArray(700,700,5,5)

outDs.SetProjection(inDs.GetProjection())
outDs.SetGeoTransform(inDs.GetGeoTransform())

outDs = None
outDs = gdal.Open("C:\\Documents and Settings\\patrick\\Desktop\\tiff elevation\\EBK1KM\\newfile.tif")
print "after reopening"
print outDs.GetRasterBand(1).ReadAsArray(700,700,5,5)
print outDs.GetRasterBand(2).ReadAsArray(700,700,5,5)
print outDs.GetRasterBand(3).ReadAsArray(700,700,5,5)

关闭和重新打开输出数据集之间的结果输出不同:

before closing out the file
[[ 36  35  55 121   0]
 [ 54   0 111 117   0]
 [  0 117 152  56   0]
 [ 89 122  56   0   0]
 [102 107   0  25  53]]
[[ 68  66 126 200   0]
 [ 78   0 166 157   0]
 [  0 235 203  70   0]
 [229 251 107   0   0]
 [241 203   0  42 121]]
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
after reopening
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

在将变量设置为None之前,是否缺少一些命令来确保文件已被写入和保存?我试着加上以下两个都不走运:

outband1.FlushCache()
outDs.FlushCache()

Tags: andthesettingsdocumentsprintdesktopgdalelevation
1条回答
网友
1楼 · 发布于 2024-05-15 23:34:54

您不需要Create然后Open光栅(您正在读取GA_ReadOnly)。开始时也不需要gdal.AllRegister(),因为在将GDAL加载到Python中时已经调用了它(请参见GDAL API Tutorial)。

在上面的某个地方(经过修改):

# Create a new raster data source
outDs = driver.Create(out_fname, cols, rows, 3, gdal.GDT_UInt16)

# Write metadata
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())

# Write raster data sets
for i in range(3):
    outBand = outDs.GetRasterBand(i + 1)
    outBand.WriteArray(data[i])

# Close raster file
outDs = None

有时我添加此项以确保文件完全释放,并防止遇到某些gotchas

del outDs, outBand

相关问题 更多 >