วิธีเพิ่มแรสเตอร์ขนาดแตกต่างกันใน GDAL ดังนั้นผลลัพธ์จะอยู่ในภูมิภาคที่ตัดกันเท่านั้น


11

ฉันกำลังเขียนวิธี Python ที่เพิ่มแรสเตอร์สองตัวและสร้างเอาต์พุตแรสเตอร์เดี่ยว ด้วยเหตุผลที่อยู่นอกเหนือการควบคุมของฉันขอบเขตของอินพุตแรสเตอร์นั้นแตกต่างกัน แต่มันซ้อนทับกัน

เป็นไปได้หรือไม่ที่จะทำงานเฉพาะในพิกเซลแรสเตอร์อินพุตที่ซ้อนกันใน 2 พื้นที่ที่ซ้อนทับกันเพื่อสร้าง ouput ของฉันเพื่อให้ขอบเขตแรสเตอร์เอาต์พุตเป็นเพียงพื้นที่ตัดกันของอินพุตทั้งสองเท่านั้น

คำตอบ:


12

สิ่งแรกที่ต้องทำคือการกำหนดสี่เหลี่ยมผืนผ้าที่ทับซ้อนกันในพิกัดเชิงพื้นที่ ในการทำเช่นนี้คุณจะได้รับ geotransform สำหรับแต่ละอิมเมจต้นฉบับ:

gt1 = ds1.GetGeoTransform()
# r1 has left, top, right, bottom of dataset's bounds in geospatial coordinates.
r1 = [gt1[0], gt1[3], gt1[0] + (gt1[1] * ds1.RasterXSize), gt1[3] + (gt1[5] * ds1.RasterYSize)]

# Do the same for dataset 2 ...

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

จากนั้นแปลงสี่เหลี่ยมนั้นเป็นพิกเซลสำหรับแต่ละภาพโดยการลบพิกัดด้านบนและด้านซ้ายแล้วหารด้วยขนาดพิกเซลโดยปัดเศษขึ้น

จากที่นี่คุณสามารถโทรหาReadRaster()แต่ละภาพโดยกำหนดขอบเขตพิกเซลที่คุณเพิ่งคำนวณ:

band.ReadRaster(px1[0], px1[1], px1[2] - px1[0], px1[3] - px1[1], px1[2] - px1[0], px1[3] - px1[1],
                # <band's datatype here>
)

ฉันเหนื่อยนิดหน่อยดังนั้นถ้ามันไม่เข้าท่ามากนักให้ฉันรู้!


สิ่งนี้ยังใช้งานได้สำหรับ rasters ที่มีการคาดการณ์ที่แตกต่างกัน (aka ระบบพิกัดอ้างอิง / ระบบการอ้างอิงเชิงพื้นที่) หรือไม่? และแม้ว่าการคาดการณ์จะเหมือนกัน: สิ่งนี้สามารถใช้งานได้ถ้าgt1[1]และgt2[1](หรือgt1[5]และgt2[5]) มีสัญญาณคัดค้านหรือไม่? (อันไหนที่จะพลิกหนึ่งในภาพแรสเตอร์ทั้งแนวตั้งและแนวนอน) หรือถ้าabs(gt1[2])และabs(gt1[4])มากกว่าabs(gt1[1])และabs(gt1[5])แต่abs(gt2[2])และabs(gt2[4])ก็เล็กกว่าabs(gt2[1])และabs(gt2[5])(ซึ่งอาจจะพลิกหนึ่งในแนวทแยงมุมแนวทแยงมุม)?
das-g

6

องค์ประกอบที่สามของการแยกควรเป็น min (r1 [2], r2 [2]):

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

นอกจากนี้ฉันขอแนะนำตรรกะบางอย่างเพื่อตรวจสอบว่าชุดข้อมูลตัดกันจริงหรือไม่

นี่เป็นวิธีหนึ่ง:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.