7 votos

¿Cómo determinar si una capa es un punto utilizando Python Toolbox?

He estado trabajando en una caja de herramientas de Python que contiene 6 parámetros. Estoy un poco perdido en todos los diferentes tipos de datos disponibles en ArcMap (¡parece que hay cientos de ellos!). Sin embargo, uno de los parámetros de entrada tiene una extensión de archivo .shp (shapefile). Siempre he usado el tipo de datos GPFeatureLayer y siempre ha funcionado para todo lo demás que espero hacer con mi herramienta, aunque no entiendo completamente por qué. Solo he estado haciendo pruebas con shapefiles de punto por el momento.

Lo que espero hacer en última instancia es verificar si el usuario ha ingresado un shapefile que no es un punto (o una colección de puntos). Si no es un punto, lanzar una advertencia al usuario, pero aún permitirle usar la herramienta. Según entiendo, puedes verificar el tipo de forma utilizando la clase Describe(). Sin embargo, cuando intento pasar mi parámetro a Describe (para devolver un objeto Describe), ArcMap lanza un error:

enter image description here

Así es como defino el parámetro en el que me estoy enfocando:

def getParameterInfo(self):
    """Definir definiciones de parámetros"""

    # Primer parámetro = capa con características personalizadas
    param0 = arcpy.Parameter(
        displayName = "Capa de origen con características personalizadas",
        name = "origen",
        datatype = "GPFeatureLayer",
        parameterType = "Requerido",
        direction = "Entrada")

Y esperaba lanzar la advertencia en el método updateParameters():

def updateParameters(self, parameters):
    if parameters[2].value == True:
        parameters[3].enabled = True
        parameters[4].enabled = True
        parameters[5].enabled = True

    else:       
        parameters[3].enabled = False
        parameters[4].enabled = False
        parameters[5].enabled = False       

    describe = arcpy.Describe(parameters[0])
    if describe.shapeType == 'Point':
        arcpy.AddWarning('Advertencia: Este es un shapefile de puntos')

¿Alguna idea de por qué estoy recibiendo este error?

¿Estoy usando el tipo de datos correcto?

He intentado usar otros tipos de datos para este parámetro, como DEFeatureClass, GPPoint y DEShapefile, pero recibí el siguiente error si intentaba agregar mi shapefile como mi parámetro:

enter image description here

El error fue el mismo independientemente de cuál de los tres utilizara.


Se ha aclarado mi problema con la clase Describe() al agregar la extensión .value en mi método updateParameters():

def updateParameters(self, parameters):
    describe = arcpy.Describe(parameters[0].value)

Sin embargo, ahora cuando intento usar la función setWarningMessage(), no recibo ninguna respuesta de ArcMap. Mi updateParameters() consta de lo siguiente:

def updateParameters(self, parameters):
    describe = arcpy.Describe(parameters[0].value)
    #check = str(describe.shapeType)
    if describe.shapeType == 'Point':
        parameters[0].setWarningMessage('Esta es una clase de entidad de punto')
    else:
        parameters[0].clearMessage()    

    if parameters[2].value == True:
        parameters[3].enabled = True
        parameters[4].enabled = True
        parameters[5].enabled = True

    else:       
        parameters[3].enabled = False
        parameters[4].enabled = False
        parameters[5].enabled = False       

    return

Cuando agrego un shapefile que sé que de hecho es un punto, la herramienta no emite una advertencia. Simplemente lo acepta sin ningún comentario al usuario.

¿Importa si la función Describe.shapeType tiene una salida de Unicode?

Probé esto a través de la ventana de Python de ArcMap con la siguiente secuencia de comandos:

enter image description here

Sin embargo, incluso si intento convertir el Describe.shapeType a una cadena, aún no recibo un mensaje de advertencia. He hecho las siguientes pruebas:

  1. En lugar de verificar si describe.shapeType == 'Point', intenté verificar si describe.shapeType == u'Point', lo que lo obligaría a verificar un tipo de datos Unicode.
  2. Convertir el shapeType en una cadena a través de str(describe.shapeType).
  3. Usar el método encode para cambiar el Unicode en una secuencia de caracteres ASCII: describe.shapeType.encode('ascii', 'ignore').

Por lo tanto, he vuelto a llegar a un callejón sin salida.

2 votos

No creo que uses AddWarning() allí. Probablemente debas usar setErrorMessage() - echa un vistazo a este enlace: resources.arcgis.com/en/help/main/10.1/index.html#/…

0 votos

Con respecto a la confusión sobre los tipos de datos de parámetros.. ¿Desde dónde estás arrastrando y soltando el shapefile? Si tu Tipo de dato es DEShapefile, arrastrar y soltar el shapefile desde ArcCatalog o navegar hasta él debería funcionar definitivamente. Si has agregado un shapefile a ArcMap y lo estás arrastrando y soltando desde la TOC de ArcMap - eso no funcionará. Ahora es una capa de entidad y requeriría que el Tipo de dato GPFeatureLayer sea aceptado como parámetro.

0 votos

Simplemente estoy arrastrando y soltando los shapefiles desde el Explorador de Windows directamente en la TOC de ArcMap. ¿Importa si arrastro y suelto a través del Explorador de Windows o ArcCatalog? ¿Se convertirá igualmente el shapefile en una capa de entidades una vez que esté en la TOC?

6voto

steveax Puntos 316

Creo que puede ser tan simple como cambiar esta línea:

describe = arcpy.Describe(parameters[0].value)

o tal vez

describe = arcpy.Describe(parameters[0].valueAsText)

0 votos

Sí, a menudo olvido agregar '.value'

0 votos

Igual aquí, aunque nunca lo he hecho en un archivo .pyt, solo en herramientas de script normales. Sin embargo, supongo que se comporta de la misma manera.

0 votos

¡Muy buen punto! Tengo esto en otras áreas de mi código y no lo había considerado. ¡Gracias!

3voto

Jon M Puntos 206

En su comentario, @ian tiene razón acerca de AddWarning() siendo inútil fuera del método execute() de una herramienta. Creo que el método que quieres usar es setWarningMessage(). Intenta esto:

describe = arcpy.Describe(parameters[0].value)
if describe.shapeType in ('Point', 'Multipoint'):  # atrapa punto y multipunto
    parameters[0].setWarningMessage('Este es una clase de entidad de punto')
else:
    parameters[0].clearMessage()

0 votos

Tú y @ian, ambos tienen razón sobre la función setWarningMessage(). Sin embargo, parece que ahora estoy teniendo problemas para que esta parte funcione. . . Actualizaré mi pregunta con mi último código y una captura de pantalla. ¡Agradezco su ayuda!

0 votos

¿Está funcionando como se espera la activación/desactivación de parámetros?

0 votos

Sí lo es. Incluso intenté cambiar el orden del código para que la habilitación ocurriera antes del mensaje de advertencia, pero no tuvo ningún impacto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X