2 votos

comparando rásters, celdas que han cambiado de valor

Intento comparar dos rásters que representan un modelo de distribución de especies actual y futuro.

Los raster tienen exactamente la misma extensión y el mismo tamaño de celda.

Aquí es donde se pone difícil, son rásters multibanda, por lo que para crear una tabla de atributos primero debo convertirlos a un raster binario (¿tal vez hay otra manera de evitar esto?). Haciendo esto pierdo mucha de la información en los rásters.

Quiero una forma rápida de comparar cuántas celdas han cambiado de valor (usando python probablemente) ya que tengo muchos conjuntos de estos para comparar.

1voto

pd. Puntos 755

Prueba esto:

  • Utilice la RasterToNumpyArray función para convertir tu raster multibanda en un array n-dimensional con dimensiones (# de bandas, filas,columnas)
  • Utilice la no_igual del módulo numpy para realizar una comparación celda a celda de cada banda.
  • Utilice la único del módulo numpy y comprensiones de listas para encontrar el número total de celdas que han cambiado/no han cambiado.

Ejemplo...

Utilizando simples rásters de 3 bandas (species_n y species_f), el código de ejemplo siguiente

import arcpy
import numpy as np

sn = arcpy.RasterToNumPyArray(r'D:\species.gdb\species_n',nodata_to_value = -999.999) #species now
print "\nSpecies Now"
print "Data Type: {0}".format(sn.dtype)
print "Bands, Rows, Columns: {0}\n".format(sn.shape)

sf = arcpy.RasterToNumPyArray(r'D:\species.gdb\species_f',nodata_to_value = -999.999) #species future
print "\nSpecies Future"
print "Data Type: {0}".format(sn.dtype)
print "Bands, Rows, Columns: {0}\n".format(sn.shape)

#Band comparison
#cell by cell comparison - returns true if cell values not equal, else false.
band_comparison = np.not_equal(sn[0],sf[0])

u, indices = np.unique(band_comparison, return_inverse = True)

#Count #number of changed cells
#this step can be replaced with a far more elegant approach
cell_counts = zip(u,[u[indices].tolist().count(x) for x in u])
print "\nChanged Cells:\n{0}".format(cell_counts)

produce los resultados que se muestran a continuación:

enter image description here

Nota: en este ejemplo, la banda 1 de species_n es exactamente la misma que la banda_1 de species_f. Los resultados anteriores muestran que no hay celdas modificadas, como era de esperar.

las especies_f(bandas 2 y 3) son múltiplos de las especies_n(bandas 2 y 3)

Comparación de la banda 2:

band_comparison = np.not_equal(sn[1],sf[1])

produce:

enter image description here

10 celdas no han cambiado (en este ejemplo, se trata simplemente de celdas sin datos) 26 celdas han cambiado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X