Para @Aaron que preguntó:
Espero encontrar una versión gdalwarp de la respuesta de @wwnick que utilice la opción -multi para mejorar las operaciones multinúcleo y multihilo.
Ligera exención de responsabilidad
Esto utiliza gdalwarp
aunque no estoy totalmente convencido de que vaya a aumentar mucho el rendimiento. Hasta ahora he estado limitado por la E/S - ejecutar este script en un raster grande cortándolo en muchas partes más pequeñas no parece intensivo para la CPU, así que asumo que el cuello de botella es la escritura en disco. Si estás planeando reproyectar simultáneamente los mosaicos o algo similar, entonces esto podría cambiar. Hay consejos de ajuste aquí . Una breve partida no me produjo ninguna mejora, y la CPU nunca pareció ser el factor limitante.
Descargo de responsabilidad aparte, aquí hay un script que utilizará gdalwarp
para dividir una trama en varios mosaicos más pequeños. Es posible que se produzcan algunas pérdidas debido a la división en pisos, pero esto puede solucionarse eligiendo el número de mosaicos que desee. Será n+1
donde n
es el número por el que se divide para obtener el tile_width
y tile_height
variables.
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))
0 votos
Tengo una utilidad que utiliza subprocess.Popen para ejecutar múltiples gdal traduce al mismo tiempo que yo uso para la extracción de una gran trama a los azulejos utilizando una red de pesca, particularmente útil si la entrada y / o salida es altamente comprimido (por ejemplo, LZW o deflate GeoTiff), si ninguno es altamente comprimido el proceso de picos en el acceso al disco duro y no es mucho más rápido que correr uno a la vez. Por desgracia, no es lo suficientemente genérico como para compartirlo debido a la rigidez de las convenciones de nomenclatura, pero de todos modos es algo para reflexionar. La opción -multi para GDALWarp a menudo causa problemas y sólo utiliza 2 hilos (uno de lectura, uno de escritura) no todos disponibles.