Answers:
从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
请参阅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在内部进行的操作。
是的,您可以在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)。
我使用os.system通过各种gdal命令执行此操作,您可以像在命令行中那样使用它们来调用函数:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
在第7课中也对此进行了描述:http://www.gis.usu.edu/~chrisg/python/2009/
gdal.Warp()
了几个小时努力地正确地获取PG:
数据源cutlineDSName
来驱动cutlineSQL
。(我知道,对吗?几个小时 实际上在解决问题?恐怖!</ kidding>)。最终它开始工作了,它似乎比os.system()
或快得多subprocess.call()
。它正在执行约200万条剪切线,所以直到今晚的某个时候我才知道它实际上是否更快...但是它的工作原理完全正确。
对于想要使用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,如此处)很有用。