ArcGIS 10.1 kullanıyorum ve önceden varolan iki rasterden oluşan yeni bir raster oluşturmak istiyorum. RasterToNumPyArray Adapte istiyorum iyi bir örnek vardır.
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")
Sorun uzamsal referansı ve aynı zamanda hücre büyüklüğünü çıkarmasıdır. Arcpy.env yapmak zorunda olduğunu düşündüm, ancak bunları giriş rasterine göre nasıl ayarlayabilirim? Ne olduğunu anlayamıyorum.
Luke'un cevabını alarak, bu benim geçici çözümüm.
Luke'un her iki çözümü de uzamsal referansı, kapsamı ve hücre boyutunu doğru şekilde ayarladı. Ancak ilk yöntem dizideki verileri doğru bir şekilde taşımadı ve çıktı raster her yerde nodata ile dolduruldu. İkinci yöntemi çoğunlukla işe yarıyor, ancak büyük nodata bölgesine sahip olduğumda, bloklu sıfırlar ve 255'ler ile dolduruyor. Bu nasıl nodata hücreleri ele ile ilgili olabilir ve ben nasıl (ben başka bir Q olsa olmalıdır) nasıl yaptığını tam olarak emin değilim. Bahsettiğim şeylerin resimlerini ekledim.
#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)
Sonuçları gösteren resim. Her iki durumda da nodata hücreleri sarı gösterilir.
Luke'un ikinci yöntemi
Geçici yöntemim