Processing math: 100%

16 votos

¿Cómo es la gente usando Python estructuras de datos y clases en ArcPy?

Esta pregunta puede exponer mi ignorancia en la programación, pero tengo curiosidad acerca de cómo la gente está utilizando diferentes python estructuras de datos dentro de ArcPy.

Esta página enumera las estructuras de datos en Python. Entiendo lo de las listas puede ser implementado en SIG (lista de clases de entidad, la lista de tipos de entidad, lista de tramas de datos, etc). Entiendo cómo los juegos pueden ser utilizados como bien (para eliminar los duplicados). ¿Cómo es la gente la implementación de tuplas, diccionarios y otras estructuras de datos dentro de ArcPy? También, existen otros ejemplos de listas y conjuntos que no he enumerado?

Además, sin duda, las personas son la creación de clases personalizadas en ArcPy. Bajo qué circunstancias y situaciones que requieren de estos? ¿Puede dar ejemplos? Es cualquiera la creación personalizada de las clases que heredan de la incorporada en el arcpy clases?

Yo no requieren respuestas a todas estas preguntas, yo sólo soy curioso cómo la gente está usando Python en SIG y lo flujos de trabajo requieren estas personalizaciones.

14voto

auramo Puntos 161

Muchos de arcpy funciones que toman múltiples entradas aceptan Python lista de objetos.

Por ejemplo, el Dissolve_management función acepta una lista de nombres de campo para disolver en:

arcpy.Dissolve_management("taxlots", "C:/output/output.gdb/taxlots_dissolved",
    ["LANDUSE", "TAXCODE"], "", "SINGLE_PART", "DISSOLVE_LINES")

Una tupla puede ser utilizado en lugar de una lista cuando usted no necesita modificar el orden o el número de elementos, como las tuplas son inmutables. Son útiles como estructura de datos para heterogéneos, pero relacionados con las piezas de datos, tales como los elementos de una marca de tiempo o las coordenadas de un punto. Usted verá a menudo las listas de tuplas, donde una tupla sirve como un tipo de registro diferente con un número fijo de atributos, mientras que la lista podría fácilmente cambiar de tamaño, de ser re-ordenado (clasificado), etc. Ver a esta pregunta de StackOverflow para más información sobre los usos de las listas vs tuplas.

Un diccionario puede ser utilizado como una búsqueda rápida de la tabla de caché de un relativamente pequeño, pero con frecuencia se utiliza un conjunto de pares clave-valor en la memoria. Vi un interesante ejemplo de esto en el ArcGIS foros: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dictionaries

El uso de un diccionario en lugar de una combinación aceleró su cálculo de 3.5 horas a 15 minutos.

Un simple ejemplo puede ser si usted tiene un millón de registros de direcciones con un atributo con el abreviado nombre de estado de certificados (CA), pero para fines de visualización que desea escribir el nombre propio (California), podría usar este diccionario como una tabla de búsqueda para rellenar un estado pleno campo nombre.

No he encontrado la necesidad de escribir una clase en Python para su uso en arcpy a mí mismo, pero eso no quiere decir que no hay un caso de uso. Una clase puede ser útil cuando usted tiene un conjunto de cerca las funciones relacionadas con la (comportamientos) que operan en algunas de entrada (datos), y desea ser capaz de utilizar los datos y comportamientos orientados a objetos, pero es más probable que va a ser la lógica empresarial específica y no está relacionado con arcpy.

7voto

Craig Puntos 1013

Blah238 cubre este tema, así que me limitaré a añadir un par de ejemplos de mi propio trabajo. I desarrollar una gran cantidad de datos de aeropuerto, y una de las cosas que tengo que hacer regularmente se lee en orden a lo largo de los encuestados, que la línea central de la pista de los puntos de la pista de aterrizaje. Se podría pensar que estos puntos serían en orden (en la base de datos GIS) ya, pero rara vez lo son. La línea central de los puntos de ocurrir cada 10 pies a lo largo de la línea central y se encuentra flanqueado por dos filas de la encuesta de puntos espaciados a 10 pies de distancia. Usted obtiene la imagen: una gran cantidad de puntos ... y por lo general todos mezclados juntos base de datos sabio. Con lo que estoy haciendo en mis scripts, generalmente es más fácil para seleccionar sólo fuera de la línea central de los puntos de atributos (o espacialmente, si es necesario), leer las coordenadas de cada uno, y el volcado de los resultados en una lista de Python. Puedo, a continuación, ordenar, pop, invertir, etc. la lista, sin embargo necesito, y es rápido.

Asimismo, el uso de diccionarios de Python mucho (probablemente mucho más de lo que algunos aprobaría). Tengo que crear conjuntos de 3D vectores unitarios para cada extremo de pista en un aeropuerto, y puedo acceder a estos constantemente dentro de un guión y hacer esto en muchos de mis guiones. Guardo muchos otros conjuntos de regularmente los datos de acceso en los diccionarios, también. Como las listas, que son rápidos y flexibles. Muy recomendable.

