¿Exportar clase de entidad a múltiples clases de entidad basadas en valores de campo usando ArcGIS Desktop?

Respuestas:

44

Puede usar la herramienta Dividir por atributos:

Divide un conjunto de datos de entrada por atributos únicos

Hay versiones disponibles para:

artwork21
fuente
en ArcCatalog 10.6, Split By Attributesgenera constantemente .dbftablas individuales , no clases de entidad individuales. Pero, en ArcGIS Desktop 10.6, la misma herramienta genera correctamente archivos de forma individuales . No entiendo por qué, y obtuve los mismos resultados al tratar de configurar el directorio de trabajo tanto en la carpeta como en la geodatabase.
maycca
22

Puede lograr esto con un modelo muy simple si tiene ArcGIS 10.0 o superior.

Cree un modelo con Feature Iterator donde el grupo por campo es el atributo que desea seleccionar y luego envíe el resultado a la herramienta de copia de características utilizando la sustitución en línea para garantizar un nombre de archivo único. El modelo se muestra a continuación:

Modelo para extraer por atributo

Hornbydd
fuente
16

No tengo acceso a ArcMap 10, solo 9.3, pero espero que no sea muy diferente a esto.

Puede crear una secuencia de comandos simple en Python, que verifique su campo de atributos en busca de diferentes valores, y luego, para cada uno de ellos, ejecute una operación SELECCIONAR en su Shapefile original.

Si no está familiarizado con las secuencias de comandos de Python, todo lo que necesita hacer es abrir su IDLE (la GUI de Python), crear un nuevo archivo y copiar el código a continuación. Después de adaptar el código para su my_shapefile, outputdir y my_attribute, debería funcionar.

# Script created to separate one shapefile in multiple ones by one specific
# attribute

# Example for a Inputfile called "my_shapefile" and a field called "my_attribute"
import arcgisscripting

# Starts Geoprocessing
gp = arcgisscripting.create(9.3)
gp.OverWriteOutput = 1

#Set Input Output variables
inputFile = u"C:\\GISTemp\\My_Shapefile.shp" #<-- CHANGE
outDir = u"C:\\GISTemp\\" #<-- CHANGE

# Reads My_shapefile for different values in the attribute
rows = gp.searchcursor(inputFile)
row = rows.next()
attribute_types = set([])

while row:
    attribute_types.add(row.my_attribute) #<-- CHANGE my_attribute to the name of your attribute
    row = rows.next()

# Output a Shapefile for each different attribute
for each_attribute in attribute_types:
    outSHP = outDir + each_attribute + u".shp"
    print outSHP
    gp.Select_analysis (inputFile, outSHP, "\"my_attribute\" = '" + each_attribute + "'") #<-- CHANGE my_attribute to the name of your attribute

del rows, row, attribute_types, gp

#END
Alexandre Neto
fuente
13

¿Vio la herramienta División de capa por atributos actualizada para ArcMap 10 aquí ? Si no funciona, puede usar Split (Análisis) para sus necesidades.

Dividir las entidades de entrada crea un subconjunto de múltiples clases de entidad de salida. Los valores únicos del campo dividido forman los nombres de las clases de entidad de salida. Estos se guardan en el espacio de trabajo de destino.

división

Código de ejemplo:

import arcpy
arcpy.env.workspace = "c:/data"
arcpy.Split_analysis("Habitat_Analysis.gdb/vegtype", "climate.shp", "Zone",
                     "C:/output/Output.gdb", "1 Meters")
Aragón
fuente
La herramienta de división integrada funciona muy bien para sus propósitos si crea un rectángulo de extensión del mismo tamaño que sus polígonos que desea dividir.
ccn
A menos que esté leyendo mal la pregunta, creo que está pidiendo un "Dividir por atributo" en lugar de un "Dividir por ubicación". Dividir (Análisis) proporciona la funcionalidad "Dividir por ubicación". El comentario de @ccn aquí ofrece una solución interesante que quizás podría editarse como una "aclaración" a esta respuesta.
PolyGeo
Me preocupa que la pregunta describa la Split By Attributefuncionalidad y su respuesta sea sobre todo Split [By Geometry].
PolyGeo
El enlace está roto
PolyGeo
9

Solía @ guión de AlexandreNeto y ser informado por ArcGIS 10.x usuarios. Principalmente ahora debe importar "arcpy" en lugar de "arcgisscripting":

# Script created to separate one shapefile in multiple ones by one specific
# attribute

# Example for a Inputfile called "my_shapefile" and a field called "my_attribute"
import arcpy

#Set Input Output variables
inputFile = u"D:\DXF-Export\my_shapefile.shp" #<-- CHANGE
outDir = u"D:\DXF-Export\\" #<-- CHANGE

# Reads My_shapefile for different values in the attribute
rows = arcpy.SearchCursor(inputFile)
row = rows.next()
attribute_types = set([])

while row:
    attribute_types.add(row.my_attribute) #<-- CHANGE my_attribute to the name of your attribute
    row = rows.next()

# Output a Shapefile for each different attribute
for each_attribute in attribute_types:
    outSHP = outDir + each_attribute + u".shp"
    print outSHP
    arcpy.Select_analysis (inputFile, outSHP, "\"my_attribute\" = '" + each_attribute + "'")     #<-- CHANGE my_attribute to the name of your attribute

del rows, row, attribute_types

#END
zehpunktbarron
fuente
6

Esta es una forma aún más fácil de hacer esto ... y se genera en un GDB.

