Existe-t-il un moyen de vérifier si 2 couches raster données ont un contenu identique ?
Nous avons un problème sur le volume de stockage partagé de notre entreprise: il est maintenant si important qu'il faut plus de 3 jours pour effectuer une sauvegarde complète. Une enquête préliminaire révèle que l'un des plus grands coupables consommant de l'espace sont les rasters on / off qui devraient vraiment être stockés sous forme de couches 1 bit avec la compression CCITT.
Cet exemple d'image est actuellement de 2 bits (donc 3 valeurs possibles) et enregistré en tant que tiff compressé LZW, 11 Mo dans le système de fichiers. Après avoir converti en 1 bit (donc 2 valeurs possibles) et appliqué la compression CCITT Group 4, nous le réduisons à 1,3 Mo, soit presque un ordre de grandeur d'économies.
(Il s'agit en fait d'un citoyen très bien élevé, il y en a d'autres stockés sous forme de flotteur 32 bits!)
Ce sont des nouvelles fantastiques! Cependant, il y a près de 7 000 images à appliquer également. Il serait simple d'écrire un script pour les compresser:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... mais il manque un test essentiel: la nouvelle version compressée est-elle identique au contenu?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Existe-t-il un outil ou une méthode qui peut (dé) prouver automatiquement que le contenu de l'Image-A est identique en valeur au contenu de l'Image-B?
J'ai accès à ArcGIS 10.2 et QGIS, mais je suis également ouvert à presque tout ce qui ne peut pas nécessiter l'inspection manuelle de toutes ces images pour garantir leur exactitude avant de les écraser. Il serait horrible de convertir à tort et écraser une image qui vraiment n'avoir plus on / off valeurs en elle. La plupart coûtent des milliers de dollars à rassembler et à générer.
mise à jour: Les plus grands contrevenants sont les flotteurs 32 bits qui vont jusqu'à 100 000 pixels sur un côté, donc ~ 30 Go non compressés.
NoData
gestion reste dans la conversation.
len(numpy.unique(yourraster)) == 2
, vous savez qu'il a 2 valeurs uniques et vous pouvez le faire en toute sécurité.
numpy.unique
- jacent va être plus coûteux en termes de calcul (en termes de temps et d'espace) que la plupart des autres moyens de vérifier que la différence est une constante. Lorsqu'il est confronté à une différence entre deux très grands rasters à virgule flottante qui présentent de nombreuses différences (comme la comparaison d'un original à une version compressée avec perte), il risque de s'enliser pour toujours ou d'échouer complètement.
gdalcompare.py
montré une grande promesse ( voir la réponse )
raster_diff(old_img, new_img) == "Identical"
serait de vérifier que le zonal max de la valeur absolue de la différence est égal à 0, où la zone est prise sur toute l'étendue de la grille. Est-ce le type de solution que vous recherchez? (Si tel est le cas, il devrait être affiné pour vérifier que toutes les valeurs NoData sont également cohérentes.)