我正在使用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。他的第二种方法大多数情况下都有效,但是在我的无数据区域很大的地方,它填充有块状零和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)
该图显示了结果。两种情况下,无数据单元均显示为黄色。
路加的第二种方法
我的尝试方法