Para @Aaron que preguntó:
Espero encontrar una versión gdalwarp de la respuesta de @ wwnick que utilice la opción -multi para operaciones multinúcleo y multiproceso mejoradas
Descargo de responsabilidad leve
Esto utiliza gdalwarp
, aunque no estoy totalmente convencido de que habrá mucho aumento de rendimiento. Hasta ahora he estado vinculado a E / S: ejecutar este script en un gran ráster cortándolo en muchas partes más pequeñas no parece intensivo en la CPU, por lo que supongo que el cuello de botella está escribiendo en el disco. Si planea volver a proyectar simultáneamente los mosaicos o algo similar, esto podría cambiar. Hay consejos de ajuste aquí . Una breve jugada no produjo ninguna mejora para mí, y la CPU nunca pareció ser el factor limitante.
Dejando de lado el descargo de responsabilidad, aquí hay un script que se usará gdalwarp
para dividir un ráster en varios mosaicos más pequeños. Puede haber alguna pérdida debido a la división del piso, pero esto se puede solucionar eligiendo la cantidad de mosaicos que desee. Será n+1
dónde n
está el número por el que divide para obtener las variables tile_width
y 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))