Answers:
我认为ArcGIS <= 9.3.1不可能做到这一点
我将开源GDAL API用于此类任务。
fmark已经回答了问题,但这是我编写的一些示例OSGEO Python代码,用于将栅格(tif)读取到NumPy数组中,对数据进行重新分类,然后将其写到新的tif文件中。您可以读写支持gdal的任何格式。
"""
Example of raster reclassification using OpenSource Geo Python
"""
import numpy, sys
from osgeo import gdal
from osgeo.gdalconst import *
# register all of the GDAL drivers
gdal.AllRegister()
# open the image
inDs = gdal.Open("c:/workshop/examples/raster_reclass/data/cropland_40.tif")
if inDs is None:
print 'Could not open image file'
sys.exit(1)
# read in the crop data and get info about it
band1 = inDs.GetRasterBand(1)
rows = inDs.RasterYSize
cols = inDs.RasterXSize
cropData = band1.ReadAsArray(0,0,cols,rows)
listAg = [1,5,6,22,23,24,41,42,28,37]
listNotAg = [111,195,141,181,121,122,190,62]
# create the output image
driver = inDs.GetDriver()
#print driver
outDs = driver.Create("c:/workshop/examples/raster_reclass/output/reclass_40.tif", cols, rows, 1, GDT_Int32)
if outDs is None:
print 'Could not create reclass_40.tif'
sys.exit(1)
outBand = outDs.GetRasterBand(1)
outData = numpy.zeros((rows,cols), numpy.int16)
for i in range(0, rows):
for j in range(0, cols):
if cropData[i,j] in listAg:
outData[i,j] = 100
elif cropData[i,j] in listNotAg:
outData[i,j] = -100
else:
outData[i,j] = 0
# write the data
outBand.WriteArray(outData, 0, 0)
# flush data to disk, set the NoData value and calculate stats
outBand.FlushCache()
outBand.SetNoDataValue(-99)
# georeference the image and set the projection
outDs.SetGeoTransform(inDs.GetGeoTransform())
outDs.SetProjection(inDs.GetProjection())
del outData
从Python访问ArcObjects?讨论了arcobjects与python的集成。
也许可以修改此示例中的代码,以便可以从python调用它。
我不确定是否有办法将数组byref传递回python。如果存在,那么IPixelBlock.PixelDatabyRef将值得尝试。
您可以将栅格另存为ESRI ascii网格,并使用numpy读取/操作该文件。
这提供了一些起点:http : //sites.google.com/site/davidpfinlayson2/esriasciigridformat
但是请注意-ASCII网格格式似乎并不总是遵循规范,因此每次正确阅读它们都是一个挑战。
我不确定您可以逐像素地处理栅格,但是可以将地理处理对象与python API结合使用。
您可以使用任何工具箱进行此类操作。示例脚本为:
#import arcgisscripting
gp = arcgisscripting.create(9.3)
gp.AddToolbox("SA") # addint spatial analyst toolbox
rasterA = @"C:\rasterA.tif"
rasterB = @"C:\rasterB.tif"
rasterC = @"C:\rasterC.tif" # this raster does not yet exist
rasterD = @"C:\rasterD.tif" # this raster does not yet exist
gp.Minus_SA(rasterA,rasterB,rasterC)
gp.Times_SA(rasterA,rasterB,rasterD)
# lets try to use more complex functions
# lets build and expression first
expression1 = "slope( " + rasterC + ")"
expression2 = "(" + rasterC " + " rasterD + ") - " + rasterA
gp.SingleOutputMapAlgebra_SA(expression1,@"C:\result_exp1.tif")
gp.SingleOutputMapAlgebra_SA(expression2,@"C:\result_exp2.tif")
这是您问题的跟进。仍然不可能。不确定版本10.0。