Kim soran @Aaron için:
Geliştirilmiş çok çekirdekli ve çok iş parçacıklı işlemler için -multi seçeneğini kullanan @ wwnick yanıtının gdalwarp sürümünü bulmayı umuyorum
Hafif Feragat
Bu kullanır gdalwarp
, ancak çok fazla performans kazancı olacağına ikna olmadım. Şimdiye kadar I / O bağlı oldum - bu komut dosyasını büyük bir taramada çalıştırmak, daha küçük parçalara kesmek CPU yoğun görünmüyor, bu yüzden darboğazın diske yazdığını varsayıyorum. Karoları veya benzer bir şeyi aynı anda yeniden yansıtmayı planlıyorsanız, bu değişebilir. Burada ayar ipuçları var . Kısa bir oyun benim için herhangi bir gelişme sağlamadı ve CPU hiçbir zaman sınırlayıcı bir faktör gibi görünmedi.
Feragatname bir yana, gdalwarp
bir raster birkaç küçük karoya bölmek için kullanılacak bir komut dosyası . Zemin bölümü nedeniyle bir miktar kayıp olabilir, ancak bu istediğiniz karo sayısını seçerek halledilebilir. Ve değişkenlerini almak için böldüğünüz sayı n+1
nerede olacaktır .n
tile_width
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))