Für @Aaron, der gefragt hat:
Ich hoffe, eine gdalwarp-Version von @ wwnicks Antwort zu finden, die die -multi-Option für erweiterte Multicore- und Multithread-Operationen verwendet
Leichter Haftungsausschluss
Dies nutzt gdalwarp
, obwohl ich nicht ganz davon überzeugt bin, dass es viel Leistungsgewinn geben wird. Bisher war ich an E / A gebunden - das Ausführen dieses Skripts auf einem großen Raster, das es in viele kleinere Teile zerlegt, scheint nicht CPU-intensiv zu sein, daher gehe ich davon aus, dass der Engpass beim Schreiben auf die Festplatte besteht. Wenn Sie vorhaben, die Kacheln oder ähnliches gleichzeitig erneut zu projizieren, kann sich dies ändern. Es gibt Tuning - Tipps hier . Ein kurzes Spiel brachte für mich keine Besserung und die CPU schien nie der limitierende Faktor zu sein.
Abgesehen vom Haftungsausschluss ist hier ein Skript, mit gdalwarp
dem Sie ein Raster in mehrere kleinere Kacheln aufteilen können. Aufgrund der Bodenteilung kann es zu Verlusten kommen. Dies kann jedoch durch Auswahl der gewünschten Anzahl von Fliesen behoben werden. Es wird sein, n+1
wo n
die Zahl ist, durch die Sie dividieren, um die Variablen tile_width
und zu erhalten 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))