답변:
ArcGIS <= 9.3.1에서는 가능하지 않다고 생각합니다.
나는 이와 같은 작업에 오픈 소스 GDAL API 를 사용합니다.
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/RasterToNumPyArray/000v0000012z000000/
ArcGIS 10에는 numPy 배열을 쓰고 읽을 수있는 기능이 있습니다.
fmark는 이미 질문에 대답했지만 다음은 래스터 (tif)를 NumPy 배열로 읽고 데이터를 다시 분류 한 다음 새로운 tif 파일에 작성하기 위해 작성한 OSGEO Python 코드의 예입니다. 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에서 ArcObject에 액세스 하시겠습니까? arcobjects와 python의 통합에 대해 설명합니다.
이 샘플 의 코드는 파이썬에서 호출 할 수 있도록 조정될 수 있습니다.
파이썬으로 배열 참조를 다시 전달하는 방법이 있는지 확실하지 않습니다. 있다면 IPixelBlock.PixelDatabyRef를 시도해 볼 가치가 있습니다.
래스터를 ESRI ASCII 그리드로 저장하고 numpy를 사용하여 해당 파일을 읽고 조작 할 수 있습니다.
다음과 같은 시작점이 있습니다. http://sites.google.com/site/davidpfinlayson2/esriasciigridformat
그러나 조심하십시오-ascii 그리드 형식이 항상 사양을 따르는 것은 아니므로 매번 올바르게 읽는 것이 어려울 수 있습니다.
래스터를 픽셀 단위로 조작 할 수 있는지 확실하지 않지만 파이썬 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에서는 확실하지 않습니다.