1 votos

Mantener la referencia a la capa de características (en lugar de su cadena de nombre) a lo largo de Python script?

Al crear una capa en arcpy, la sintaxis utiliza una cadena para denotar el nombre de la capa, como se muestra en el Hacer capa de características muestra script:

import arcpy

arcpy.env.workspace = "C:\Program Files (x86)\ArcGIS\Desktop10.2\TemplateData\TemplateData.gdb"
arcpy.MakeFeatureLayer_management("city", "citiesLyr")

print(type("citiesLyr")) # => string

En lo que respecta a Python, "citiesLyr" es sólo una cadena (¿verdad?). ¿Puedo, en cambio, definir la capa de características como una variable?

Esto es un intento de simplificar un escenario más complicado. Estoy tratando de utilizar la capa de características en un script que implica multiprocesamiento, bucles y funciones, y me encuentro con que la referencia a la capa se está perdiendo, y todo lo que me queda es una cadena llamada "citiesLyr". ¿Cómo puedo mantener la referencia a la capa de características a lo largo de mi script?

El ejemplo de abajo no hace nada - el punto es probar cómo obtener acceso a la capa de características desde dentro de la función, que ha sido llamada dentro del entorno de multiprocesamiento:

import multiprocessing, arcpy

def doCity(lyr):
    #How to get access to the cities layer from this function?
    print(lyr)
    desc = arcpy.Describe(lyr) # <= this fails because the layer is just a string
    print(desc.SpatialReference)

if __name__ == '__main__':

    #Create a feature layer from the cities
    arcpy.MakeFeatureLayer_management("C:\Program Files (x86)\ArcGIS\Desktop10.2\TemplateData\TemplateData.gdb\city", "citiesLyr")

    #Create a list, so we can use the multiprocessing function
    citiesList = []
    for i in range(0,5):
        citiesList.append("citiesLyr")

    # Create a pool class and run the jobs
    pool = multiprocessing.Pool()
    pool.map(doCity, citiesList)

    # Synchronize the main process with the job processes to ensure proper cleanup.
    pool.close()
    pool.join()

(La lista de ciudades tampoco tiene sentido, sólo está ahí para utilizar el multiprocesamiento)

2voto

UnkwnTech Puntos 21942

Creo que el punto de bloqueo que está encontrando actualmente puede ser ilustrado en este corto trozo de código:

import arcpy

def doCity(lyr):
    print(lyr.name)

if __name__ == '__main__':

    arcpy.MakeFeatureLayer_management("C:\Program Files (x86)\ArcGIS\Desktop10.2\TemplateData\TemplateData.gdb\city", "citiesLyr")
    citiesLyrObject = arcpy.mapping.Layer("citiesLyr")

    doCity(citiesLyrObject)

Verá que lo que estoy pasando a la función doCity es ahora un objeto de capa en lugar de una cadena de nombre de capa.

Encontré cómo hacerlo en una respuesta a ¿Se puede pasar el objeto MakeFeatureLayer al parámetro de capa de la función ExportReport? .

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