Estou usando o ArcGIS 10.1 e quero criar uma nova varredura com base em duas rasters existentes. O RasterToNumPyArray tem um bom exemplo que eu quero adaptar.
import arcpy
import numpy
myArray = arcpy.RasterToNumPyArray('C:/data/inRaster')
myArraySum = myArray.sum(1)
myArraySum.shape = (myArray.shape[0],1)
myArrayPerc = (myArray * 1.0)/ myArraySum
newRaster = arcpy.NumPyArrayToRaster(myArrayPerc)
newRaster.save("C:/output/fgdb.gdb/PercentRaster")
O problema é que retira a referência espacial e também o tamanho da célula. Achei que tinha que fazer arcpy.env, mas como faço para configurá-los com base na entrada raster? Eu não consigo entender.
Tomando a resposta de Luke, esta é minha solução provisória.
As duas soluções de Lucas definiram a referência espacial, a extensão e o tamanho da célula corretamente. Mas o primeiro método não carregava dados na matriz corretamente e a varredura de saída é preenchida com nodata em todos os lugares. Seu segundo método funciona principalmente, mas onde eu tenho uma grande região de nodata, ele preenche com zeros em bloco e 255s. Isso pode ter a ver com a maneira como lidei com as células nodata, e não tenho muita certeza de como estava fazendo isso (deveria ser outro Q). Incluí imagens do que estou falando.
#Setting the raster properties directly
import arcpy
import numpy
inRaster0='C:/workspace/test0.tif'
inRaster1='C:/workspace/test1.tif'
outRaster='C:/workspace/test2.tif'
dsc=arcpy.Describe(inRaster0)
sr=dsc.SpatialReference
ext=dsc.Extent
ll=arcpy.Point(ext.XMin,ext.YMin)
# sorry that i modify calculation from my original Q.
# This is what I really wanted to do, taking two uint8 rasters, calculate
# the ratio, express the results as percentage and then save it as uint8 raster.
tmp = [ np.ma.masked_greater(arcpy.RasterToNumPyArray(_), 100) for _ in inRaster0, inRaster1]
tmp = [ np.ma.masked_array(_, dtype=np.float32) for _ in tmp]
tmp = ((tmp[1] ) / tmp[0] ) * 100
tmp = np.ma.array(tmp, dtype=np.uint8)
# i actually am not sure how to properly carry the nodata back to raster...
# but that's another Q
tmp = np.ma.filled(tmp, 255)
# without this, nodata cell may be filled with zero or 255?
arcpy.env.outCoordinateSystem = sr
newRaster = arcpy.NumPyArrayToRaster(myArrayPerc,ll,dsc.meanCellWidth,dsc.meanCellHeight)
newRaster.save(outRaster)
Imagem mostrando resultados. Nos dois casos, as células nodatas são mostradas em amarelo.
Segundo método de Lucas
Meu método experimental
fonte
Eu tive alguns problemas para conseguir que o ArcGIS manipulasse os valores NoData corretamente com os exemplos mostrados aqui. Estendi o exemplo do blog reomtesensing.io (que é mais ou menos semelhante às soluções mostradas aqui) para lidar melhor com o NoData.
Aparentemente, o ArcGIS (10.1) gosta do valor -3.40282347e + 38 como NoData. Portanto, eu converto entre NaN e -3,40282347e + 38. O código está aqui:
fonte