@ অ্যারনের জন্য যারা জিজ্ঞাসা করেছেন:
আমি @ wwnick এর উত্তরের একটি gdalwarp সংস্করণটি খুঁজে পেতে আশা করছি যা বর্ধিত মাল্টিকোর এবং মাল্টিথ্রেডেড ক্রিয়াকলাপের জন্য-মাল্টি বিকল্পটি ব্যবহার করে
সামান্য অস্বীকৃতি
এটি ব্যবহার করে gdalwarp
, যদিও আমি পুরোপুরি নিশ্চিত নই যে এখানে অনেক বেশি পারফরম্যান্স লাভ হবে। আমি এখনও অবধি আমি / ও আবদ্ধ হয়েছি - এই স্ক্রিপ্টটি একটি বড় রাস্টার এটিকে অনেক ছোট ছোট অংশে কাটাতে সিপিইউ নিবিড় বলে মনে হয় না, তাই আমি ধরে নিই যে বাধাটি ডিস্কে লিখছে writing আপনি যদি একই সাথে টাইলস বা অনুরূপ কিছু পুনরায় প্রজেক্ট করার পরিকল্পনা করে থাকেন তবে এটি পরিবর্তন হতে পারে। এখানে টিউন করার টিপস রয়েছে । একটি সংক্ষিপ্ত নাটক আমার পক্ষে কোনও উন্নতি করতে পারেনি এবং সিপিইউ কখনও সীমাবদ্ধ ফ্যাক্টর বলে মনে হয় নি।
একচেটিয়া দাবি অস্বীকার করুন, এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা 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))