Per @Aaron che ha chiesto:
Spero di trovare una versione gdalwarp della risposta di @ wwnick che utilizza l'opzione -multi per operazioni multicore e multithread ottimizzate
Disclaimer lieve
Questo usa gdalwarp
, anche se non sono del tutto convinto che ci saranno molti miglioramenti delle prestazioni. Finora sono stato associato all'I / O: l'esecuzione di questo script su un grande raster tagliandolo in molte parti più piccole non sembra impegnativo per la CPU, quindi presumo che il collo di bottiglia stia scrivendo sul disco. Se stai pianificando di riproiettare contemporaneamente le tessere o qualcosa di simile, questo potrebbe cambiare. Ci sono suggerimenti per la messa a punto qui . Una breve interpretazione non ha prodotto alcun miglioramento per me e la CPU non è mai stata il fattore limitante.
Disclaimer a parte, ecco uno script che userà gdalwarp
per dividere un raster in più tessere più piccole. Potrebbero esserci delle perdite dovute alla divisione del pavimento, ma questo può essere risolto selezionando il numero di tessere che desideri. Sarà n+1
dove si n
trova il numero diviso per ottenere le variabili 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))