Для @ Аарона, который спросил:
Я надеюсь найти 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))