J'utilise ArcGIS 10.1 et je souhaite créer un nouveau raster basé sur deux rasters préexistants. Le RasterToNumPyArray a un bon exemple que je veux adapter.
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")
Le problème est qu'il supprime la référence spatiale et également la taille des cellules. J'ai pensé que cela devait faire arcpy.env, mais comment les définir en fonction du raster en entrée? Je ne peux pas le comprendre.
En prenant la réponse de Luke, ceci est ma solution provisoire.
Les deux solutions de Luke définissent correctement la référence spatiale, l'étendue et la taille des cellules. Mais la première méthode ne portait pas correctement les données dans le tableau et le raster en sortie est rempli de nodata partout. Sa deuxième méthode fonctionne principalement, mais là où j'ai une grande région de nodata, elle se remplit de zéros en bloc et de 255. Cela peut avoir à voir avec la façon dont j'ai géré les cellules nodata, et je ne sais pas trop comment je le faisais (cela devrait être un autre Q cependant). J'ai inclus des images de ce dont je parle.
#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)
Image montrant les résultats. Dans les deux cas, les cellules nodales sont jaunes.
La deuxième méthode de Luke
Ma méthode provisoire
la source
J'ai rencontré des problèmes pour que ArcGIS gère correctement les valeurs NoData avec les exemples présentés ici. J'ai étendu l'exemple de blog reomtesensing.io (qui est plus ou moins similaire aux solutions présentées ici) pour mieux gérer NoData.
Apparemment, ArcGIS (10.1) aime la valeur -3.40282347e + 38 comme NoData. Je convertis donc en va-et-vient entre numpy NaN et -3.40282347e + 38. Le code est ici:
la source