如何从Python代码调用gdal_translate?


40

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


4
是的,从gdal-2.1开始。 该答案应被认为是正确的。
皮特

Answers:



23

请参阅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在内部进行的操作。


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

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

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

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

10

是的,您可以在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上,我在使用路径时遇到了麻烦,尤其是那些带有空格或'\'字符使另一个意外转义字符的路径。因此,我只是保留了正确的路径。

如果您使用的是python实用程序之一,则只需执行相同的操作,除了子进程命令字符串开头的exe现在为“ C:\ python32 \ python.exe”(或您使用的任何版本),而第二个元素为您要使用的python实用程序。

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

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


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

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

好的,使用gdal_retile.py有一个类似的问题。我尝试执行以下操作:import gdal_retile gdal_retile.main(“-v -r bilinear -levels 4 -ps 2048 2048 -co \” tiled = YES \“ -targetDir cablepyramid- -optfile files.txt”),但出现错误:无法识别的命令选项:-知道为什么吗?
凯蒂E.

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

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

7

我使用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中可用作python函数。也subprocess.callos.system
Dmitri Chubarov '16

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

3

对于想要使用Python中的GDAL Translate将复合多频带TIF中的频带保存到单个文件的任何人,这是一个快速代码。

import gdal

in_path = 'C:/GIS/Sample.tif' #input composite raster
out_path = 'C:/GIS/Output/' #output directory for individual bands as files

#Open existing raster ds
src_ds = gdal.Open(in_path)

for i in range(1,src_ds.RasterCount +1): #Save bands as individual files
    out_ds = gdal.Translate(out_path + 'band' + str(i) + '.tiff', src_ds, format='GTiff', bandList=[i])
    out_ds=None

这对于进一步处理(例如,使用Rasterio,如此)很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.