Tan lejos como clases, como Blah238, no he encontrado la necesidad de crear ninguna. Probablemente hay pocos casos en los que una clase sería la opción preferida en mis scripts, pero realmente no he sido capaz de identificar a aquellos lugares. Alguien con más experiencia en programación probablemente encontrará de forma rápida.

5voto

Arda Xi Puntos 1099

Yo también amo los diccionarios de uso 'em todo el tiempo. Este método presenta algunas propiedades de referencia espacial y la almacena en un diccionario:

def get_coord_sys(self, in_dataset):
    """Get and return info on dataset coord sys/projection"""
    spatial_ref = arcpy.Describe(in_dataset).spatialReference
    # Get spatial ref props and put in dictionary
    spat_ref_dict = {}
    spat_ref_dict["name"] = spatial_ref.name
    spat_ref_dict["type"] = spatial_ref.type
    spat_ref_dict["gcs_code"] = spatial_ref.GCSCode
    spat_ref_dict["gcs_name"] = spatial_ref.GCSName
    spat_ref_dict["pcs_code"] = spatial_ref.PCSCode
    spat_ref_dict["pcs_name"] = spatial_ref.PCSName
    return spat_ref_dict

Este método fragmento de extractos de geometrías a partir de dos featureclasses, me, a continuación, utilizar las geometrías más tarde para hacer algo de trigonometría:

def build_fields_of_view(self):
        """For all KOPs in a study area, build left, right, center FoV triangles"""
        try:    
            fcs = {os.path.join(self.gdb, "WindFarmArray"):[], os.path.join(self.gdb, "KOPs"):[]}
            # Build a dict of WTG and KOP array geometries, looks like:
            #  {'KOPs': [[1, -10049.2697098718, 10856.699451165374], 
            #            [2, 6690.4377855260946, 15602.12386816188]], 
            #   'WindFarmArray': [[1, 5834.9321158060666, 7909.3822339441513], 
            #                     [2, 6111.1759513214511, 7316.9684107396561]]}
            for k, v in fcs.iteritems():
                rows = arcpy.SearchCursor(k, "", self.sr)
                for row in rows:
                    geom = row.shape
                    point = geom.getPart()
                    id = row.getValue("OBJECTID")
                    v.append([id, point.X, point.Y])   

            kops = fcs[os.path.join(self.gdb, "KOPs")] # KOP array
            wtgs = fcs[os.path.join(self.gdb, "WindFarmArray")] # WTG array

MUCHO de lo que actualmente estoy trabajando en consiste en la extracción de las coordenadas y atributos de vector featureclasses y los rásteres de modo que los datos pueden ser empujados en otra pieza de software que aún no sabe lo que SIG de los datos. Así, puedo utilizar listas y dicts mucho para esto.

2voto

geni Puntos 91

Leer esto mientras armar una respuesta y tuve que hacer algunas modificaciones..

Yo no soy experto en Python pero creo que la idea detrás de la utilización de clases es que se puede crear una instancia de un objeto que tiene un montón de métodos listo para ir a las cuales se refieren a la estructura de datos así como la centralización de sus métodos. También hay algunos ámbito de la variable beneficios con las clases vs módulos, el enlace de arriba llegue a este punto un poco.

Tengo una clase llamada featureLayer (probablemente no python-ly llamado...todavía aprendizaje). Que puedo hacer

sys.path.append(r"\\Path\To\Scripts")
import gpFuncs as gpF
fc = arcpy.GetParameterAsText(0)
featureLayer = gpF.featureLayer(fc)
points = featureLayer.featureVerticesToPoints(featureid, "", first_and_last)

La definición de hacerlo, es un método de clase que sólo repite las características, partes y vértices. Entonces puedo convertir mis puntos de objeto en un featureLayer instancia y hacer otras cosas que mi clase.

Creo que si se construye correctamente las clases deben incapuslate funcionalidad. Por ejemplo, pronto voy a empezar a refactorización así que tengo un featureLayer clase que tiene los métodos y atributos que cuentan con todas las capas tienen. Luego heredar de ella para construir una featureLayerStrict instancia de la clase que heredará todos featureLayers atributos/métodos, pero creará una instancia con un determinado tipo de geometría como polígono.

0voto

John Kramlich Puntos 286

Yo trabajo principalmente en VB .la red, pero encuentro a mí mismo usando python y arcpy más y más. En VB me gusta y tratar de uso de las Enumeraciones como se hace la lectura de el código más claro. Las versiones anteriores de python no implementar las Enumeraciones para un hack fue crear una Clase exponiendo algunas de sus propiedades, un montón de ejemplos que se discuten en Stack Overflow. Ahora parece que la última versión de python que implementa estas que se discute aquí.

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