2016-08-25 2 views
1

Я выполняю простой цикл 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 

Я попытался с двумя вариантами, в коде (см код) и я получаю та же ошибка. Есть идея об этом? Спасибо заранее и ура!

+0

Вы можете попробовать '(r2005 == INT (я)) & (R2009 == INT (к))' чтобы типы соответствовали коду, который, как вы знаете, работает, но я не знаю, помогло бы это или нет. – cxw

+0

Или попробуйте 'для i в np.nditer (classes)', ditto для 'j', за [это] (http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#single- массив-итерация) – cxw

+0

Вот и все! Благодаря! – Jaime

ответ

0

Вы знаете, что значение 14 работает, но вы получаете TypeError с любым контуром за classes. Тип 14 является int, поэтому попробуйте типажи i и j к int перед выполнением сравнения:

for i in classes: 
    for j in classes: 
     transition_raster = ((r2005 == int(i)) & (r2009 == int(j))) 
     # added typecasts:    ^^^^^   ^^^^^
     ...