Esportare la classe di funzionalità in più classi di funzioni in base ai valori dei campi utilizzando ArcGIS Desktop?


Risposte:


44

È possibile utilizzare lo strumento Dividi per attributi:

Divide un set di dati di input per attributi univoci

Sono disponibili versioni per:


in ArcCatalog 10.6, Split By Attributesgenera costantemente singole .dbftabelle, 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.
Maycca

22

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:

Modello per l'estrazione per attributo


16

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

13

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.

Diviso

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")

Lo strumento di divisione integrato funziona perfettamente per i tuoi scopi se crei un rettangolo di estensione della stessa dimensione dei tuoi poligoni che desideri dividere.
ccn

A meno che non stia leggendo male la domanda, penso che si stia chiedendo un "Dividi per attributo" piuttosto che un "Dividi per posizione". Dividi (Analisi) fornisce la funzionalità "Dividi per posizione". Il commento di @ccn qui offre una soluzione alternativa interessante che potrebbe essere modificata come "chiarimento" a questa risposta.
PolyGeo

Temo che la domanda descriva la Split By Attributefunzionalità e la tua risposta riguardi principalmente Split [By Geometry].
PolyGeo

Il collegamento è interrotto
PolyGeo

9

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

6

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.


Grazie per il link! Funziona come un incantesimo (e per la versione 10.2!)
WolverineTime

Ho provato questo strumento di recente e non è successo nulla quando l'ho eseguito. Ho scelto la mia funzione, selezionato il campo in cui selezionare le caratteristiche, selezionato una posizione di output, premuto OK e non è successo nulla. Semplicemente non "andrebbe" ... mi sto perdendo qualcosa? Grazie!
rachel.passer,

6

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)

4

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')

3

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")

3

È 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)

Penso che il rovescio della medaglia di questa risposta sia che non porti a termine gli attributi. Preferisco una risposta più simile a gis.stackexchange.com/a/152165/115 che lo farà.
PolyGeo

Buon punto @PolyGeo, tuttavia, il lato positivo è che questo può essere avvolto in altri flussi di lavoro che richiedono anche cursoroperazioni.
Aaron

... ma così potrebbe usare Select_analysis al posto di FeatureClassToFeatureClass - sarebbe solo una riga di codice che cambierebbe.
PolyGeo

2

È 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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.