Más

¿Determinar la proporción de celdas ráster que contienen cada valor de la lista para muchos rásteres en la pila de ráster?

¿Determinar la proporción de celdas ráster que contienen cada valor de la lista para muchos rásteres en la pila de ráster?


Escribí una función para determinar la proporción de píxeles ráster que contienen cada uno de una lista de valores que me interesaría. Luego escribí una función para aplicar la función anterior a una matriz numérica 3d. Me gustaría saber cómo mejorar esto y también si sería más fácil aplicar una función como esta a una lista de archivos ráster, en lugar de crear una matriz numerosa.

Una matriz de prueba y valores de muestra:

importar numpy como np test_arr = np.random.randint (0, 200, 200) .reshape (2,10,10) valores = [test_arr [1] [1] [1], test_arr [0] [0] [0 ]]

Aquí están mis funciones:

def pixel_props (rast, values): "" "esta función genera una lista con las proporciones del total de píxeles ráster que contienen cada valor." "" prop_list = [] size = float (rast.size) para i en valores: temp_count = np.count_nonzero (rast [rast == i]) prop_list.append (temp_count / size) return prop_list def raster_props (array, no_data): "" "esto aplicará la función pixel_props a un montón de capas en una matriz 3d numpy "" "master_matrix = [[]] master_matrix.append (no_data) para la capa en la matriz: master_matrix.append (pixel_props (layer, no_data)) return master_matrix

Si tiene problemas de memoria, es una buena idea recorrer los archivos ráster individuales en lugar de leerlos todos a la vez.

Así es como aplicaría supíxel_propsfunción a un directorio de imágenes ráster leyendo una tras otra con rasterio. Esto supone que cada imagen es un GeoTiff de una sola capa en una carpeta.

import os import glob import rasterio def pixel_props (rast, values): "" "esta función genera una lista con las proporciones del total de píxeles ráster que contienen cada valor." "" prop_list = [] size = float (rast.size) para el valor en valores: count = np.sum (rast == value) prop_list.append (count / size) return prop_list # crea una lista para la ubicación de cada GeoTiff tif_dir = "/ geo / tiff / folder" tif_list = sorted ( glob.glob (os.path.join (tif_dir, "* .tif"))) # lista de valores que le interesan val_list = [1, 2, 3] # recorrer las imágenes y calcular los resultados de pixel_props = [] para tif_file en tif_list: con rasterio.open (tif_file, 'r') como tif: tif_arr = tif.read () results.append (pixel_props (tif_arr, val_list))

Dado que también ha estado preguntando en otro hilo cómo trazar estos resultados, este es un ejemplo de una serie de tiempo de capa de calidad MODIS, donde 1 significa datos marginales, 2 significa nieve y hielo y 3 es cobertura de nubes.

de matplotlib importar pyplot como plt plt.figure (figsize = (11,7)) para i, val en enumerate (val_list): plt.plot (np.array (results) [:, i], label = "valor% s "% val) plt.legend (loc =" superior derecha ") plt.show ()


Ver el vídeo: Resampling Raster ArcGis. changing the cell size of Raster dataset in ArcGis