Respuestas:
Puede usar la herramienta Dividir por atributos:
Divide un conjunto de datos de entrada por atributos únicos
Hay versiones disponibles para:
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:
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
¿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.
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")
Split By Attribute
funcionalidad y su respuesta sea sobre todo Split [By Geometry]
.
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
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.
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)
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')
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")
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)
cursor
operaciones.
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)
En Arcpy, los cursores honran las selecciones de capa / vista de tabla. ¿Según la lista Obtención de las características seleccionadas en ArcGIS for Desktop usando el código Python? , simplemente puede iterar las selecciones de funciones.
Sin embargo, si desea realizar una selección utilizando arcpy, use la herramienta SelectLayerByAttribute_management .
Split By Attributes
genera constantemente.dbf
tablas 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.