Tôi đang sử dụng ArcGIS 10.1 và muốn tạo một raster mới dựa trên hai raster đã có từ trước. Các RasterToNumPyArray có một ví dụ điển hình mà tôi muốn thích nghi.
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")
Vấn đề là nó tước tham chiếu không gian và kích thước ô. Tôi hình dung nó phải làm arcpy.env, nhưng làm cách nào để đặt chúng dựa trên raster đầu vào? Tôi không thể hình dung nó ra.
Lấy câu trả lời của Luke, đây là giải pháp dự kiến của tôi.
Cả hai giải pháp của Luke đều đặt tham chiếu không gian, phạm vi và kích thước ô chính xác. Nhưng phương pháp đầu tiên không mang dữ liệu trong mảng một cách chính xác và raster đầu ra được lấp đầy bằng nốt ở khắp mọi nơi. Phương pháp thứ hai của anh ấy hoạt động chủ yếu, nhưng nơi tôi có vùng hạch lớn, nó lấp đầy với các số 0 và 255 khối. Điều này có thể phải làm với cách tôi xử lý các tế bào nốt, và tôi không chắc là tôi đã làm như thế nào (nên là một Q khác). Tôi bao gồm những hình ảnh về những gì tôi đang nói về.
#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)
Hình ảnh hiển thị kết quả. Tôi cả hai tế bào nốt sần được hiển thị màu vàng.
Phương pháp thứ hai của Luke
Phương pháp dự kiến của tôi