Експорт класу характеристик у кілька класів функцій на основі значень поля за допомогою ArcGIS Desktop?


34

У мене є клас функцій з понад 2000 функцій, і мені потрібно зробити їх усіма індивідуальними класами функцій на основі поля.

Чи є спосіб це зробити?

Відповіді:


44

Ви можете скористатись інструментом "Розбити атрибути":

Розділяє вхідний набір даних за унікальними атрибутами

Існують версії для:


в ArcCatalog 10.6 Split By Attributesпостійно генерує окремі .dbfтаблиці, а не окремі класи класів. Але в ArcGIS Desktop 10.6 той же інструмент генерує правильні індивідуальні файли . Я не розумію, чому, і отримали однакові виходи, намагаючись встановити робочий каталог і в папку, або в базу даних геоданих.
майкка

22

Ви можете досягти цього за допомогою дуже простої моделі, якщо у вас є ArcGIS 10.0 або вище.

Створіть модель за допомогою Ітератора функцій, де група за полями є атрибутом, який ви бажаєте вибрати, потім надішліть висновок інструменту функцій копіювання, використовуючи вбудовану підстановку, щоб забезпечити унікальне ім’я файлу. Модель показана нижче:

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


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

Ви бачили тут оновлений інструмент розділення шарів за ознаками для 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")

Вбудований інструмент "Спліт" чудово підходить для ваших цілей, якщо ви створюєте прямокутник розміру такого ж розміру, як і ваші багатокутники, які ви хочете розділити.
ccn

Якщо я неправильно читаю запитання, я думаю, що він задає "Спліт за ознаками", а не "Розділити за місцем розташування". Спліт (аналіз) забезпечує функцію "Розділити за місцем розташування". Коментар @ccn тут пропонує цікаве рішення, яке, можливо, може бути відредаговане як "уточнення" до цієї відповіді.
PolyGeo

Я хвилююся, що питання описує Split By Attributeфункціональність, і ваша відповідь здебільшого стосується Split [By Geometry].
PolyGeo

Посилання розірвано
PolyGeo

9

Я використовував @ сценарій 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

6

Це ще простіший спосіб зробити це ... і він виводиться в GDB.

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

завантажити інструмент з USGS, у мене було 3 хвилини, щоб зробити те, що я намагався протягом 1 години.


Дякую за посилання! Працює як шарм (і для версії 10.2!)
WolverineTime

Я нещодавно спробував цей інструмент, і нічого не сталося, коли його виконував. Я вибрав свою функцію, вибрав поле для вибору функцій, вибрав місце виводу, натиснув ОК і нічого не сталося. Це просто не "піде" ... я щось пропускаю? Спасибі!
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')

3

Я не знайомий з інструментами для вибору функцій 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")

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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.