是否可以使用某些gdal API从Python代码调用gdal_translate?我不是要简单地从文件系统中执行gdal_translate.exe,而是要以某种方式在代码中调用它,所以我不需要知道gdal_translate可执行文件所在的确切目录?

评论

是的,从gdal-2.1开始。此答案应被接受为正确答案。

#1 楼

从GDAL 2.1(更多信息在此处)开始,GDAL和OGR实用程序可以用作库函数。例如:

from osgeo import gdal

ds = gdal.Open('input.tif')
ds = gdal.Translate('output.tif', ds, projWin = [-75.3, 5.5, -73.5, 3.7])
ds = None


评论


gdal.Translate()需要的所有选项均在此处列出:gdal.org/python/osgeo.gdal-module.html#TranslateOptions

– MarceloVilla-Piñeros
18-10-6在17:34

我尝试使用此方法,但未收到任何错误,但未创建输出文件。有什么想法吗?

–智能
20年11月6日在16:24

#2 楼

请参阅GDAL API教程。

#Import gdal
from osgeo import gdal

#Open existing dataset
src_ds = gdal.Open( src_filename )

#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )

#Output to new format
dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )

#Properly close the datasets to flush to disk
dst_ds = None
src_ds = None


如果您想要更多的输出控制,例如调整大小,子设置等,请使用VRT作为输入,这就是gdal_translate在内部完成。

评论


不幸的是,这不包括反注射,对吗?

–里卡多
2014年7月2日,下午5:46

@butcher-不。因为问题没有提到重投影。当然,您可以使用gdal python API重新投影栅格。如果您想知道如何,请提出一个新问题。

–user2856
2014年7月2日在7:00

我已经在这里完成了:gis.stackexchange.com/questions/103874/…但是thius被标记为重复的:-(

–里卡多
2014年7月2日7:30

@butcher-已关闭,作为该问题的重复项。您的问题还询问有关gdal_translate的问题。您知道gdal_translate不会重新投影吗?如果要重新投影,请使用gdalwarp或gdal python API方法-gdal.ReprojectImage

–user2856
2014年7月2日在9:11

#3 楼

是的,您可以在Python中调用GDAL实用程序。根据实用程序本身是一个exe还是一段python代码,该方法存在非常小的差异。无论哪种方式,都需要使用子流程模块:

import subprocess

# constants
gdalTranslate = r'C:\Program Files\GDAL\gdal_translate.exe'
src = r"C:\somefolder\somefile.tif"
dst = r"C:\someotherfolder\myresul.tif"
cmd = "-ot float32 -outsize 25 25"  # just for example!

# see note below
def youCanQuoteMe(item):
    return "\"" + item + "\""

fullCmd = ' '.join([gdalTranslate, cmd, youCanQuoteMe(src), youCanQuoteMe(dst)])
subprocess.popen(fullCmd)


您会注意到我在路径周围添加了转义引号。这是因为,在Windows上,我在使用路径时遇到了麻烦,尤其是那些带有空格或'\'字符使另一个意外转义字符的路径。因此,我只是在规范中保留了正确的路径。 “ C:\ python32 \ python.exe”(或任何版本),第二个元素是要使用的python实用程序。

显然,您也可以遍历文件系统,而不是使用硬编码常量,但这只是一个例子。

编辑-QGIS插件的一般化
QGIS在启动时会创建/修改许多环境变量。因此,您可以使用这些变量(请参阅Settings-> Options-> System)而不是上面示例中的硬编码路径来为GDAL库/实用程序构建通用路径变量。

评论


所以我不能这样做吗?导入gdal_translate,然后调用.main()?

–凯蒂E.
2012年11月29日17:06



不-那行不通。 gdal_translate不是Python包,因此python对此一无所知。您将收到一条错误消息,提示“ ImportError No Module named gdal_translate”。使用子流程模块来调用它。

– MappaGnosis
2012年11月29日17:37



好的,使用gdal_retile.py可以解决一个类似的问题。 -optfile files.txt”),但出现错误:无法识别的命令选项:-知道为什么吗?

–凯蒂E.
2012年11月29日20:01



暂时我看不到问题,除了我的猜测是它可能不喜欢'--optfile'开关。后者未记录。

– MappaGnosis
2012年11月30日9:25

@MappaGnosis Python gdal库中是否有gdal_translate的替代方法?

–multigoodverse
2013年9月23日12:43在

#4 楼

我使用os.system通过各种gdal命令执行此操作,您可以使用它们从命令行调用函数:

os.system("gdal_translate -of GTiff " + sourcefile + " " +  destinationfile)


第7讲中也对此进行了介绍:http ://www.gis.usu.edu/~chrisg/python/2009/

评论


GDAL命令通过RFC 59.1在GDAL 2.1中可用GDAL命令作为python函数。 subprocess.call也比os.system安全。

– Dmitri Chubarov
16-10-27在12:36

有人需要写出这些Python函数的一个很好的例子。我与gdal.Warp()搏斗了几个小时,以正确获取PG:数据源作为cutlineDSName来驱动cutlineSQL。 (我知道,对吗?几个小时实际上在解决问题?恐怖!)。最终它开始工作,它似乎比os.system()或subprocess.call()快得多。它正在执行约200万条剪切线,所以直到今晚的某个时间我才知道它实际上是否更快...但是它的工作原理完全正确。

– GT。
17-2-22在6:46

#5 楼

这是一个快速代码,适用于希望使用Python中的GDAL Translate将复合多波段TIF中的波段保存到单个文件中的任何人。处理(例如,使用Rasterio,例如此处)。