【问题标题】:How to correctly use gdaladdo in a Python program?如何在 Python 程序中正确使用 gdaladdo?
【发布时间】:2016-01-14 12:01:30
【问题描述】:

我的问题是关于名为 gdaladdo 的 GDAL(地理空间数据抽象库)工具。该工具应该从 .tif 文件构建概览图像。从我在上面找到的文档中,我可以看到它通常被输入到命令提示符中。我一直在尝试找到一种通过我的 Python 程序运行它的方法,因为我有几千个需要外部概览的 .tif 图像。我对这个程序的最终目标是能够将 .tif 图像传递给它,并为其创建一个 .rrd 金字塔。到目前为止,这是我的代码:

import gdal
import os
from subprocess import call

#Define gdaladdo
gdaladdoFile = 'C:\Program Files (x86)\GDAL\gdaladdo.exe'

#--------------------------------------------------------

os.chdir("Images")

openfile = open('imagenames.txt', 'r')

if {openfile.closed == False}:
    count = 0
    while count < 5:
        #Grab the image to work with
        filename = openfile.readline()

        #Strip off the newline
        filename.rstrip('\n')

        #Create pyramid
        call([gdaladdoFile, '-ro', '--config USE_RRD YES', 'filename', '2 4 8 16'])
        count += 1
    openfile.close()

else:
    print "No file to open!"

我收到与 call([gdaladdoFile, '-ro', '--config USE_RRD YES', 'filename', '2 4 8 16']) 行有关的错误。通常在命令提示符中键入此命令时,它应该如下所示:'gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE erdas.img 2 4 8 16' 但 Python 会说出选项(如 --config USE_RRD YES) 语法不正确。因此,我遵循了将参数传递给子进程的示例(我在此处找到)并将选项放在单引号内并在每个选项后添加逗号。语法错误消失了,但是当我运行程序进行测试时会出现新的错误。它在命令提示符窗口中显示“FAILURE: Unknown option name '--config USE_RRD YES'”。 我应该如何更改此特定行以使其执行我想要执行的操作?

我是 stackoverflow 的新手,还在大学学习编程,所以请原谅我的无知并温柔对待我。提前感谢您对这个问题的帮助。

gdaladdo reference link,以备不时之需。

【问题讨论】:

  • 您是否尝试过将--config USE_RRD YES 拆分为三个单独的列表项?即'--config','USE_RRD','YES'?另外,我不知道您是否注意到了这一点,但是您传递的是字符串“文件名”而不是变量filename
  • @RNar 我刚才试过了,命令提示符现在给了我不同的错误。首先与我的目录更改有关(我只是将其修复为更清晰),现在它抱怨我的图像在它们非常存在时不存在。当我解决所有这些奇怪的错误时,我会告诉你你的建议是否解决了我的真正问题。谢谢你的想法!
  • @RNar 再次感谢您的建议。它解决了我的问题,我终于生成了文件!问题解决了。

标签: python python-2.7 arguments subprocess gdal


【解决方案1】:

为避免使用 Python 子流程模块,您可以将 BuildOverviews 函数与 Python API 一起使用:

from osgeo import gdal
Image = gdal.Open('ImageName.tif', 0)  # 0 = read-only, 1 = read-write.
gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE')
Image.BuildOverviews('NEAREST', [4, 8, 16, 32, 64, 128], gdal.TermProgress_nocb)
del Image  # close the dataset (Python object and pointers)

当您以只读模式读取 .tiff 图像时,它将在“.ovr”文件中构建外部概览。反之,如果以读写模式打开图片,则会生成内部概览。

【讨论】:

  • 我正在尝试使用此方法生成内部概览,但即使我将 1 设置为读写,它似乎仍会创建外部 .ovr 文件。有任何想法吗?谢谢
  • @fpolig01:奇怪,它应该可以工作。您可以尝试使用“gdal.Open(fname, gdal.GA_ReadWrite)”。也许您之前在 Python 脚本的某个地方以只读模式打开了该文件?在这种情况下,您需要正确关闭数据集(例如使用 del Image 或 Image = None),然后以读写模式重新打开它。
  • 感谢您的回复。我实际上已经尝试过 gdal.Open(fname, gdal.GA_ReadWrite)。我将尝试使用 del image 方法,看看是否有帮助。这是我在代码中尝试执行的唯一操作,因此之前没有任何内容。我也在这里发布了这个 - stackoverflow.com/questions/60954617/… 感谢您的帮助
【解决方案2】:

从这里更改代码行:

call([gdaladdoFile, '-ro', '--config USE_RRD YES', 'filename', '2 4 8 16'])

到这里:

call([gdaladdoFile, '-ro', '--config', 'USE_RRD', 'YES', filename, '2 4 8 16'])

解决了我的问题!

【讨论】:

  • 在我的情况下(Windows 7、Python 3.6、GDAL 2.2.1)只有以下输入序列有效[gdaladdoFile, '-ro', '--config', 'USE_RRD', 'YES', filename, '2', '4', '8', '16']
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多