ArcGIS 10.1を使用していて、2つの既存のラスターに基づいて新しいラスターを作成したい。RasterToNumPyArrayは私が適応したい良い例があります。
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")
問題は、空間参照とセルサイズを削除することです。arcpy.envを実行する必要があると考えましたが、入力ラスターに基づいてそれらを設定するにはどうすればよいですか?私はそれを把握することはできません。
ルークの答えを取り上げると、これは私の暫定的な解決策です。
Lukeのソリューションはどちらも、空間参照、範囲、セルサイズを正しく設定しました。ただし、最初の方法では配列内のデータが正しく伝達されず、出力ラスタにはどこでもnodataが入力されます。彼の2番目の方法はほとんど動作しますが、nodataの大きな領域がある場合は、ブロック状のゼロと255で埋められます。これは、nodataセルをどのように処理したかに関係している可能性があります。私が話していることの画像を含めました。
#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)
結果を示す画像。どちらの場合も、nodataセルは黄色で表示されます。
ルークの2番目の方法
私の仮の方法