7 votos

¿Comprensión * significado de coordenadas cuando se utiliza con ArcPy?

¿Qué * coords en la siguiente media código?

import arcpy


feature_info = [[[1, 2], [2, 4], [3, 7]],
                [[6, 8], [5, 7], [7, 2], [9, 5]]]


features = []

for feature in feature_info:
     Create a Polyline object based on the array of points
     Append to the list of Polyline objects
     features.append(
         arcpy.Polyline(
             arcpy.Array([arcpy.Point(*coords) for coords in feature])))


arcpy.CopyFeatures_management(features, "c:/geometry/polylines.shp")

14voto

Anton8000 Puntos 165

Ver listas de discusión Desembalaje. Entrada para el punto objeto es por ejemplo X coordenada y coordenada como dobles:

point = arcpy.Point(1, 2)

En tu ejemplo coords será una lista, como [1, 2] . Esto es desempaquetado con * en 1, 2

6voto

Alex Tereshenkov Puntos 13433

El * símbolo indica tupla desembalaje. Esto puede ser muy útil especialmente cuando usted tiene que llamar a la misma función muchas veces con argumentos diferentes para obtener diferentes partes del objeto devuelto, pero esto se traduce en código repetitivo.

Descripción

Python tiene una poderosa técnica llamada tupla desembalaje donde la tupla de valores de desembalar en los nombres de variable.

(fc_name,fc_type,sr) = ("Roads", "Polyline", 3006)
print(fc_name)
print(fc_type)
print(sr)

Roads
Polyline
3006

Esto puede ser útil cuando la recuperación de las largas secuencias con valores tales como filas de una tabla de base de datos y que necesita para obtener sólo los campos específicos:

row = (2467, 998, 6, 0, u'dirt', u'SSteadman', 20021205, u'Beaver', 
       (331841.0650, 4129735.250))

ID,road_surface,rest = row[0],row[4],row[5:]
print "ID:",ID
print "Road surface:",road_surface
print "Garbage:",rest

ID: 2467
Road surface: dirt
Garbage: (u'SSteadman', 20021205, u'Beaver', (331841.065, 4129735.25))

Python puro ejemplo de tupla desembalaje

Antes de entrar en arcpy funciones y tupla desembalaje, vamos a ir a través de un sencillo ejemplo. Vamos a crear una función que va a dejar de hacer algunas operaciones aritméticas en la demanda:

def do_calc(x, y, operation):
    if operation == "+":
        return x + y
    if operation == "-":
        return x - y

print do_calc(x=3, y=4, operation='+')
print do_calc(x=3, y=4, operation='-')

7
-1

Los argumentos son almacenados en una tupla:

input_args = (5, 8, '+')
#instead of accessing individual items within a tuple and matching the arguments order
print do_calc(x=input_args[0],y=input_args[1],operation=input_args[2])
#unpacking tuple, so every item in the tuple gets assigned to an input argument in order
print do_calc(*input_args)

Tupla de descompresión de arcpy operaciones

Aquí hay otro ejemplo de desembalaje de una secuencia dentro de los argumentos a la hora de construir arcpy.Point objetos de una lista de coordenadas:

import arcpy

coords_pairs = [[14.45, 25.65, 567], 
                [24.23, 46.56, 580], 
                [34.89, 74.23, 593]]

#input data for Point ({X}, {Y}, {Z})
#instead of [arcpy.Point(c[0],c[1],c[2]) for c in coords_pairs] 
points = [arcpy.Point(*coords) for coords in coords_pairs] 
print(points)

[<Point (14.45, 25.65, 567.0, #)>,
 <Point (24.23, 46.56, 580.0, #)>,
 <Point (34.89, 74.23, 593.0, #)>]

El uso avanzado de la tupla de descompresión de arcpy

Desembalaje de tuplas puede ser una técnica muy eficaz cuando se trabaja con funciones que pueden aceptar iterables de longitud arbitraria. Vamos a crear un flujo de trabajo que nos permitirá añadir varios campos en una clase de entidad sin escribir arcpy.AddField_management() línea para cada campo.

import arcpy
input_fc = 'cities'

#(name,type,{precision},{scale},{length},{alias},{is_nullable},{is_required},{domain})
fields = [("ref_ID","LONG",9,"","","refcode","NULLABLE","NON_REQUIRED"),
          ("DataSet_ID","LONG",5,"","","datacode","NULLABLE","NON_REQUIRED"),
          ("Recomment","TEXT","","","35","recordcomment","NULLABLE","NON_REQUIRED")]

#adding each field in the list unpacking the tuple
for field_tuple in fields:
    arcpy.AddField_management(*(input_fc,) + field_tuple)

Hay otro post en el SIG.SE muestra el uso de la tupla desembalaje para añadir campos, útil revisar.

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