Estoy usando ArcGIS Desktop 10 con su extensión Spatial Analyst.
¿Cómo puedo combinar varios rásteres en uno, siempre eligiendo al azar a partir de los valores de la superposición de las células?
Tengo una imagen que puede explicar esto mejor:
Estoy usando ArcGIS Desktop 10 con su extensión Spatial Analyst.
¿Cómo puedo combinar varios rásteres en uno, siempre eligiendo al azar a partir de los valores de la superposición de las células?
Tengo una imagen que puede explicar esto mejor:
Pick fue creada para este tipo de problemas. Piense en ello como el "interruptor" (o "caso"), la versión de "con", que es el mapa de álgebra de la implementación de "if...else."
Si hay 3 superposición de los rásteres, por ejemplo, el (Python) sintaxis sería como
inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])
Tenga en cuenta que pick
comienza indexación en la 1, no 0.
(ver el hilo de comentarios)
Para hacer frente con valores NoData, primero deberá desactivar la opción de ArcGIS del NoData manejo. Hacer esto mediante la creación de redes que tienen un especial (pero válido) valor en lugar de NoData, tales como 99999 (o lo que sea: pero asegúrese de elegir un valor que es mayor que cualquier número válido que pueden aparecer: esto le será útil más adelante). Esto requiere el uso de la IsNull solicitud, como en
p01 = Con(IsNull(inRas01), 99999, inRas01)
p02 = Con(IsNull(inRas02), 99999, inRas01)
p03 = Con(IsNull(inRas03), 99999, inRas01)
Por ejemplo, considere el caso de una fila de mallas (NoData se muestra como "*"):
inRas01: 1 2 19 4 * * * *
inRas02: 9 2 * * 13 14 * *
inRas03: 17 * 3 * 21 * 23 *
El resultado es poner un 99999 en el lugar de cada uno "*".
Ahora, imagine que todos estos rásteres como plano de las matrices de bloques de madera con NoData correspondiente a la falta de bloques (agujeros). Cuando verticalmente pila de estos rásteres, los bloques se caen en los agujeros debajo de ellos. Necesitamos que el comportamiento para evitar el coger NoData valores: no queremos ningún vertical brechas en las pilas de bloques. El orden de los bloques en cada torre, en realidad no importa. Para este fin, se puede obtener cada torre por la clasificación de los datos:
q01 = Rank(1, [p01, p02, p03])
q02 = Rank(2, [p01, p02, p03])
q03 = Rank(3, [p01, p02, p03])
En el ejemplo, podemos obtener
q01: 1 2 3 4 13 14 23 99999
q02: 9 2 19 99999 21 99999 99999 99999
q03: 17 99999 99999 99999 99999 99999 99999 99999
Tenga en cuenta que los rangos van de menor a mayor, por lo que q01 contiene los valores más bajos en cada ubicación, q02 contiene la segunda más baja, etc. El NoData códigos no comienzan a aparecer hasta que todos los números válidos son recogidos, porque los códigos son más grandes que cualquiera de los números válidos.
Con el fin de evitar el coger estos NoData códigos durante la selección al azar, usted necesita saber cuántos bloques se apilan en cada ubicación: este nos dice cuántos valores válidos ocurrir. Una manera de manejar esto es para contar el número de NoData códigos y que restar del total de la selección de las rejillas:
n0 = 3 - EqualToFrequency(99999, [q01, q02, q03])
Este rendimientos
n0: 3 2 2 1 2 1 1 0
Para manejar los casos en que n=0 (así que no hay nada disponible para seleccionar), los puso a NoData:
n = SetNull(n0 == 0, n0)
Ahora
n: 3 2 2 1 2 1 1 *
Esto también garantiza que su (temporal) NoData códigos de desaparecer en el cálculo final. Generar valores aleatorios entre 1 y n:
inPositionRaster = 1 + int(n * CreateRandomRaster())
Por ejemplo, esta trama podría parecer
inPositionRaster: 3 2 1 1 2 1 1 *
Todos sus valores se encuentran entre 1 y el valor correspondiente en [n].
Seleccione los valores exactamente igual que antes:
selection = Pick(inPositionRaster, [q01, q02, q03])
Esto podría resultar en la
selection: 17 2 3 4 21 14 23 *
Para comprobar que todo está ok, pruebe a seleccionar todas las celdas de salida que tiene el NoData código (99999 en este ejemplo): no debería haber ninguna.
Aunque este ejemplo se utiliza sólo tres rejillas para seleccionar, lo he escrito en una forma que se generaliza fácilmente a cualquier número de cuadrículas. Con un montón de redes, la escritura de un guión (para recorrer las operaciones repetidas) será de un valor incalculable.
El uso de python para ArcGIS 10 y el uso de la con la función que tiene la siguiente sintaxis:
Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})
La idea aquí es para ver si el valor en el azar de trama es de menos de 0.5, si es que elegir raster1, de lo contrario elija raster2. NoData
+ datos = NoData
para el primer conjunto de estos reclasificar los valores con NoData
a 0:
import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
ras1_NoNull = Con(IsNull("elevation1"),0, "elevation1") # remove NoData
ras2_NoNull = Con(IsNull("elevation2"),0, "elevation2") # remove NoData
randRaster = CreateRandomRaster(100, 2, Extent(0, 0, 150, 150)) # raster generated between 0 and 1; 100 is seed value
outCon = Con(randRaster < 0.5, ras1_NoNull, ras2_NoNull)
outCon.save("C:/outcon.img") # save raster
EDIT: Acabo de darme cuenta de que no va a añadir el NoData
valores de modo que la pieza puede ser dejado fuera.
Acabo de crear un azar de trama (ayuda) de la misma medida y tamaño de la celda. A continuación, utilizando CON (ayuda) configurar la recepción de valor desde el 1 de trama si la celda de aleatorizado trama tiene un valor < 128 (si un azar trama sería 0 - 255) de lo contrario, elija un valor de 2º de trama.
Espero que tenga sentido :)
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.