มีวิธีตรวจสอบเพื่อดูว่าเลเยอร์แรสเตอร์ที่กำหนด 2 รายการมีเนื้อหาเหมือนกันหรือไม่?
เรามีปัญหาเกี่ยวกับปริมาณพื้นที่เก็บข้อมูลที่ใช้ร่วมกันในองค์กรของเรา: ขณะนี้มีขนาดใหญ่มากซึ่งใช้เวลามากกว่า 3 วันในการสำรองข้อมูลเต็มรูปแบบ การตรวจสอบเบื้องต้นพบว่าหนึ่งในผู้ร้ายที่กินพื้นที่มากที่สุดคือเปิด / ปิดแรสเตอร์ที่ควรเก็บเป็นเลเยอร์ 1 บิตด้วยการบีบอัด CCITT
อิมเมจตัวอย่างนี้เป็น 2 บิตในปัจจุบัน (ดังนั้นค่าที่เป็นไปได้ 3 ค่า) และบันทึกเป็นไฟล์บีบอัด LZW ขนาด 11 MB ในระบบไฟล์ หลังจากแปลงเป็น 1 บิต (เพื่อให้มี 2 ค่าที่เป็นไปได้) และใช้การบีบอัด CCITT Group 4 เราได้รับการลดลงเหลือ 1.3 MB เกือบเต็มตามลำดับความสำคัญของการออม
(อันที่จริงแล้วเป็นพลเมืองที่ประพฤติตัวดีมีคนอื่นเก็บไว้เป็น 32 บิตลอย!)
นี่เป็นข่าวที่น่าอัศจรรย์! อย่างไรก็ตามมีเกือบ 7,000 ภาพที่จะใช้เช่นกัน มันจะตรงไปตรงมาในการเขียนสคริปต์เพื่อบีบอัดพวกเขา:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... แต่มันขาดการทดสอบที่สำคัญ: เป็นรุ่นเนื้อหาบีบอัดใหม่เหมือนกันหรือไม่
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
มีเครื่องมือหรือวิธีการที่สามารถ (dis) พิสูจน์ได้โดยอัตโนมัติว่าเนื้อหาของ Image-A นั้นมีคุณค่าเหมือนกันกับเนื้อหาของ Image-B หรือไม่?
ฉันมีสิทธิ์เข้าถึง ArcGIS 10.2 และ QGIS แต่ฉันก็ยังเปิดรับสิ่งอื่น ๆ ส่วนใหญ่เกินกว่าที่จะสามารถกำจัดความจำเป็นในการตรวจสอบภาพเหล่านี้ทั้งหมดด้วยตนเองเพื่อให้แน่ใจว่าถูกต้องก่อนเขียนทับ มันจะน่ากลัวที่จะผิดพลาดการแปลงและเขียนทับภาพที่จริงๆไม่ได้มากไปกว่าการเปิด / ปิดค่าในนั้น ค่าใช้จ่ายส่วนใหญ่หลายพันดอลลาร์เพื่อรวบรวมและสร้าง
อัปเดต:ผู้กระทำผิดที่ใหญ่ที่สุดคือ 32 บิตลอยตัวในช่วงที่สูงถึง 100,000px ข้างหนึ่งดังนั้น ~ 30GB ที่ไม่บีบอัด
NoData
จัดการที่เหมาะสมให้อยู่ในการสนทนา
len(numpy.unique(yourraster)) == 2
คุณจะรู้ว่ามีค่าที่ไม่ซ้ำกัน 2 ค่าและคุณสามารถทำสิ่งนี้ได้อย่างปลอดภัย
numpy.unique
จะมีราคาแพงมากขึ้น (ทั้งในแง่ของเวลาและพื้นที่) มากกว่าวิธีอื่น ๆ ส่วนใหญ่ในการตรวจสอบว่าความแตกต่างนั้นคงที่ เมื่อเผชิญหน้ากับความแตกต่างระหว่าง rasters จุดลอยตัวขนาดใหญ่สองตัวที่แสดงความแตกต่างมากมาย (เช่นการเปรียบเทียบแบบดั้งเดิมกับรุ่นบีบอัดแบบสูญเสีย) มันน่าจะชะงักลงตลอดไปหรือล้มเหลวอย่างสมบูรณ์
gdalcompare.py
มีคำสัญญาที่ยอดเยี่ยม ( ดูคำตอบ )
raster_diff(old_img, new_img) == "Identical"
คือการตรวจสอบว่าค่าสูงสุดของค่าสัมบูรณ์ของความแตกต่างเท่ากับ 0 โดยที่พื้นที่ถูกยึดครองในขอบเขตกริดทั้งหมด นี่เป็นวิธีแก้ปัญหาที่คุณกำลังมองหาใช่ไหม (ถ้าเป็นเช่นนั้นจะต้องได้รับการปรับปรุงเพื่อตรวจสอบว่าค่า NoData ใด ๆ มีความสอดคล้องเช่นกัน)