ฉันมีภาพขนาด 1GB (.tif) ด้วยความกว้างและความสูง 94000x71680 ฉันอยากจะตัดภาพนี้ให้เป็นแผ่นกระเบื้อง 20,000 เท่าเพื่อที่ฉันจะสามารถประมวลผลได้
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีภาพขนาด 1GB (.tif) ด้วยความกว้างและความสูง 94000x71680 ฉันอยากจะตัดภาพนี้ให้เป็นแผ่นกระเบื้อง 20,000 เท่าเพื่อที่ฉันจะสามารถประมวลผลได้
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ฉันเสนอวิธีแก้ปัญหาสองวิธี: อันแรกใช้ QGIS, อันที่สองใช้ Python (GDAL)
ใน QGIS คุณสามารถสร้างโมเสก VRT
โปรดปฏิบัติตามขั้นตอนนี้ (ดูภาพด้านล่าง):
Save As...
;Create VRT
ตัวเลือก;OK
ปุ่มตัวอย่างเช่นการใช้พารามิเตอร์ในกล่องโต้ตอบด้านบนของแรสเตอร์ตัวอย่างนี้ (พารามิเตอร์ที่ฉันตั้งไว้ถูกเลือกแบบสุ่ม):
จะสร้าง 100 ไทล์ในเส้นทางที่ระบุในขั้นตอนที่ 4:
กำลังโหลดใน QGIS พวกเขามีลักษณะเช่นนี้:
ดังที่ @ bugmenot123 กล่าวไว้อย่างถูกต้องในความคิดเห็นผลลัพธ์ดูแปลก ๆ เพียงเพราะรูปแบบของภาพแต่ละรูปนั้นเหมาะสมกับการกระจายค่าต่อภาพ (แต่ข้อมูลนั้นดีมาก)
อีกวิธีในการรับผลลัพธ์เดียวกันคือการใช้ GDAL ( gdal_translate )
ด้วยการอ้างอิงกับตัวอย่างเดียวกันที่อธิบายไว้ข้างต้นคุณสามารถใช้สคริปต์นี้:
import os, gdal
in_path = 'C:/Users/Marco/Desktop/'
input_filename = 'dtm_5.tif'
out_path = 'C:/Users/Marco/Desktop/output_folder/'
output_filename = 'tile_'
tile_size_x = 50
tile_size_y = 70
ds = gdal.Open(in_path + input_filename)
band = ds.GetRasterBand(1)
xsize = band.XSize
ysize = band.YSize
for i in range(0, xsize, tile_size_x):
for j in range(0, ysize, tile_size_y):
com_string = "gdal_translate -of GTIFF -srcwin " + str(i)+ ", " + str(j) + ", " + str(tile_size_x) + ", " + str(tile_size_y) + " " + str(in_path) + str(input_filename) + " " + str(out_path) + str(output_filename) + str(i) + "_" + str(j) + ".tif"
os.system(com_string)
เห็นได้ชัดว่าคุณต้องปรับค่าให้เข้ากับกรณีเฉพาะของคุณ
อย่าแยก
คุณgdalbuildvrtคุณสามารถสร้างไทล์เสมือนที่จะใช้เพียงไม่กี่ไบต์บนดิสก์ของคุณ จากนั้นคุณสามารถใช้ซอฟต์แวร์ส่วนใหญ่ที่จะใช้ vrt ของคุณเป็นข้อมูลป้อนเข้าเพื่อทำการประมวลผลของคุณ
อีกทางหนึ่งฉันอยากจะมองหาเครื่องมือที่สามารถทำงานกับภาพขนาด 1Gb ได้มากกว่าการแยกและรวมภาพ ตัวอย่างเช่น OTB มีความสามารถส่วนใหญ่สำหรับการประมวลผลภาพมาตรฐาน (และขั้นสูงบางครั้ง) ด้วยภาพขนาดใหญ่ คุณสามารถตัด OTBสำหรับ Python หรือเรียกใช้จาก QGIS หรือจากบรรทัดคำสั่ง
ใช้Split Rasterเครื่องมือคุณสามารถแยกแรสเตอร์เป็นกระเบื้องขึ้นอยู่กับวิธีการไม่กี่ของการแบ่งรวมทั้งที่ขนาดของแต่ละกระเบื้องหรือจำนวนของกระเบื้อง
โซลูชันอื่นที่ใช้GDALคือเครื่องมือgdal_retile.py :
mkdir image_tiles
gdal_retile.py -v -r bilinear -levels 1 -ps 20000 20000 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir image_tiles big_input_image.tif
ดูข้อมูลเพิ่มเติมได้ที่: http://www.gdal.org/gdal_retile.html