Esiste un modo per verificare se uno qualsiasi dei 2 livelli raster ha un contenuto identico ?
Abbiamo un problema con il nostro volume di archiviazione condiviso aziendale: ora è così grande che ci vogliono più di 3 giorni per eseguire un backup completo. L'indagine preliminare rivela che uno dei maggiori colpevoli che consumano spazio sono i raster on / off che dovrebbero essere archiviati come layer a 1 bit con compressione CCITT.
Questa immagine di esempio è attualmente a 2 bit (quindi 3 possibili valori) e salvata come tiff compresso LZW, 11 MB nel file system. Dopo aver convertito in 1 bit (quindi 2 possibili valori) e aver applicato la compressione CCITT Group 4, lo portiamo a 1,3 MB, quasi un intero ordine di grandezza dei risparmi.
(Questo è in realtà un cittadino molto ben educato, ce ne sono altri memorizzati come float a 32 bit!)
Questa è una notizia fantastica! Tuttavia, ci sono quasi 7.000 immagini per applicare anche questo. Sarebbe semplice scrivere uno script per comprimerli:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... ma manca un test vitale: la versione appena compressa è identica al contenuto?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Esiste uno strumento o un metodo che può automaticamente (dis) dimostrare che il contenuto di Image-A è identico al valore di Image-B?
Ho accesso ad ArcGIS 10.2 e QGIS, ma sono anche aperto a quasi tutto ciò che può ovviare alla necessità di ispezionare tutte queste immagini manualmente per garantire la correttezza prima di sovrascrivere. Sarebbe orribile convertire e sovrascrivere erroneamente un'immagine che in realtà conteneva più di valori on / off. La maggior parte costa migliaia di dollari da raccogliere e generare.
aggiornamento: i più grandi delinquenti sono float a 32 bit che vanno fino a 100.000 px su un lato, quindi ~ 30 GB non compressi.
NoData
gestione durante la conversazione.
len(numpy.unique(yourraster)) == 2
, allora sai che ha 2 valori univoci e puoi farlo tranquillamente.
numpy.unique
sarà più costoso dal punto di vista computazionale (sia in termini di tempo che di spazio) rispetto alla maggior parte degli altri modi per verificare che la differenza sia costante. Se confrontato con una differenza tra due raster in virgola mobile molto grandi che presentano molte differenze (come il confronto tra un originale e una versione compressa con perdita di dati) probabilmente si impantanerebbe per sempre o fallire completamente.
gdalcompare.py
mostrato una grande promessa ( vedi risposta )
raster_diff(old_img, new_img) == "Identical"
sarebbe verificare che il massimo zonale del valore assoluto della differenza sia uguale a 0, in cui la zona viene presa per l'intera estensione della griglia. È questo il tipo di soluzione che stai cercando? (In tal caso, dovrebbe essere perfezionato per verificare che anche i valori NoData siano coerenti.)