Untuk @ Harun yang bertanya:
Saya berharap untuk menemukan versi gdalwarp dari jawaban @ wwnick yang menggunakan opsi -multi untuk operasi multicore dan multithreaded yang ditingkatkan
Penafian Sedikit
Ini menggunakan gdalwarp
, meskipun saya tidak sepenuhnya yakin akan ada banyak peningkatan kinerja. Sejauh ini saya sudah terikat I / O - menjalankan skrip ini pada raster besar yang memotongnya menjadi banyak bagian yang lebih kecil tampaknya tidak intensif CPU, jadi saya menganggap hambatannya adalah menulis ke disk. Jika Anda berencana memproyeksikan ulang ubin secara bersamaan atau yang serupa, maka ini mungkin berubah. Ada tips menyetel di sini . Permainan singkat tidak menghasilkan perbaikan bagi saya, dan CPU sepertinya tidak pernah menjadi faktor pembatas.
Di samping penafian, inilah skrip yang akan digunakan gdalwarp
untuk membagi raster menjadi beberapa ubin yang lebih kecil. Mungkin ada beberapa kerugian karena pembagian lantai tetapi ini bisa diatasi dengan memilih jumlah ubin yang Anda inginkan. Ini akan menjadi n+1
tempat n
angka yang Anda bagi untuk mendapatkan tile_width
dan tile_height
variabel.
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))