Saya menggunakan ArcGIS 10.1, dan ingin membuat raster baru berdasarkan dua raster yang sudah ada sebelumnya. The RasterToNumPyArray memiliki contoh yang baik yang saya ingin beradaptasi.
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")
Masalahnya adalah ia menghilangkan referensi spasial dan juga ukuran sel. Saya pikir itu harus dilakukan arcpy.env, tetapi bagaimana cara mengaturnya berdasarkan input raster? Saya tidak bisa mengetahuinya.
Mengambil jawaban Luke, ini adalah solusi sementara saya.
Kedua solusi Luke mengatur referensi spasial, luas dan ukuran sel dengan benar. Tetapi metode pertama tidak membawa data dalam array dengan benar dan output raster diisi dengan nodata di mana-mana. Metode keduanya bekerja sebagian besar, tetapi di mana saya memiliki wilayah besar nodata, itu diisi dengan nol dan 255 gumpal. Ini mungkin ada hubungannya dengan bagaimana saya menangani sel-sel nodata, dan saya tidak yakin bagaimana saya melakukannya (seharusnya menjadi Q lain). Saya menyertakan gambar dari apa yang saya bicarakan.
#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)
Gambar menampilkan hasil. Saya berdua sel-sel nodata ditampilkan kuning.
Metode kedua Luke
Metode tentatif saya
sumber
Saya punya beberapa masalah dalam mendapatkan ArcGIS untuk menangani nilai-nilai NoData dengan benar dengan contoh-contoh yang ditunjukkan di sini. Saya memperluas contoh dari blog reomtesensing.io (yang kurang lebih mirip dengan solusi yang ditampilkan di sini) untuk menangani NoData dengan lebih baik.
Rupanya ArcGIS (10.1) menyukai nilai -3.40282347e + 38 sebagai NoData. Jadi saya mengkonversi bolak-balik antara NaN numpy dan -3.40282347e + 38. Kode di sini:
sumber