Я выполняю простой цикл for-loop в калькуляторе ArcGIS через python. Я хочу генерировать карты перехода с использованием классов покрытия с первого года (r2005) до второго года (r2009). Вот код:Ошибка ArcGIS Raster Calculator в Python For-Loop
# Importing libraries
import arcpy, sys, string, os, arcgisscripting, dircache
import numpy as np
from arcpy import env
from arcpy.sa import *
# Creating the geoprocessor object
gp = arcgisscripting.create()
# Setting environment
arcpy.env.compression = "LZW"
# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")
# Reading data
classes = np.genfromtxt("Globcover_Legend_Neotropics.txt", dtype="int")
r2005 = Raster("2005_Clip.tif")
r2009 = Raster("2009_Clip.tif")
# Creating transition rasters
for i in classes:
for j in classes:
#OPTION1
#outEqualTo1 = r2005==i
#outEqualTo2 = r2009==j
#transition_raster = (outEqualTo1) & (outEqualTo2)
#OPTION2
transition_raster = (r2005 == i) & (r2009 == j)
transition_raster.save(str(i)+"_"+str(j)+".tif")
print (str(i)+"_"+str(j))
Объект «классы» представляет собой NumPy массив, содержащий классы обложки для сравнения:
>>> classes
array([ 14, 20, 30, 40, 50, 60, 70, 100, 110, 120, 130, 140, 150,
160, 170, 180, 190, 200, 210, 220])
Когда я запускаю код, используя любой элемент в цикле, он отлично работает , Например:
>>> i=j=14
>>> transition_raster = (r2005 == i) & (r2009 == j)
>>> transition_raster.save(str(i)+"_"+str(j)+".tif")
Однако, когда я бегу полный для цикла я получаю эту ошибку:
Traceback (most recent call last):
File "D:\Cover\GlobCover\transitions.py", line 31, in <module>
transition_raster = (r2005 == i) & (r2009 == j)
File "C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Functions.py", line 3831, in EqualTo
in_raster_or_constant2)
File "C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Utils.py", line 47, in swapper
result = wrapper(*args, **kwargs)
File "C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Functions.py", line 3828, in Wrapper
["EqualTo", in_raster_or_constant1, in_raster_or_constant2])
TypeError: expected a raster or layer name
Я попытался с двумя вариантами, в коде (см код) и я получаю та же ошибка. Есть идея об этом? Спасибо заранее и ура!
Вы можете попробовать '(r2005 == INT (я)) & (R2009 == INT (к))' чтобы типы соответствовали коду, который, как вы знаете, работает, но я не знаю, помогло бы это или нет. – cxw
Или попробуйте 'для i в np.nditer (classes)', ditto для 'j', за [это] (http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#single- массив-итерация) – cxw
Вот и все! Благодаря! – Jaime