Odpowiedzi:
Możesz użyć narzędzia Podziel według atrybutów:
Dzieli wejściowy zestaw danych według unikalnych atrybutów
Dostępne są wersje dla:
Możesz to osiągnąć za pomocą bardzo prostego modelu, jeśli posiadasz ArcGIS 10.0 lub wyższy.
Utwórz model za pomocą Feature Iterator, w którym grupa według pola jest atrybutem, który chcesz wybrać, a następnie wyślij dane wyjściowe do narzędzia kopiowania funkcji za pomocą wbudowanego podstawienia, aby zapewnić unikalną nazwę pliku. Model pokazano poniżej:
Nie mam dostępu do ArcMap 10, tylko 9.3, ale spodziewam się, że nie będzie się tak bardzo różnił od tego.
Możesz utworzyć prosty skrypt w Pythonie, który sprawdza w polu atrybutu różne wartości, a następnie dla każdej z nich wykonuje operację WYBIERZ do oryginalnego pliku Shapefile.
Jeśli nie jesteś zaznajomiony ze skryptami w języku Python, wystarczy otworzyć IDLE (graficzny interfejs użytkownika w języku Python), utworzyć nowy plik i skopiować poniższy kod. Po dostosowaniu kodu do pliku my_shapefile, outputdir i my_attribute powinien działać.
# 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
Czy widziałeś tutaj zaktualizowane narzędzie Podziel warstwę według atrybutów dla ArcMap 10 ? Jeśli to nie działa, możesz użyć Split (Analiza) dla swoich potrzeb.
Podział funkcji wejściowych tworzy podzbiór wielu klas funkcji wyjściowych. Unikalne wartości pola podzielonego tworzą nazwy klas obiektów wyjściowych. Są one zapisywane w docelowym obszarze roboczym.
Przykładowy kod:
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
funkcjonalność, a twoja odpowiedź dotyczy głównie Split [By Geometry]
.
Użyłem skryptu @ AlexandreNeto i zaktualizowałem go dla użytkowników ArcGIS 10.x. Głównie teraz musisz zaimportować „arcpy” zamiast „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
Jest to jeszcze łatwiejszy sposób na zrobienie tego ... i jest wysyłany do GDB.
http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html
pobierz narzędzie z USGS, zajęło mi 3 minuty robienie tego, co próbowałem przez 1 godzinę.
Wiem, że możesz używać iteratora w kreatorze modeli, ale jeśli wolisz używać Pythona, oto coś, co wymyśliłem. Dodaj skrypt do przybornika z parametrami w kolejności jako wejściowy plik shp, pola (wielowartościowe, uzyskane z danych wejściowych) i obszar roboczy. Ten skrypt podzieli plik shapefile na wiele plików shapefile na podstawie wybranych pól i wyśle je do wybranego folderu.
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)
W końcu mam go współpracować z SearchCursor i 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')
Nie znam narzędzi Iterate Feature Selection w ModelBuilder, ale eksportuję tylko to, ponieważ kod Pythona wskazuje, że można je wywoływać za pomocą 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")
Możesz użyć kursora wyszukiwania, aby przechodzić między poszczególnymi elementami w klasie elementów i zapisywać tylko geometrie w unikalnych klasach elementów. W tym przykładzie używam klasy obiektów USA i eksportuję stany do nowych plików kształtów:
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
operacji.
Możesz użyć tokena geometrii (SHAPE @) w ramach funkcji kopiowania (zarządzanie danymi), aby wyeksportować każdą funkcję.
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)
W Arcpy kursory honorują wybory warstwy / TableView. Zgodnie z Pobieraniem listy wybranych funkcji w ArcGIS na komputer za pomocą kodu Python?, możesz po prostu iterować wybrane funkcje.
Jeśli jednak chcesz dokonać wyboru za pomocą arcpy, użyj narzędzia SelectLayerByAttribute_management .
Split By Attributes
stale generuje pojedyncze.dbf
tabele, a nie poszczególne klasy obiektów. Jednak w ArcGIS Desktop 10.6 to samo narzędzie generuje poprawnie pojedyncze pliki kształtów . Nie rozumiem dlaczego i otrzymałem te same dane wyjściowe, próbując ustawić katalog roboczy na folder lub geobazę.