Для @Aaron, який запитав:
Я сподіваюся знайти версію gdalwarp відповіді @ wwnick, яка використовує опцію -multi для розширених багатоядерних та багатопотокових операцій.
Невелика відмова від відповідальності
Це використовує gdalwarp
, хоча я не зовсім впевнений, що буде багато прибутків. Поки що я був пов'язаний введенням-виведенням - запуск цього сценарію на великому растрі розрізання його на багато менших частин не здається процесорним процесом, тому я припускаю, що вузьке місце записується на диск. Якщо ви плануєте одночасно перепроектувати плитку чи щось подібне, це може змінитися. Є налаштування поради тут . Коротка гра не принесла жодного покращення для мене, і процесор ніколи не здавався обмежуючим фактором.
Відмову відмови, ось сценарій, який використовуватиме gdalwarp
для розділення растру на кілька менших плиток. Можуть бути певні втрати через поділ підлоги, але це можна переконатись, вибравши кількість плиток, яку ви хочете. Це буде місце, n+1
де n
є число, на яке ви поділите, щоб отримати tile_width
і tile_height
змінні.
import subprocess
import gdal
import sys
def gdalwarp(*args):
return subprocess.check_call(['gdalwarp'] + list(args))
src_path = sys.argv[1]
ds = gdal.Open(src_path)
try:
out_base = sys.argv[2]
except IndexError:
out_base = '/tmp/test_'
gt = ds.GetGeoTransform()
width_px = ds.RasterXSize
height_px = ds.RasterYSize
# Get coords for lower left corner
xmin = int(gt[0])
xmax = int(gt[0] + (gt[1] * width_px))
# get coords for upper right corner
if gt[5] > 0:
ymin = int(gt[3] - (gt[5] * height_px))
else:
ymin = int(gt[3] + (gt[5] * height_px))
ymax = int(gt[3])
# split height and width into four - i.e. this will produce 25 tiles
tile_width = (xmax - xmin) // 4
tile_height = (ymax - ymin) // 4
for x in range(xmin, xmax, tile_width):
for y in range(ymin, ymax, tile_height):
gdalwarp('-te', str(x), str(y), str(x + tile_width),
str(y + tile_height), '-multi', '-wo', 'NUM_THREADS=ALL_CPUS',
'-wm', '500', src_path, out_base + '{}_{}.tif'.format(x, y))