ฉันใช้ 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 แต่ฉันจะตั้งพวกมันตามอินพุตแรสเตอร์ได้อย่างไร ฉันไม่สามารถคิดออก
รับคำตอบของลุคนี่คือวิธีแก้ปัญหาเบื้องต้นของฉัน
โซลูชันทั้งสองของลุคตั้งค่าการอ้างอิงขอบเขตและขนาดเซลล์อย่างถูกต้อง แต่วิธีแรกไม่ได้เก็บข้อมูลในอาเรย์อย่างถูกต้องและเอาท์พุทแรสเตอร์เต็มไปด้วยข้อมูลทั้งหมด วิธีที่สองของเขาใช้งานได้เป็นส่วนใหญ่ แต่ที่ฉันมีพื้นที่ขนาดใหญ่ของโนดาต้ามันเต็มไปด้วยศูนย์บล็อกและ 255s สิ่งนี้อาจเกี่ยวข้องกับวิธีที่ฉันจัดการเซลล์โนดาต้าและฉันก็ค่อนข้างแน่ใจว่าฉันกำลังทำมันอย่างไร (ควรเป็น 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)
ภาพแสดงผลลัพธ์ ฉันทั้งสองกรณีเซลล์โนดาต้าแสดงเป็นสีเหลือง
วิธีที่สองของลุค
วิธีการชั่วคราวของฉัน