Exportieren von Feature-Classes in mehrere Feature-Classes basierend auf Feldwerten mit ArcGIS Desktop?

34

Ich habe eine Feature-Class mit über 2.000 Features, und ich muss alle einzelnen Feature-Classes basierend auf einem Feld erstellen.

Gibt es eine Möglichkeit, dies zu tun?

Sophie
quelle

Antworten:

44

Sie können das Werkzeug Teilen nach Attributen verwenden:

Teilt ein Eingabedataset nach eindeutigen Attributen auf

Es gibt Versionen für:

artwork21
quelle
In ArcCatalog 10.6 werden Split By Attributesständig einzelne .dbfTabellen und keine einzelnen Feature-Classes generiert . In ArcGIS Desktop 10.6 werden mit demselben Tool jedoch einzelne Shapefiles korrekt generiert . Ich verstehe nicht warum und habe die gleichen Ausgaben beim Versuch, das Arbeitsverzeichnis auf Ordner oder Geodatabase festzulegen.
Maycca
22

Sie können dies mit einem sehr einfachen Modell erreichen, wenn Sie ArcGIS 10.0 oder höher verwenden.

Erstellen Sie mit Feature Iterator ein Modell, bei dem das Feld Gruppieren nach das Attribut ist, das Sie auswählen möchten, und senden Sie die Ausgabe mithilfe der Inline-Ersetzung an das Tool zum Kopieren von Features, um einen eindeutigen Dateinamen sicherzustellen. Das Modell ist unten abgebildet:

Modell zum Extrahieren nach Attributen

Hornbydd
quelle
16

Ich habe keinen Zugriff auf ArcMap 10, nur auf 9.3, aber ich gehe davon aus, dass es sich nicht wesentlich davon unterscheidet.

Sie können in Python ein einfaches Skript erstellen, das Ihr Attributfeld auf unterschiedliche Werte überprüft und dann für jedes von ihnen eine SELECT-Operation für Ihr ursprüngliches Shapefile ausführt.

Wenn Sie mit Python-Skripten nicht vertraut sind, müssen Sie nur die IDLE-Datei (die Python-GUI) öffnen, eine neue Datei erstellen und den folgenden Code kopieren. Nachdem Sie den Code für my_shapefile, outputdir und my_attribute angepasst haben, sollte er funktionieren.

# 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
quelle
13

Wurde das Werkzeug "Layer nach Attributen teilen" für ArcMap 10 hier aktualisiert ? Wenn es nicht funktioniert, können Sie Split (Analyse) für Ihre Bedürfnisse verwenden.

Durch Aufteilen der Eingabe-Features wird eine Teilmenge mehrerer Ausgabe-Feature-Classes erstellt. Die eindeutigen Werte des geteilten Felds bilden die Namen der Ausgabe-Feature-Classes. Diese werden im Zielarbeitsbereich gespeichert.

Teilt

Beispiel Code:

import arcpy
arcpy.env.workspace = "c:/data"
arcpy.Split_analysis("Habitat_Analysis.gdb/vegtype", "climate.shp", "Zone",
                     "C:/output/Output.gdb", "1 Meters")
Aragon
quelle
Das integrierte Teilungswerkzeug eignet sich hervorragend für Ihre Zwecke, wenn Sie ein Ausdehnungsrechteck mit der gleichen Größe wie die zu teilenden Polygone erstellen.
ccn
Es sei denn, ich verstehe die Frage falsch, die meiner Meinung nach für ein "Nach Attributen aufteilen" und nicht für ein "Nach Ort aufteilen" gestellt wird. Split (Analyse) bietet die Funktion "Nach Standort teilen". Der Kommentar von @ccn bietet hier eine interessante Problemumgehung, die möglicherweise als "Erläuterung" zu dieser Antwort bearbeitet werden könnte.
PolyGeo
Ich mache mir Sorgen, dass die Frage die Split By AttributeFunktionalität beschreibt und Ihre Antwort sich hauptsächlich darauf bezieht Split [By Geometry].
PolyGeo
Die Verbindung ist unterbrochen
PolyGeo
9

Ich habe das Skript von @ AlexandreNeto verwendet und es für ArcGIS 10.x- Benutzer aktualisiert . Hauptsächlich müssen Sie jetzt "arcpy" anstelle von "arcgisscripting" importieren:

# 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
quelle
6

Dies ist eine noch einfachere Möglichkeit ... und es wird in eine GDB ausgegeben.

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

Lade das Tool von USGS herunter und brauchte 3 Minuten, um das zu tun, was ich 1 Stunde lang versucht hatte.

David Ainley
quelle
Danke für den Link! Funktioniert wie ein Zauber (und für Version 10.2!)
WolverineTime
Ich habe dieses Tool kürzlich ausprobiert und nichts ist passiert, als ich es ausgeführt habe. Ich habe mein Feature ausgewählt, das Feld zum Auswählen von Features ausgewählt, einen Ausgabeort ausgewählt, auf OK geklickt und nichts ist passiert. Es würde einfach nicht "gehen" ... vermisse ich etwas? Vielen Dank!
rachel.passer
6

Ich weiß, dass Sie einen Iterator in Model Builder verwenden können, aber wenn Sie Python bevorzugen, habe ich mir das ausgedacht. Fügen Sie das Skript einer Toolbox mit den Parametern in der Reihenfolge Eingabedatei, Felder (mehrwertig, von der Eingabe erhalten) und Arbeitsbereich hinzu. Dieses Skript teilt das Shapefile basierend auf den ausgewählten Feldern in mehrere Shapefiles auf und gibt sie in einem Ordner Ihrer Wahl aus.

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
quelle
4

Ich habe es schließlich mit SearchCursor und Select_analysis arbeiten

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
quelle
3

Ich bin nicht mit den Werkzeugen zur Auswahl von Iterationsfunktionen in ModelBuilder vertraut, aber wenn Sie nur diese als Python-Code exportieren, können Sie sie mit arcpy aufrufen.

    # 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")
Ärger
quelle
3

Sie können einen Suchcursor verwenden, um einzelne Features in einer Feature-Class zu durchlaufen und nur die Geometrien in eindeutige Feature-Classes zu schreiben. In diesem Beispiel verwende ich eine Feature-Class aus den USA und exportiere die Bundesstaaten in neue Shapefiles:

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
quelle
Ich denke, der Nachteil dieser Antwort ist, dass Sie die Attribute nicht durchsetzen. Ich bevorzuge eine Antwort wie gis.stackexchange.com/a/152165/115, die es tut .
PolyGeo
Ein guter Punkt bei PolyGeo ist jedoch, dass dies in andere Workflows eingebunden werden kann, die ebenfalls cursorVorgänge erfordern .
Aaron
... könnte aber Select_analysis anstelle von FeatureClassToFeatureClass verwenden - es ist nur eine Codezeile, die sich ändern würde.
PolyGeo
2

Sie können ein Geometrietoken (SHAPE @) in Copy Features (Data Management) verwenden , um jedes Feature zu exportieren.

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
quelle