สำหรับ @Aaron ที่ถามว่า:
ฉันหวังว่าจะพบคำตอบของ @wwnick รุ่น gdalwarp ที่ใช้ตัวเลือก -multi สำหรับการดำเนินการมัลติคอร์และมัลติเธรดที่ได้รับการปรับปรุง
ข้อจำกัดความรับผิดชอบเล็กน้อย
การใช้งานนี้gdalwarp
แม้ว่าฉันจะไม่เชื่ออย่างเต็มที่ว่าจะได้รับประสิทธิภาพมากขึ้น จนถึงตอนนี้ฉันถูกผูกไว้กับ I / O แล้ว - การรันสคริปต์นี้บนแรสเตอร์ขนาดใหญ่ที่ตัดเป็นส่วนเล็ก ๆ หลาย ๆ อันดูเหมือนจะไม่ได้ใช้ซีพียูมากนักดังนั้นฉันจึงคิดว่าคอขวดกำลังเขียนลงดิสก์ หากคุณวางแผนที่จะฉายแผ่นกระเบื้องหรือสิ่งอื่นที่คล้ายกันพร้อมกันสิ่งนี้อาจเปลี่ยนไป มีเคล็ดลับการปรับแต่งเป็นที่นี่ การเล่นสั้น ๆ นั้นไม่ได้ปรับปรุงอะไรสำหรับฉันและ CPU ก็ไม่เคยเป็นปัจจัย จำกัด
ข้อสงวนสิทธิ์กันนี่คือสคริปต์ที่จะใช้gdalwarp
แยกแรสเตอร์เป็นแผ่นย่อย ๆ หลาย ๆ ชุด อาจมีการสูญเสียบางส่วนเนื่องจากการแบ่งพื้น แต่สามารถได้รับการดูแลโดยการเลือกจำนวนของกระเบื้องที่คุณต้องการ มันจะเป็นn+1
ตำแหน่งที่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))