Para @Aaron, que perguntou:
Espero encontrar uma versão gdalwarp da resposta do @ wwnick que utilize a opção -multi para operações multicore e multithread avançadas
Isenção de responsabilidade
Isso usa gdalwarp
, embora eu não esteja totalmente convencido de que haverá muito ganho de desempenho. Até agora, eu estou vinculado à E / S - executar esse script em uma grande varredura, cortando-o em muitas partes menores, não parece muito com a CPU, portanto, presumo que o gargalo esteja gravando no disco. Se você planeja reprojetar simultaneamente os blocos ou algo semelhante, isso pode mudar. Existem dicas de ajuste aqui . Uma breve jogada não resultou em nenhuma melhoria para mim e a CPU nunca pareceu ser o fator limitante.
Isenção de responsabilidade, aqui está um script que será usado gdalwarp
para dividir uma varredura em vários blocos menores. Pode haver alguma perda devido à divisão do piso, mas isso pode ser resolvido escolhendo o número de peças que você deseja. Será n+1
onde n
está o número que você divide para obter as variáveis tile_width
e 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))