Skip to content

4. 批处理与自动化 (Batch Processing & Automation)

来源说明 本文翻译自 Spatial Thoughts,原作者为 Ujaval Gandhi

**原文链接:** https://courses.spatialthoughts.com/gdal-tools.html

**本文仅供学习交流,版权归原作者所有。**

4.1 批量运行命令 (Running commands in batch)

你可以使用 Python 循环运行 GDAL/OGR 命令。例如,如果我们想将目录中所有文件的图像格式从 JPEG2000 转换为 GeoTiff,我们需要对每个图像运行类似下面的命令。这里我们希望 {input}{output} 值由目录中的文件确定。

gdal_translate -of GTiff -co COMPRESS=JPEG {input} {output}

如果你想对数百个输入文件运行命令,手动操作将非常费力。这时,一个简单的 Python 脚本可以帮助你自动批量运行命令。数据目录包含一个名为 batch.py 的文件,其中包含以下 Python 代码。

import os

input_dir = 'naip'

command_string = 'gdal_translate -of GTiff -co COMPRESS=JPEG {input} {output}'
for file in os.listdir(input_dir):
  if file.endswith('.jp2'):
    input = os.path.join(input_dir, file)
    filename = os.path.splitext(os.path.basename(file))[0]
    output =  os.path.join(input_dir, filename + '.tif')
    command = command_string.format(input=input, output=output)
    print('Running ->', command)
    os.system(command)

在 Anaconda Prompt 中,从 gdal-tools 目录运行以下命令,开始对 naip/ 目录中包含的所有图块进行批处理。

python batch.py

数据目录还包含一个使用 Python 内置多处理库并行运行批处理命令的示例。如果你的系统有多核 CPU,像这样在多个线程上并行运行命令可以比串行运行提供性能提升。

import os
from multiprocessing import Pool

input_dir = 'naip'
command_string = 'gdal_translate -of GTiff -co COMPRESS=JPEG {input} {output}'

num_cores = 4

def process(file):
    input = os.path.join(input_dir, file)
    filename = os.path.splitext(os.path.basename(file))[0]
    output =  os.path.join(input_dir, filename + '.tif')
    command = command_string.format(input=input, output=output)
    print('Running ->', command)
    os.system(command)

files = [file for file in os.listdir(input_dir) if file.endswith('.jp2')]

if __name__ == '__main__':
  p = Pool(num_cores)
  p.map(process, files)

该脚本以并行和串行模式运行命令,并打印每种模式所花费的时间。

python batch_parallel.py

4.2 自动化和调度 GDAL/OGR 任务 (Automating and Scheduling GDAL/OGR Jobs)

在基于 Linux 的服务器上按计划运行命令的最简单方法是使用 Cron Job

你必须编辑你的 crontab 并安排脚本(Shell 脚本或 Python 脚本)的执行。关键是在执行脚本之前激活 conda 环境。

假设你创建了一个脚本来执行一些 GDAL/OGR 命令,并将其放置在 /usr/local/bin/batch.py,这是一个每天早上 6 点执行它的示例 crontab 条目。

0 6 * * * conda activate gdal;python /use/local/bin/batch.py; conda deactivate

如果在执行时出错,你可能需要在 crontab 文件中包含一些环境变量,以便它能正确找到 conda了解更多

SHELL=/bin/bash
BASH_ENV=~/.bashrc
0 6 * * * conda activate gdal;python batch-parallel.py; conda deactivate

4.3 提高性能的技巧 (Tips for Improving Performance)

配置选项 (Configuration Options)

GDAL 有几个 配置选项,可以通过调整这些选项来帮助加快处理速度。

  • --config GDAL_CACHEMAX 512: 这个选项通过允许 GDAL 命令使用更多 RAM (512 MB) 读取/写入数据,有助于加速大多数 GDAL 命令。
  • --config GDAL_NUM_THREADS ALL_CPUS: 这个选项通过使用多个线程进行压缩来帮助加快写入速度。
  • --debug on: 打开调试模式。这会打印可能帮助你找到性能瓶颈的额外信息。

多线程 (Multithreading)

gdalwarp 实用程序支持多线程处理。并行处理有 2 个不同的选项。

  • -multi: 此选项并行化 I/O 和 CPU 操作。
  • -wo NUM_THREADS=ALL_CPUS: 此选项在多个核心上并行化 CPU 操作。

还有一个选项允许 gdalwarp 使用更多 RAM 进行缓存。此选项对于加速大型栅格上的操作非常有帮助。

  • -wm: 设置更高的缓存内存。

所有这些选项都可以组合使用,这可能会导致更快的数据处理。

gdalwarp -cutline aoi.shp  -crop_to_cutline naip.vrt aoi.tif -co COMPRESS=DEFLATE -co TILED=YES -multi -wo NUM_THREADS=ALL_CPUS -wm 512 --config GDAL_CACHEMAX 512