Python For 循环中的 ArcGIS 栅格计算器错误
ArcGIS Raster Calculator Error in Python For-Loop
我正在通过 python 在 ArcGIS 计算器中执行一个简单的 for 循环。我想使用 cover 类 从第一年 (r2005) 到第二年 (r2009) 生成过渡图。这是代码:
# 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))
对象"classes"是一个包含要比较的封面类的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")
但是,当我 运行 完整的 for 循环时,我得到这个错误:
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
我尝试了代码中的两个选项(参见代码),但我得到了同样的错误。有什么想法吗?提前致谢并干杯!
您知道值 14
有效,但是无论 classes
上的循环返回什么,您都会得到一个 TypeError
。 14
的类型是 int
,因此在进行比较之前尝试将 i
和 j
类型转换为 int
:
for i in classes:
for j in classes:
transition_raster = ( (r2005 == int(i)) & (r2009 == int(j)) )
# added typecasts: ^^^^ ^ ^^^^ ^
...
我正在通过 python 在 ArcGIS 计算器中执行一个简单的 for 循环。我想使用 cover 类 从第一年 (r2005) 到第二年 (r2009) 生成过渡图。这是代码:
# 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))
对象"classes"是一个包含要比较的封面类的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")
但是,当我 运行 完整的 for 循环时,我得到这个错误:
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
我尝试了代码中的两个选项(参见代码),但我得到了同样的错误。有什么想法吗?提前致谢并干杯!
您知道值 14
有效,但是无论 classes
上的循环返回什么,您都会得到一个 TypeError
。 14
的类型是 int
,因此在进行比较之前尝试将 i
和 j
类型转换为 int
:
for i in classes:
for j in classes:
transition_raster = ( (r2005 == int(i)) & (r2009 == int(j)) )
# added typecasts: ^^^^ ^ ^^^^ ^
...