18 votos

Hay ArcPy herramienta para el polígono de cambio de tamaño como herramienta Escala de Avanzadas herramientas de Edición en ArcMap?

Estoy escribiendo una secuencia de comandos de python para ArcGIS 10.3. Yo sé acerca de la Scale tool en la interfaz de ArcGIS pero no puedo encontrar arcpy comando. Existe?

Como se puede ver en la imagen de la Scale tool obras diferentes de Buffer tool - cambia la forma de polígono original. Así que la pregunta es:

Puedo usar Scale tool (disponible desde la interfaz de ArcGIS) el uso de arcpy?

enter image description here

31voto

David Holm Puntos 6165

No soy consciente de nada en la arcpy API que va a hacer el escalado para usted, pero escribir una función para hacerlo sería relativamente simple.

El código se muestra a continuación, la escala para las características 2D, y no toma en cuenta el M o Z valores:

import arcpy
import math

def scale_geom(geom, scale, reference=None):
    """Returns geom scaled to scale %"""
    if geom is None: return None
    if reference is None:
        # we'll use the centroid if no reference point is given
        reference = geom.centroid

    refgeom = arcpy.PointGeometry(reference)
    newparts = []
    for pind in range(geom.partCount):
        part = geom.getPart(pind)
        newpart = []
        for ptind in range(part.count):
            apnt = part.getObject(ptind)
            if apnt is None:
                # polygon boundaries and holes are all returned in the same part.
                # A null point separates each ring, so just pass it on to
                # preserve the holes.
                newpart.append(apnt)
                continue
            bdist = refgeom.distanceTo(apnt)

            bpnt = arcpy.Point(reference.X + bdist, reference.Y)
            adist = refgeom.distanceTo(bpnt)
            cdist = arcpy.PointGeometry(apnt).distanceTo(bpnt)

            # Law of Cosines, angle of C given lengths of a, b and c
            angle = math.acos((adist**2 + bdist**2 - cdist**2) / (2 * adist * bdist))

            scaledist = bdist * scale

            # If the point is below the reference point then our angle
            # is actually negative
            if apnt.Y < reference.Y: angle = angle * -1

            # Create a new point that is scaledist from the origin 
            # along the x axis. Rotate that point the same amount 
            # as the original then translate it to the reference point
            scalex = scaledist * math.cos(angle) + reference.X
            scaley = scaledist * math.sin(angle) + reference.Y

            newpart.append(arcpy.Point(scalex, scaley))
        newparts.append(newpart)

    return arcpy.Geometry(geom.type, arcpy.Array(newparts), geom.spatialReference)

Usted puede llamar con una geometría del objeto, un factor de escala (1 = mismo tamaño, 0.5 = la mitad de tamaño, 5 = 5 veces mayor, etc.), y una opcional de punto de referencia:

scale_geom(some_geom, 1.5)

El uso de este junto con los cursores a escala de toda una clase de entidad, asumiendo que la clase de entidad de destino ya existe:

incur = arcpy.da.SearchCursor('some_folder/a_fgdb.gdb/orig_fc', ['OID@','SHAPE@'])
outcur = arcpy.da.InsertCursor('some_folder/a_fgdb.gdb/dest_fc', ['SHAPE@'])

for row in incur:
    # Scale each feature by 0.5 and insert into dest_fc
    outcur.insertRow([scale_geom(row[1], 0.5)])
del incur
del outcur

edit: he aquí un ejemplo utilizando una aproximación de la prueba de la geometría, el 0,5 y 5 veces: enter image description here

También se probó con multi-anillo de polígonos (agujeros)! 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