Risposte:
È possibile utilizzare lo strumento Dividi per attributi:
Divide un set di dati di input per attributi univoci
Sono disponibili versioni per:
Puoi ottenerlo con un modello molto semplice se hai ArcGIS 10.0 o versioni successive.
Creare un modello con Iteratore funzionalità in cui il campo raggruppa per campo è l'attributo che si desidera selezionare, quindi inviare l'output allo strumento funzioni copia utilizzando la sostituzione in linea per garantire un nome file univoco. Il modello è mostrato di seguito:
Non ho accesso ad ArcMap 10, solo 9.3, ma mi aspetto che non sia molto diverso da questo.
Puoi creare un semplice script in Python, che controlla il campo del tuo attributo per valori diversi e quindi, per ognuno di essi, esegue un'operazione SELECT sul tuo Shapefile originale.
Se non hai familiarità con gli script Python, tutto ciò che devi fare è aprire IDLE (la GUI di Python) per creare un nuovo file e copiare il codice seguente. Dopo aver adattato il codice per my_shapefile, outputdir e my_attribute dovrebbe funzionare.
# 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
Hai visto lo strumento Dividi livello per attributi aggiornato per ArcMap 10 qui ? Se non funziona, puoi utilizzare Split (Analisi) per le tue esigenze.
La suddivisione delle funzioni di input crea un sottoinsieme di più classi di funzionalità di output. I valori univoci del campo diviso formano i nomi delle classi di feature di output. Questi vengono salvati nell'area di lavoro di destinazione.
Codice di esempio:
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
funzionalità e la tua risposta riguardi principalmente Split [By Geometry]
.
Ho usato lo script di @ AlexandreNeto e l' ho aggiornato per gli utenti di ArcGIS 10.x. Principalmente ora devi importare "arcpy" invece di "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
Questo è un modo ancora più semplice per farlo ... e viene emesso in un GDB.
http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html
scarica lo strumento da USGS, mi ci sono voluti 3 minuti per fare quello che avevo provato per 1 ora.
So che puoi usare un iteratore in Model Builder, ma se preferisci usare Python qui è qualcosa che mi è venuto in mente. Aggiungi lo script a una casella degli strumenti con i parametri in ordine come file shp di input, campi (multivalore, ottenuto dall'input) e spazio di lavoro. Questo script suddivide il file di forma in più file di forma in base ai campi selezionati e li emette in una cartella a scelta.
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)
Alla fine l'ho fatto funzionare con SearchCursor e 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')
Non ho familiarità con gli strumenti Iterate Feature Selection in ModelBuilder, ma l'esportazione solo come codice Python indica che possono essere chiamati 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")
È possibile utilizzare un cursore di ricerca per scorrere le singole funzioni in una classe di caratteristiche e scrivere solo le geometrie in classi di caratteristiche uniche. In questo esempio, utilizzo una classe di funzionalità degli Stati Uniti ed esporto gli stati in nuovi shapefile:
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
operazioni.
È possibile utilizzare un token geometria (SHAPE @) in Funzioni copia (Gestione dati) per esportare ciascuna funzione.
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)
In Arcpy, i cursori rispettano le selezioni layer / TableView. Secondo Come ottenere l'elenco delle funzionalità selezionate in ArcGIS per desktop usando il codice Python?, puoi semplicemente iterare le selezioni di funzionalità.
Tuttavia, se si desidera effettuare una selezione utilizzando arcpy, utilizzare lo strumento SelectLayerByAttribute_management .
Split By Attributes
genera costantemente singole.dbf
tabelle, non singole classi di caratteristiche. Ma in ArcGIS Desktop 10.6, lo stesso strumento genera correttamente i singoli shapefile . Non capisco perché e ho gli stessi risultati nel tentativo di impostare la directory di lavoro su entrambe le cartelle o geodatabase.