http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html

descargué la herramienta de USGS, me tomó 3 minutos hacer lo que había estado intentando durante 1 hora.

David Ainley
fuente
¡Gracias por el enlace! Funciona como un encanto (¡y para la versión 10.2!)
WolverineTime
Probé esta herramienta recientemente, y no pasó nada cuando la ejecuté. Elegí mi función, seleccioné el campo para seleccionar funciones, seleccioné una ubicación de salida, presioné OK y no pasó nada. Simplemente no "iría" ... ¿Me estoy perdiendo algo? ¡Gracias!
rachel.passer
6

Sé que puedes usar un iterador en el generador de modelos, pero si prefieres usar Python aquí, es algo que se me ocurrió. Agregue el script a una caja de herramientas con los parámetros en orden como Input shpfile, campos (multivalor, obtenidos de input) y espacio de trabajo. Este script dividirá el archivo de forma en múltiples archivos de forma según los campos que seleccione y los enviará a la carpeta que elija.

import arcpy, re

arcpy.env.overwriteOutput = True

Input = arcpy.GetParameterAsText(0)  
Flds = "%s" % (arcpy.GetParameterAsText(1)) 
OutWorkspace = arcpy.GetParameterAsText(2) 


myre = re.compile(";")
FldsSplit = myre.split(Flds)

sort = "%s A" % (FldsSplit[0])
rows = arcpy.SearchCursor(Input, "", "", Flds, sort)

for row in rows:
    var = []
    for r in range(len(FldsSplit)):
        var.append(row.getValue(FldsSplit[r]))
    Query = ''
    Name = ''
    for x in range(len(var)):
        if x == 0:
            fildz = FldsSplit[x]
            Name = var[x] + "_"
            Query += (""" "%s" = '%s'""" % (fildz, var[x]))
        if x > 0:
            fildz = FldsSplit[x]
            Name += var[x] + "_"
            Query += (""" AND "%s" = '%s' """ % (fildz, var[x]))
    OutputShp = OutWorkspace + r"\%s.shp" % (Name)
    arcpy.Select_analysis(Input, OutputShp, Query)
Isaac
fuente
4

Finalmente lo conseguí trabajando con SearchCursor y Select_analysis

arcpy.env.workspace = strInPath
# create a set to hold the attributes
attributes=set([])
# ---- create a list of feature classes in the current workspace ----
listOfFeatures = arcpy.SearchCursor(strInPath,"","",strFieldName,"")
for row in listOfFeatures:
    attributes.add(row.getValue(strFieldName))
    count=1
try:
    for row in attributes:
        stroOutputClass = strBaseName + "_" +str(count)# (str(row.getValue(strFieldName))).replace('/','_')
        strOutputFeatureClass = os.path.join(strOutGDBPath, stroOutputClass)
        arcpy.Select_analysis(strInPath,strOutputFeatureClass,strQueryExp)#"["+strFieldName+"]"+"='"+row+"'")
        count=count+1
    del attributes
except:
    arcpy.AddMessage('Error found')
Samuel_NET
fuente
3

No estoy familiarizado con las herramientas de selección de características iterar en ModelBuilder, pero exportar solo eso como código de Python indica que se pueden llamar usando arcpy.

    # Created on: 2015-05-19 15:26:10.00000
#   (generated by ArcGIS/ModelBuilder)
# Description: 
# ---------------------------------------------------------------------------

# Import arcpy module
import arcpy

# Load required toolboxes
arcpy.ImportToolbox("Model Functions")


# Local variables:
Selected_Features = ""
Value = "1"

# Process: Iterate Feature Selection
arcpy.IterateFeatureSelection_mb("", "", "false")
molestar
fuente
3

Puede usar un cursor de búsqueda para recorrer características individuales en una clase de entidad y escribir solo las geometrías en clases de entidad únicas. En este ejemplo, uso una clase de entidad de EE. UU. Y exporto los estados a nuevos archivos de forma:

import arcpy

# This is a path to an ESRI FC of the USA
states = r'C:\Program Files (x86)\ArcGIS\Desktop10.2\TemplateData\TemplateData.gdb\USA\states'
out_path = r'C:\temp'

with arcpy.da.SearchCursor(states, ["STATE_NAME", "SHAPE@"]) as cursor:
    for row in cursor:
        out_name = str(row[0]) # Define the output shapefile name (e.g. "Hawaii")
        arcpy.FeatureClassToFeatureClass_conversion(row[1], out_path, out_name)
Aaron
fuente
Creo que la desventaja de esta respuesta es que no llevas los atributos. Prefiero una respuesta más como gis.stackexchange.com/a/152165/115 que lo hará.
PolyGeo
Buen punto @PolyGeo, sin embargo, la ventaja es que esto se puede incluir en otros flujos de trabajo que también requieren cursoroperaciones.
Aaron
... pero también podría usar Select_analysis en lugar de FeatureClassToFeatureClass: es solo una línea de código que cambiaría.
PolyGeo
2

Puede usar un token de geometría (SHAPE @) dentro de Copiar características (Gestión de datos) para exportar cada característica.

import arcpy, os

shp = r'C:\temp\yourSHP.shp'
outws = r'C:\temp'

with arcpy.da.SearchCursor(shp, ["OBJECTID","SHAPE@"]) as cursor:
    for row in cursor:
        outfc = os.path.join(outws, "fc" + str(row[0]))
        arcpy.CopyFeatures_management(row[1], outfc)
Aaron
fuente