如何使用GDAL将操纵后的栅格值写入ASCII网格?

4
我正在尝试使用GDAL处理栅格数据(ASCII格式),但在此之前,我有困难将新的值写入文件。在调用slopeband.WriteArray(s)时,会出现以下错误信息:
ERROR 6:slope.asc,波段1:此数据集不支持WriteBlock()。
ERROR 1:slope.asc,波段1:写一个脏块时出错。
非常抱歉如果这很基础,但我还是新手,特别是对Python和GDAL。我在Mac OS X 10.6.8上使用GDAL 1.9.0和Python 2.7。谢谢!
import numpy
import gdal
import gdalconst

dgm = gdal.Open("DGM_10_MR.asc", gdalconst.GA_ReadOnly)
driver = dgm.GetDriver()
geotransform = dgm.GetGeoTransform()
band = dgm.GetRasterBand(1)
data = band.ReadAsArray()

cols = dgm.RasterXSize
rows = dgm.RasterYSize
slope = driver.CreateCopy("slope.asc", dgm)
slope = None
dgm = None
slope = gdal.Open("slope.asc", gdalconst.GA_Update)
slope.SetGeoTransform(geotransform)
slopeband = slope.GetRasterBand(1)
s = slopeband.ReadAsArray()

for y in range(rows):
    for x in range(cols):
        s[y, x] = 0.0

slopeband.WriteArray(s)
slopeband.FlushCache()
del s

dgm = None
slope = None
print "done"
1个回答

9

很抱歉,GDAL无法跨越所有文件类型读取和写入相同的程度。 Arc ASCII grid恰好是GDAL无法写入的文件类型之一。 正如您的错误消息所说:WriteBlock()不支持此数据集。,因此您无法写入Arc ASCII网格。

作为替代方案,您可以将现有的ASCII数据集转换为不同的文件类型,其中GDAL更完全支持的文件类型,例如GeoTiff。 要转换文件类型,您可以使用gdal_translate命令行程序,如下所示:

gdal_translate -of GTiff DGM_10_R.asc DGM_10_R.tif

我在我的电脑上重现了您的错误,并且简单地更改文件类型可以修复这些错误。

AAIGrid支持读/写;错误是因为在Open时使用了GA_ReadOnly标志。 - Mike T
我同意你的观点,即gdalinfo --formats和GDAL文档声称可以读写Arc ASCII Grid,但是当我按照你建议使用ASCII网格和gdalconst.GA_Update运行@Lucia的示例代码时,我遇到了相同的错误:ERROR 6: WriteBlock() not supported for this dataset.。正如我在我的回答中提到的那样,使用更好支持的栅格格式(如GeoTiff)可以解决这个问题。 - James
2
好的,深入挖掘后看起来是正确的,并且AAIGrid驱动程序只能创建副本,而不能更新/修改值。该错误在GDAL 1.9中显示,但不会出现在之前的版本中(它悄悄地不修改值)。我同意使用GTiff驱动程序要简单得多。 - Mike T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接