Відповіді:
Ви можете скористатись інструментом "Розбити атрибути":
Розділяє вхідний набір даних за унікальними атрибутами
Існують версії для:
Ви можете досягти цього за допомогою дуже простої моделі, якщо у вас є ArcGIS 10.0 або вище.
Створіть модель за допомогою Ітератора функцій, де група за полями є атрибутом, який ви бажаєте вибрати, потім надішліть висновок інструменту функцій копіювання, використовуючи вбудовану підстановку, щоб забезпечити унікальне ім’я файлу. Модель показана нижче:
У мене немає доступу до ArcMap 10, лише 9.3, але я думаю, що він не буде сильно відрізнятися від цього.
Ви можете створити простий скрипт у Python, який перевіряє поле ваших атрибутів на різні значення, а потім для кожного з них виконує операцію SELECT до оригінального Shapefile.
Якщо ви не знайомі з сценарієм python, все, що вам потрібно зробити, це відкрити вам IDLE (графічний інтерфейс python), створити новий файл і скопіювати код нижче. Після адаптації коду для вашого my_shapefile, outputdir та my_attribute він повинен працювати.
# 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
Ви бачили тут оновлений інструмент розділення шарів за ознаками для ArcMap 10 ? Якщо це не працює, ви можете використовувати Split (Analysis) для своїх потреб.
Розбиття функцій введення створює підмножину декількох класів функцій виводу. Унікальні значення розділеного поля утворюють назви класів функцій виводу. Вони зберігаються в цільовій робочій області.
Приклад коду:
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
функціональність, і ваша відповідь здебільшого стосується Split [By Geometry]
.
Я використовував @ сценарій AlexandreNeto в і оновлював його для ArcGIS 10.x користувачів. В основному тепер вам потрібно імпортувати "arcpy" замість "arcgiskcripting":
# 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
Це ще простіший спосіб зробити це ... і він виводиться в GDB.
http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html
завантажити інструмент з USGS, у мене було 3 хвилини, щоб зробити те, що я намагався протягом 1 години.
Я знаю, що ви можете використовувати ітератор в конструкторі моделей, але якщо ви віддаєте перевагу використовувати python, тут я щось придумав. Додайте скрипт до панелі інструментів з параметрами в порядку введення shpfile, полів (багатозначне значення, отриманих від введення) та робочої області. Цей сценарій розділить файл форми на кілька файлів форми на основі вибраних полів та виведе їх у вибрану вами папку.
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)
Зрештою, я отримав це, працюючи з SearchCursor і 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')
Я не знайомий з інструментами для вибору функцій Iterate в ModelBuilder, але експорт саме цього коду як Python вказує на те, що їх можна викликати за допомогою 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")
Ви можете використовувати курсор пошуку, щоб переглядати окремі функції класу характеристик і записувати лише геометрії до унікальних класів функцій. У цьому прикладі я використовую клас функцій США та експортую штати до нових формфайлів:
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
операцій.
Ви можете використовувати маркер геометрії (SHAPE @) в функціях копіювання (управління даними) для експорту кожної функції.
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)
У виборах Arcpy, курсори шану шару / TableView. Відповідно до отримання списку вибраних функцій в ArcGIS for Desktop з використанням коду Python?, ви можете просто повторити вибір функцій.
Однак якщо ви хочете зробити вибір за допомогою arcpy, використовуйте інструмент SelectLayerByAttribute_management .
Split By Attributes
постійно генерує окремі.dbf
таблиці, а не окремі класи класів. Але в ArcGIS Desktop 10.6 той же інструмент генерує правильні індивідуальні файли . Я не розумію, чому, і отримали однакові виходи, намагаючись встановити робочий каталог і в папку, або в базу даних геоданих.