Экспорт класса объектов в несколько классов объектов на основе значений полей с использованием ArcGIS Desktop?

34

У меня есть класс пространственных объектов с более чем 2000 объектами, и мне нужно сделать их отдельными классами объектов на основе поля.

Есть ли способ сделать это?

Софи
источник

Ответы:

44

Вы можете использовать инструмент Split By Attributes:

Разбивает входной набор данных по уникальным атрибутам

Доступны версии для:

artwork21
источник
в ArcCatalog 10.6 Split By Attributesпостоянно генерирует отдельные .dbfтаблицы, а не отдельные классы пространственных объектов. Но в ArcGIS Desktop 10.6 этот же инструмент правильно генерирует отдельные шейп-файлы . Я не понимаю, почему, и получил те же выходные данные, пытаясь установить рабочий каталог в папку или базу геоданных.
maycca
22

Вы можете добиться этого с очень простой моделью, если у вас ArcGIS 10.0 или выше.

Создайте модель с помощью итератора объектов, в котором группа по полю - это атрибут, который вы хотите выбрать, а затем отправьте выходные данные в инструмент копирования объектов, используя встроенное замещение, чтобы обеспечить уникальное имя файла. Модель показана ниже:

Модель для извлечения по атрибуту

Hornbydd
источник
16

У меня нет доступа к 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
Александр Нето
источник
13

Видели ли вы, что инструмент 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 отлично подходит для ваших целей, если вы создаете прямоугольник экстента того же размера, что и ваши полигоны, которые вы хотите разделить.
CCN
Если я неправильно читаю вопрос, я думаю, что он задает «Split By Attribute», а не «Split By Location». Разделить (анализ) обеспечивает функциональность «Разделить по местоположению». Комментарий @ccn здесь предлагает интересный обходной путь, который может быть отредактирован как «разъяснение» к этому ответу.
PolyGeo
Я волнуюсь, что вопрос описывает Split By Attributeфункциональность, и ваш ответ в основном о Split [By Geometry].
PolyGeo
Ссылка не работает
PolyGeo
9

Я использовал скрипт @ 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
zehpunktbarron
источник
6

Это еще более простой способ сделать это ... и он выводится в GDB.

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

скачать инструмент из USGS, мне понадобилось 3 минуты, чтобы сделать то, что я пытался в течение 1 часа.

Дэвид Эйнли
источник
Спасибо за ссылку! Работает как шарм (и для версии 10.2!)
WolverineTime
Я недавно попробовал этот инструмент, и ничего не произошло, когда я его выполнил. Я выбрал свою функцию, выбрал поле для выбора объектов, выбрал место вывода, нажал OK и ничего не произошло. Это просто не "уйти" ... я что-то упустил? Благодарность!
rachel.passer
6

Я знаю, что вы можете использовать итератор в построителе моделей, но если вы предпочитаете использовать 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)
Исаак
источник
4

В конце концов я получил его работать с 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')
Samuel_NET
источник
3

Я не знаком с инструментами 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")
troubbble
источник
3

Вы можете использовать Курсор Поиска, чтобы пройтись по отдельным объектам в классе объектов и записать только геометрии в уникальные классы объектов. В этом примере я использую класс объектов США и экспортирую штаты в новые шейп-файлы:

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)
Аарон
источник
Я думаю, что недостатком этого ответа является то, что вы не проводите через атрибуты. Я предпочитаю ответ больше как gis.stackexchange.com/a/152165/115, который будет.
PolyGeo
Хорошая мысль @PolyGeo, однако, преимущество в том, что это может быть включено в другие рабочие процессы, которые также требуют cursorопераций.
Аарон
... но можно было бы использовать Select_analysis вместо FeatureClassToFeatureClass - это всего лишь одна строка кода, которая может измениться.
PolyGeo
2

В Arcpy Курсоры уважают выбор слоя / TableView. Согласно Получение списка выбранных объектов в ArcGIS for Desktop с использованием кода Python? , вы можете просто повторять выбор объектов.

Однако, если вы хотите сделать выбор с использованием arcpy, используйте инструмент SelectLayerByAttribute_management .

Фарид Чераги
источник