@Aaron के लिए जिसने पूछा:
मैं @ wwnick के उत्तर के एक गालवार्प संस्करण को खोजने की उम्मीद कर रहा हूं जो कि बहु-स्तरीय और बहु-स्तरीय अभियानों के लिए -मुल्टी विकल्प का उपयोग करता है।
थोड़ा सा डिस्क्लेमर
यह उपयोग करता है 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))