Ответы:
Вы можете использовать инструмент Split By Attributes:
Разбивает входной набор данных по уникальным атрибутам
Доступны версии для:
Вы можете добиться этого с очень простой моделью, если у вас 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
Видели ли вы, что инструмент Split Layer By Attributes обновлен для ArcMap 10 здесь ? Если это не работает, вы можете использовать Split (Анализ) для ваших нужд.
Разделение входных объектов создает подмножество нескольких выходных классов объектов. Уникальные значения поля разделения образуют имена выходных классов объектов. Они сохраняются в целевом рабочем пространстве.
Пример кода:
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» вместо «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
Это еще более простой способ сделать это ... и он выводится в 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 Feature Selection в 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 @) в Copy Features (Управление данными) для экспорта каждого объекта.
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 этот же инструмент правильно генерирует отдельные шейп-файлы . Я не понимаю, почему, и получил те же выходные данные, пытаясь установить рабочий каталог в папку или базу геоданных.