Gdal: การตัดแรสเตอร์ด้วยแรสเตอร์อื่น


14

ฉันกำลังเขียนยูทิลิตี้ง่าย ๆ ในการครอบตัดไฟล์แรสเตอร์ geotiff หลายแบนด์ไปยังพื้นที่ (เล็กกว่า) เดียวกัน เมื่อใช้ gdalwarp ฉันสามารถครอบตัดไฟล์ได้อย่างง่ายดายโดยใช้รูปทรงการตัดรูปหลายเหลี่ยมเดียว:

gdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif

อย่างไรก็ตามพื้นที่จริงที่ฉันต้องการคลิปจะถูกกำหนดไว้ในขั้นต้นเสมอโดยไฟล์แรสเตอร์ geotiff อื่นไม่ใช่ไฟล์รูปร่าง มันจะดีถ้าฉันสามารถใช้ขอบเขตของแรสเตอร์นั้นเป็นไฟล์รูปวาด แต่ฉันไม่แน่ใจว่าจะทำอย่างไร น่าแปลกใจที่สิ่งต่อไปนี้ใช้งานไม่ได้ (มันไม่ได้ทำให้เกิดข้อผิดพลาด แต่ก็ไม่ได้สร้างอะไร):

gdalwarp -cutline clipper.tif-crop_to_cutline input.tif output.tif

ดังนั้นคำถามของฉันคือมีวิธีให้แรสเตอร์gdalwarp -cutline? อีกวิธีหนึ่งมีฟังก์ชัน gdal อื่นที่สามารถคลิปแรสเตอร์โดยใช้แรสเตอร์อื่นได้หรือไม่ หากไม่มีสิ่งเหล่านี้เป็นไปได้มีวิธีที่ง่ายมากในการสร้างรูปร่างไฟล์ที่มีรูปหลายเหลี่ยมเดียวที่กำหนดโดยขอบเขตของแรสเตอร์หรือไม่?

รหัสนี้จะถูกห่อหุ้มด้วยสคริปต์ไพ ธ อนที่กว้างขวางกว่าดังนั้นฉันสามารถใช้ยูทิลิตี้บรรทัดคำสั่ง gdal หรือการผูกไพ ธ อนใด ๆ สำหรับ gdal

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

คำตอบ:


11

ฉันไม่ทราบว่าเป็นไปได้หรือไม่ที่จะรวมแรสเตอร์กับแรสเตอร์อื่น ๆ แต่คุณสามารถใช้ gdaltindex เพื่อสร้างเชพไฟล์ด้วยขอบเขตของแรสเตอร์ของคุณ

http://www.gdal.org/gdaltindex.html


4
gdaltindex ทำงานอย่างสมบูรณ์เพื่อสร้างรูปทรงการตัดจากแรสเตอร์เริ่มต้นของฉัน เพื่อแก้ปัญหาที่ฉันใช้gdaltindex clipper.shp clipper.tifตามด้วยgdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Joe

ฉันใช้วิธีนี้ แต่พบว่าบางครั้งมันก็เป็นพิกเซลเดียวในรุ่นที่ถูกตัดออก ฉันคิดว่ามันตรงไปตรงมามากกว่าในการคำนวณเป้าหมายของคุณคำตอบของ la Xavier ด้านล่างแล้วใช้ gdalwarp และระบุ -te_srs เพื่อจัดการ CRS ที่ไม่ตรงกัน
Jon

7

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

GDAL_Calc.py -A Mask.tif -B CutBigImageToClip.tif --outfile=SmallerFile.tif --NoDataValue=0 --Calc="B*(A>0)" 

แบบสอบถามนี้จะเติมข้อมูล 0 โดยที่ Mask.tif <= 0 และ BigImage โดยที่ Mask> 0 ในการทำเช่นนี้ทั้งสอง rasters ต้องมีขนาดเซลล์แถวและคอลัมน์เดียวกัน ในการแยกส่วนขยายเดียวกันให้ใช้ GDAL_Translate พร้อม-projwin ulx uly lrx lryตัวเลือก (กล่องอยู่ในพิกัดที่คาดการณ์ไว้) แต่ให้แน่ใจว่ากล่อง projwin ไม่ขยายไปถึงขอบของแรสเตอร์ทั้งสอง

GDAL_Translate -of GTIFF -projwin ulx uly lrx lry BigImageToClip.tif CutBigImageToClip.tif

ค่าทดแทนสำหรับกล่อง projwin ที่ได้มาจากรูปแบบ


1
+1 นี่เป็นข้อมูลที่มีประโยชน์ แต่ฉันคิดว่าฉันสามารถแก้ปัญหาได้ในไม่กี่ขั้นตอนโดยใช้คำตอบของ @ lejedi
Joe

4

วิธีแก้ปัญหาใน Python โดยตรงโดยไม่ทำให้รูปร่าง:

import gdal
from gdalconst import GA_ReadOnly

data = gdal.Open('img_mask.tif', GA_ReadOnly)
geoTransform = data.GetGeoTransform()
minx = geoTransform[0]
maxy = geoTransform[3]
maxx = minx + geoTransform[1] * data.RasterXSize
miny = maxy + geoTransform[5] * data.RasterYSize
call('gdal_translate -projwin ' + ' '.join([str(x) for x in [minx, maxy, maxx, miny]]) + ' -of GTiff img_orig.tif img_out.tif', shell=True)

1
หมายเหตุ: วิธีนี้จะใช้งานได้ก็ต่อเมื่ออยู่ใน SRS เดียวกัน
Skylion

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