Dành cho @Aaron, người đã hỏi:
Tôi hy vọng tìm thấy phiên bản gdalwarp của câu trả lời của @ wwnick sử dụng tùy chọn -multi cho các hoạt động đa lõi và đa luồng nâng cao
Tuyên bố từ chối trách nhiệm
Điều này sử dụng gdalwarp
, mặc dù tôi không hoàn toàn tin rằng sẽ có nhiều hiệu suất đạt được. Cho đến nay tôi đã bị ràng buộc I / O - chạy tập lệnh này trên một raster lớn, cắt nó thành nhiều phần nhỏ hơn có vẻ không cần nhiều CPU, vì vậy tôi cho rằng nút cổ chai đang ghi vào đĩa. Nếu bạn đang dự định đồng thời chiếu lại các ô hoặc một cái gì đó tương tự, thì điều này có thể thay đổi. Có lời khuyên điều chỉnh ở đây . Một cuộc chơi ngắn không mang lại bất kỳ cải thiện nào cho tôi và CPU dường như không bao giờ là yếu tố hạn chế.
Từ chối trách nhiệm sang một bên, đây là một tập lệnh sẽ sử dụng gdalwarp
để chia raster thành nhiều ô nhỏ hơn. Có thể có một số mất mát do phân chia sàn nhưng điều này có thể được chăm sóc bằng cách chọn số lượng gạch bạn muốn. Nó sẽ là n+1
nơi n
số bạn chia cho để lấy tile_width
và tile_height
biến.
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))