ArcGIS Reclassify falha no Python Toolbox
Estou tentando construir uma caixa de ferramentas Python para analisar deslizamentos de terra em submarinos. Entre outras coisas, quero executar a ferramenta de aspecto e então reclassificar os aspectos em grupos com um intervalo de 45 graus. Portanto, faço o seguinte:
import arcpy
import arcpy.sa
arcpy.env.workspace = r'C:\FIP_Tools20191118\GIS_files\SBP_Toolbox.gdb'
arcpy.CheckOutExtension('Spatial')
aspect_ras = arcpy.sa.Aspect('Smooth_Bathymetry', 'PLANAR', 'METER')
aspect_ras.save('aspect_raster')
remap = RemapRange([[0, 45, 45], [45, 90, 90], [90, 135, 135], [135, 180, 180], [180, 225, 225], [225, 270, 270], [270, 315, 315], [315, 360, 360]])
reclass_ras = arcpy.sa.Reclassify('aspect_raster', 'Value', remap, 'NODATA')
arcpy.CopyRaster_management(reclass_ras, 'reclass_Ras')
O estranho é que o código acima funciona bem, contanto que eu execute-o a partir do Pycharm ou da janela ArcGIS Python, mas quando tento colocá-lo em uma caixa de ferramentas Python (.pyt) e executá-lo, ele gera os seguintes erros:
ERRO 000864: Reclassificação: A entrada não está dentro do domínio definido.
ERROR 000893: Um valor GP vazio ou texto foi inserido.
Eu realmente não entendo por que não funciona em uma caixa de ferramentas. O fato de funcionar de outra forma me diz que não há um problema fundamental em meu código, e é por isso que espero que sejam algumas informações básicas que estou perdendo. Estou realmente perdido aqui.
Estou usando ArcGIS 10.6.1 no Windows 10
Respostas
OK, na verdade, acabei de consertar agora. Para responder à minha pergunta, preciso fornecer algumas informações adicionais:
Basicamente, o intervalo de aspecto não é codificado, é fornecido por meio de um parâmetro. No entanto, ele foi acessado por meio do método .ValueAsText, que retorna o valor como uma string. Porém, depois é tratado como um inteiro, de onde vêm os erros. Com certeza também por que funcionou bem no PyCharm, mas não como um .pyt. Veja o mwe abaixo:
import arcpy
from arcpy.sa import *
arcpy.CheckOutExtension('Spatial')
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "ShearBandPropagation"
self.alias = "Shear Band Propagation"
# List of tool classes associated with this toolbox
self.tools = [CreateGeometry]
def getParameterInfo(self):
"""Define parameter definitions"""
param0 = arcpy.Parameter(
displayName='Workspace',
name='workspace',
datatype='DEWorkspace',
parameterType='Required',
direction='Input')
param1 = arcpy.Parameter(
displayName='Smooth Bathymetry',
name='smooth_bathymetry',
datatype='Raster Layer',
parameterType='Required',
direction='Input')
param2 = arcpy.Parameter(
displayName='Aspect Interval',
name='aspect_interval',
datatype='GPLong',
parameterType='Required',
direction='Input')
param2.value = 45
param2.filter.type = "Range"
param2.filter.list = [1, 360]
param3 = arcpy.Parameter(
displayName='Output',
name='output_name',
datatype='Raster Layer',
parameterType='Required',
direction='Output')
params = [param0, param1, param2, param3]
return params
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
workspace = parameters[0].valueAsText
smooth_bathymetry = parameters[1].valueAsText
aspect_interval = parameters[2].valueAsText
output = parameters[3].ValueAsText
aspect_ras = arcpy.sa.Aspect(smooth_bathymetry, 'PLANAR', 'METER')
aspect_ras.save('aspect_raster')
reclassified_list = [] # create values for remap range based on input parameter
# here is where it went wrong: the correct thing to do would have been: aspect_range = int(aspect_interval)
aspect_range = aspect_interval
while aspect_range <= 360:
if aspect_range % 1 != 0:
reclassified_list.append([aspect_range - aspect_interval, aspect_range, int(aspect_range*10)])
aspect_range += aspect_interval
else:
reclassified_list.append([aspect_range - aspect_interval, aspect_range, int(aspect_range)])
aspect_range += aspect_interval
reclass_ras = arcpy.sa.Reclassify('aspect_raster', 'Value', RemapRange(reclassified_list), 'NODATA')
arcpy.CopyRaster_management(reclass_ras, output)