แบ่งภาพ. tif ออกเป็นหลาย ๆ แผ่นไหม [ปิด]


13

ฉันมีภาพขนาด 1GB (.tif) ด้วยความกว้างและความสูง 94000x71680 ฉันอยากจะตัดภาพนี้ให้เป็นแผ่นกระเบื้อง 20,000 เท่าเพื่อที่ฉันจะสามารถประมวลผลได้

ฉันจะทำสิ่งนี้ได้อย่างไร


อีกครั้ง, github.com/mapbox/rasterioจะให้ข้อมูลการป้อนข้อมูลจำนวนมากให้คุณ คุณสามารถแบ่งมันโดยใช้วิธี nipy o scipy และบันทึกแต่ละส่วนเป็นไฟล์ใหม่ได้อย่างง่ายดาย โซลูชันดังกล่าวมีคุณสมบัติเพียงพอหรือไม่ ถ้าเป็นเช่นนั้นคุณต้องบอกว่าควรจะรักษา "uneven bits" (71680 ไม่สามารถหารด้วย 20000) ได้อย่างไร
bugmenot123

คำตอบ:


23

ฉันเสนอวิธีแก้ปัญหาสองวิธี: อันแรกใช้ QGIS, อันที่สองใช้ Python (GDAL)


โซลูชันที่ใช้ QGIS

ใน QGIS คุณสามารถสร้างโมเสก VRT

โปรดปฏิบัติตามขั้นตอนนี้ (ดูภาพด้านล่าง):

  1. โหลดแรสเตอร์ในที่แผงเลเยอร์ ;
  2. คลิกขวาและเลือกSave As...;
  3. ตรวจสอบCreate VRTตัวเลือก;
  4. เลือกโฟลเดอร์ที่จะบันทึกผลลัพธ์ของคุณ
  5. กำหนดขอบเขต (ถ้าคุณต้องการทำงานกับแรสเตอร์ทั้งหมดอย่าแก้ไขอะไรเลย);
  6. เลือกว่าใช้ความละเอียดปัจจุบันหรือไม่ (ฉันแนะนำให้ปล่อยไว้เป็นค่าเริ่มต้น);
  7. กำหนดจำนวนคอลัมน์และแถวสูงสุด (ในกรณีของคุณควรเป็นคอลัมน์ 20,000 และ 2,000 แถว)
  8. กดOKปุ่ม

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างเช่นการใช้พารามิเตอร์ในกล่องโต้ตอบด้านบนของแรสเตอร์ตัวอย่างนี้ (พารามิเตอร์ที่ฉันตั้งไว้ถูกเลือกแบบสุ่ม):

ป้อนคำอธิบายรูปภาพที่นี่

จะสร้าง 100 ไทล์ในเส้นทางที่ระบุในขั้นตอนที่ 4:

ป้อนคำอธิบายรูปภาพที่นี่

กำลังโหลดใน QGIS พวกเขามีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ดังที่ @ bugmenot123 กล่าวไว้อย่างถูกต้องในความคิดเห็นผลลัพธ์ดูแปลก ๆ เพียงเพราะรูปแบบของภาพแต่ละรูปนั้นเหมาะสมกับการกระจายค่าต่อภาพ (แต่ข้อมูลนั้นดีมาก)


โซลูชันที่ใช้ Python (GDAL)

อีกวิธีในการรับผลลัพธ์เดียวกันคือการใช้ 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)

เห็นได้ชัดว่าคุณต้องปรับค่าให้เข้ากับกรณีเฉพาะของคุณ


2
เพียงแค่แสดงความคิดเห็นอย่างรวดเร็วที่ตัวอย่างของวิธีการ QGIS ทำให้พวกเขามีลักษณะแปลกเพียงเพราะเหมาะกับสไตล์ของตัวเองเพื่อการกระจายของค่าต่อภาพ ข้อมูลนั้นสมบูรณ์ดี :)
bugmenot123

ขอบคุณก่อนอื่นสำหรับคำตอบของคุณมีประโยชน์จริง ๆ แต่ฉันต้องการบรรลุผลลัพธ์เดียวกันโดยใช้ python หรือไม่ คุณสามารถช่วยฉันได้เช่นกันเพราะมันเป็นคู่มือมากกว่าโปรแกรมแล้วดังนั้น
Anup Panwar

@ bugmenot123 ขอบคุณฉันแก้ไขคำตอบด้วยความคิดเห็นที่เป็นประโยชน์ของคุณ
mgri

@Anup Panwar ถ้าฉันพบทางออกด้วย PyQGIS ฉันจะแก้ไขคำตอบของฉัน! =)
mgri

@HowToInQGIS ขอบคุณสำหรับอื่นถ้าคุณต้องการวิธีในหลามที่ยังจะช่วยให้ :)
Anup Panwar

5

อย่าแยก

คุณgdalbuildvrtคุณสามารถสร้างไทล์เสมือนที่จะใช้เพียงไม่กี่ไบต์บนดิสก์ของคุณ จากนั้นคุณสามารถใช้ซอฟต์แวร์ส่วนใหญ่ที่จะใช้ vrt ของคุณเป็นข้อมูลป้อนเข้าเพื่อทำการประมวลผลของคุณ

อีกทางหนึ่งฉันอยากจะมองหาเครื่องมือที่สามารถทำงานกับภาพขนาด 1Gb ได้มากกว่าการแยกและรวมภาพ ตัวอย่างเช่น OTB มีความสามารถส่วนใหญ่สำหรับการประมวลผลภาพมาตรฐาน (และขั้นสูงบางครั้ง) ด้วยภาพขนาดใหญ่ คุณสามารถตัด OTBสำหรับ Python หรือเรียกใช้จาก QGIS หรือจากบรรทัดคำสั่ง


2

ใช้Split Rasterเครื่องมือคุณสามารถแยกแรสเตอร์เป็นกระเบื้องขึ้นอยู่กับวิธีการไม่กี่ของการแบ่งรวมทั้งที่ขนาดของแต่ละกระเบื้องหรือจำนวนของกระเบื้อง

ดูที่Splitting Raster ใน ArcGIS


2

โซลูชันอื่นที่ใช้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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.