4 votos

Añadir capa de características para mostrar con en una herramienta de script para la cartografía de escritorio 'App'

El objetivo de esta pregunta es encontrar una forma de cambiar programáticamente la extensión del mapa basándose en la entrada del usuario. ¡Mi método implica la creación de una capa de características y selección, pero si usted tiene otra solución (diferente) que da el resultado deseado, me encantaría oírlo!

Ahora que me siento cómodo con arcpy y me he familiarizado con el módulo de mapeo he visto un nicho. Puedo escribir aplicaciones de mapeo de escritorio de principio a fin para realizar una tarea específica. Esto permite a cualquier persona en nuestra oficina para ejecutar la "aplicación" sin necesidad de varios años de uso de ArcMap para llevar a cabo una tarea repetible para un área diferente de interés (es decir, código postal, impuestos parcela, condado, etc.)

He escrito algunos de estos scripts y asociado cada uno de ellos con su propio MXD para dar al usuario una GUI. Cuando se introduce algún tipo de valor de atributo (número de cuenca hidrográfica, número de parcela, condado, etc.) el script crea una capa de características de ese polígono y utiliza la función zoom al elemento seleccionado para cambiar la extensión.

El problema que estoy teniendo una vez que he terminado de depurar la 'app' a través de la Ventana Python de ArcMap creo un herramienta de script que ofrece al usuario un cuadro de entrada para introducir los argumentos necesarios para que se ejecute el programa.

Por alguna razón, ArcMap utiliza por defecto NO añadiendo la capa de características al mapa cuando llega a la línea de código donde se crea. Por lo tanto, mi script no puede utilizar el método de zoom a la característica seleccionada para cambiar la extensión. El resto de la secuencia de comandos se ejecuta sin problemas, pero la extensión del zoom sigue siendo a nivel estatal en lugar de a nivel de subcuenca.

Extracto del código:

try: # Clip wetlands layer to extent of user dictated parcel, calculate staticstics
    newWetland = outWetlands + "HUC_" + userHucID # variable that stores clipped wetland output location & name
    arcpy.MakeFeatureLayer_management(sheds, "currentShed", clipClause) # Create feature layer of HUC (from user input)
    arcpy.SelectLayerByAttribute_management("currentShed", "NEW_SELECTION", clipClause) # Select current HUC
    df.zoomToSelectedFeatures() # Zoom to extent of selected HUC
    arcpy.RefreshActiveView()   # Refresh view of mxd before exporting to PNG

    arcpy.Clip_analysis(wetlands, "currentShed", newWetland) # Clip dissolved wetlands layer to current HUC
    arcpy.ApplySymbologyFromLayer_management(newWetland, layers + "WetlandSymbology.lyr") # Apply wetlands symbology
    print "Finished creating wetland file for HUC #: " + userHucID + "."
except:
    print arcpy.GetMessages()
finally: # delete the feature layer if it exists if an error is present or not
    if arcpy.Exists("currentShed"):
        arcpy.Delete_management("currentShed")

Script ejecutado en la ventana Python de ArcMap: Script run correctly in Python window El MISMO script se ejecuta como Script-tool en la caja de herramientas personalizada: Same script run through Script tool in ArcMap Ventana Propiedades de la herramienta Script: Esto me lo sugirió un representante de ESRI: añadir una capa de características como parámetro de salida derivado y, a continuación, utilizar SetParameter(index, featureLayer) para añadir la capa deseada a la pantalla.

El parámetro es derivado (no es dado por el usuario, sino que es derivado por una de las entradas del usuario), y puesto a la salida en un intento de añadirlo al mapa.

enter image description here

Arreglos intentados:

  • Barra de herramientas de ArcMap -> Geoprocesamiento -> Opciones de geoprocesamiento -> 'Añadir resultados de operaciones de geoprocesamiento a la pantalla'
  • Añadir Feature Layer parámetro de salida en las propiedades de la herramienta de script emparejado con arcpy.SetParameterAsText método
  • arcpy.mapping.AddLayer(df, layerPath)
  • df.extent = layer.getExtent()

4voto

Zohar Ko Puntos 1205

Permítanme parafrasear el problema para ver si lo entiendo - ArcPy.Mapping.AddLayer() añadirá una capa al marco de datos si el script se ejecuta desde la ventana de python, pero no si se ejecuta desde una herramienta de script? Si eso es correcto, traté de reproducir su problema de la siguiente manera:

He creado una herramienta de script que toma un solo arg, un 'alias de capa' como 'condados'. El script utiliza ese alias para obtener una ruta a un shapefile, y lo añade como una capa al documento actual:

# get parameters
layer_alias = arcpy.GetParameterAsText(0)
layer_path = ""

if layer_alias == "counties":
    layer_path = "C:/pathto/data/" + layer_alias + ".shp" #"C:/pathto/data/counties.shp"

# do work
mxd = arcpy.mapping.MapDocument("CURRENT")
dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0] 
addLayer = arcpy.mapping.Layer(layer_path)
arcpy.mapping.AddLayer(dataFrame, addLayer)

Y esto funciona. ¿Estoy haciendo algo diferente a ti?

1voto

daGrevis Puntos 121

Parece que puedes usar arcpy.mapping.AddLayer(dataFrame, addLayer), como describe MC5, ¿pero no quieres que algo persista en el disco? ¿Sería un problema si creas una geodatabase que tu script limpia al inicio del script y la repobla con el resultado cada vez que el script se ejecuta?

0voto

dchanson Puntos 29

Roy, una pregunta para ti. ¿Estos scripts de Python (arcpy) se ejecutan desde dentro de la sesión de ArcMap o desde fuera? Si fuera - puede utilizar arcpy.mapping.AddLayer.

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