ArcGIS 10.1을 사용하고 있으며 두 개의 기존 래스터를 기반으로 새 래스터를 만들고 싶습니다. 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가있는 곳에서는 블록 0과 255로 채워집니다. 이것은 내가 nodata 셀을 처리하는 방법과 관련이있을 수 있으며, 내가 어떻게했는지 잘 모르겠습니다 (또 다른 Q 여야 함). 나는 내가 말하는 것에 대한 이미지를 포함시켰다.
#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 셀이 노란색으로 표시됩니다.
누가의 두 번째 방법
나의 잠정적 인 방법