Pour @Aaron qui a demandé:
J'espère trouver une version gdalwarp de la réponse de @ wwnick qui utilise l'option -multi pour des opérations multicœurs et multithread améliorées
Légère exclusion de responsabilité
Cela utilise gdalwarp
, même si je ne suis pas totalement convaincu qu'il y aura beaucoup de gain de performances. Jusqu'à présent, je suis lié aux E / S - l'exécution de ce script sur un grand raster le découpant en de nombreuses parties plus petites ne semble pas nécessiter beaucoup de CPU, donc je suppose que le goulot d'étranglement écrit sur le disque. Si vous prévoyez de re-projeter simultanément les tuiles ou quelque chose de similaire, cela pourrait changer. Il y a des conseils de réglage ici . Un bref jeu ne m'a apporté aucune amélioration, et le CPU n'a jamais semblé être le facteur limitant.
Mise à part la mise en garde, voici un script qui servira gdalwarp
à diviser un raster en plusieurs tuiles plus petites. Il peut y avoir une perte due à la division du sol, mais cela peut être résolu en choisissant le nombre de carreaux que vous souhaitez. Ce sera n+1
où n
est le nombre que vous divisez par pour obtenir les variables tile_width
et 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))