5 votos

If Then Else en el model builder de ArcGIS

Tengo un modelo que itera a través de las clases de características en una geodatabase. Para cada clase de característica, ejecuta la herramienta de comprobación de la geometría. Luego utilizo la herramienta "Get Count" para contar el número de filas en la tabla de salida. A continuación, quiero añadir una expresión en la que si el número de filas es mayor que 0 debe seguir ejecutando el resto del modelo, de lo contrario debe pasar a la siguiente clase de características.

He pensado que esto se puede conseguir utilizando la herramienta Calcular Valor con el siguiente código.

Expresión

CountMe(%Row Count%)

Bloque de códigos

 def CountMe(n):
     import arcpy
     if n > 0:
      return "true"
     else:
      return "false"

Donde %Row Count% es la salida de la herramienta "Get Count".

Esto devuelve valores Verdaderos y Falsos, y tengo la salida de este conjunto como una condición previa a los siguientes pasos en el modelo.

Sin embargo, asumí que sólo los datos "verdaderos" pasarían, pero todos los datos parecen pasar, es decir, el modelo empujará a través de una tabla vacía desde la herramienta Comprobar Geometría hasta el final.

He leído en Internet y creo que utilizar la herramienta de cálculo del valor es la forma incorrecta de hacerlo. ¿Estoy en lo cierto al asumir que lo que necesito es un python script que me dará 2 salidas (True y False) y luego puedo conectar el "True" como una condición previa al resto del modelo, y dejar el "False" desconectado, por lo que el modelo se detiene y el iterador pasa a la siguiente clase de características?

Si es así, ¿alguien podría ayudarme con esto?

Model structure

9voto

Örjan Jämte Puntos 3127

Si la condición previa que comprueba True o False está esperando un booleano, siempre evolucionará a verdadero porque las cadenas no vacías devuelven valores verdaderos, así:

>>> if "true":      print "Really True!"

Really True!
>>> if "false":     print "Really True!"

Really True!

¿Ha intentado devolver True o False (booleanos) en lugar de "true" o "false" (cuerdas)? Eso podría resolver el problema.

def CountMe(n):         
     if n > 0:
      return True
     else:
      return False

Lo siguiente también es equivalente a lo anterior:

def CountMe(n):         
    return True if n > 0 else False

Unas cuantas notas:

Importar arcpy (que parece innecesario) puede ralentizar drásticamente tu código. Si tienes 1000 filas, es muy posible que aumentes el tiempo de ejecución en más de 15 minutos.

enter image description here

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