3 votos

Uso de Replace Geometry para reemplazar la característica seleccionada por un círculo en ArcGIS Desktop?

Tengo un shapefile de polígonos y quiero sustituir cada polígono irregular por un círculo.

Creo que puedo hacerlo con la herramienta Reemplazar geometría. Pero una vez seleccionada la herramienta Reemplazar geometría, se entra inmediatamente en el modo dibujar un polígono. Si selecciono la herramienta círculo en la ventana de herramientas Dibujar, la herramienta Reemplazar geometría queda inactiva.

¿Hay alguna forma de utilizar la herramienta Reemplazar geometría para dibujar un polígono circular?

4voto

FelixIP Puntos 4035

El siguiente script utiliza la siguiente convención de nomenclatura de capas en la tabla de contenido:

  1. "Objetivo" - capa de características con geometrías que deben sustituirse
  2. "chuletas" - capa de características con geometrías correctas

Funciona por selección, es decir, 1 característica seleccionada en cada capa.

import arcpy, traceback, os, sys

try:
    def showPyMessage():
        arcpy.AddMessage(str(time.ctime()) + " - " + message)
    def CheckBothLayers(infc,infc2):
        d=arcpy.Describe(infc); theType1=d.shapeType
        d=arcpy.Describe(infc2); theType2=d.shapeType

        if theType1!=theType2:
            arcpy.AddWarning("\nTool designed to work with same geometries!")
            raise NameError, "Wrong input\n"
        return d
    mxd = arcpy.mapping.MapDocument("CURRENT")
    layers = arcpy.mapping.ListLayers(mxd)

    destLR, sourceLR="chops","target"
    destLR = arcpy.mapping.ListLayers(mxd,destLR)[0]
    sourceLR = arcpy.mapping.ListLayers(mxd,sourceLR)[0]
    a = CheckBothLayers(destLR,sourceLR)
    g=arcpy.Geometry()
    geometryList=arcpy.CopyFeatures_management(destLR,g)
    nLines=len(geometryList)
    if nLines!=1:
        arcpy.AddWarning("\nSelect only 1 feature!")
        raise NameError, "Wrong input\n"
    line=geometryList[0]

    tbl=arcpy.da.TableToNumPyArray(sourceLR,"OID@")
    if len(tbl)!=1:
        arcpy.AddWarning("\nSelect only 1 feature!")
        raise NameError, "Wrong input\n"
    with arcpy.da.UpdateCursor(sourceLR, ("SHAPE@")) as rows:
        for row in rows:
            row[0]=line
            rows.updateRow(row)
    arcpy.SelectLayerByAttribute_management(destLR, "CLEAR_SELECTION")
    arcpy.SelectLayerByAttribute_management(sourceLR, "CLEAR_SELECTION")
    arcpy.RefreshActiveView()

except NameError, theMessage:
    arcpy.AddMessage (theMessage)    
except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()            

La mejor manera de utilizarlo - adjuntar a un botón en la barra de herramientas del Editor:

enter image description here

No olvides guardar las ediciones

1voto

Steve Puntos 11

No que yo pueda encontrar. He jugado un poco con él y tienes razón, las herramientas de creación/construcción de polígonos/características no parecen ser accesibles desde Reemplazar Geometría. Se me ocurren un par de alternativas.

  • Cree una nueva característica, dibujando su círculo de modo que completamente cubra completamente el polígono que desea reemplazar. elija el polígono original como fuente del atributo.
  • Igual que la primera opción, pero con un círculo dentro del polígono. Con el círculo seleccionado, elija Edición > Recortar, y recortará el polígono al tamaño/forma del círculo. al tamaño/forma del círculo (tenga en cuenta que esto recortará todos capas y formas visibles/editables con el polígono seleccionado, por lo que si tiene superposiciones u otras capas activadas no funcionará). Puede eliminar la plantilla circular, ya que la forma original habrá sido la forma original.
  • Dibuje uno o varios círculos nuevos donde desee y, a continuación, utilice la tecla Transferencia de atributos de la barra de herramientas Ajuste espacial para copiar el atributos del polígono original al nuevo círculo. Borre el polígono original.

Hay otras formas de hacerlo con la exportación, los centroides y las uniones, pero son procesos más complicados que los métodos anteriores. Podría haber métodos adicionales con secuencias de comandos para actualizar la geometría de un registro con una forma predefinida o reemplazarlo desde otro archivo (que también se podría hacer con una unión espacial si se crea una nueva capa de círculos sobre sus polys y luego usar eso para unir / transferir atributos a través de unión espacial con el método de intersección - de nuevo suponiendo que no se superponen).

Hay varias opciones disponibles, depende de cuántos tenga y de la frecuencia con la que lo haga.

0voto

Julie Puntos 36

FelixIP, gracias.

Usted proporciona una buena solución para resolver el problema con el script, he intentado escribir un script que ha logrado la funcionalidad que quiero lograr.

import arcpy,os.path as op,arcpy.mapping as arcmap

mxd=arcmap.MapDocument("CURRENT")
lyr=arcmap.ListLayers(mxd,"Target")[0]
workspace=op.dirname(lyr.dataSource)

result=arcpy.GetCount_management(lyr)
count=int(result.getOutput(0))

# Only run when two feature is selected
if count==2:
    desc=arcpy.Describe(lyr)
    OID=desc.OIDFieldName
    Shape=desc.ShapeFieldName
    fields=desc.fields

    fieldNames=[field.name for field in fields if field.name not in [desc.OIDFieldName,desc.ShapeFieldName]]

    with arcpy.da.Editor(workspace):
        rows=arcpy.UpdateCursor(lyr)
        fieldValues={}
        minFid=-1
        # Save old feature fields value
        for row in rows:
            FID=row.getValue(OID)
            if minFid==-1 or FID<minFid:
                for fieldName in fieldNames:
                    fieldValues[fieldName]=row.getValue(fieldName)
                minFid=FID

        rows=arcpy.UpdateCursor(lyr)
        for row in rows:
            # Delete old feature
            if row.getValue(OID)==minFid:
                rows.deleteRow(row)
            # Set old feature values to new feature
            else:
                for fieldName in fieldNames:
                    row.setValue(fieldName,fieldValues[fieldName])

    arcpy.RefreshActiveView()

else:
    arcpy.AddError("Please select two feature.")

del row,rows

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