Eksportujesz klasę obiektów do wielu klas obiektów na podstawie wartości pól za pomocą ArcGIS Desktop?

Odpowiedzi:

44

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:

grafika 21
źródło
w ArcCatalog 10.6 Split By Attributesstale generuje pojedyncze .dbftabele, 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ę.
maycca
22

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:

Model wyodrębniania według atrybutu

Hornbydd
źródło
16

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
Alexandre Neto
źródło
13

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.

rozdzielać

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")
Aragonia
źródło
Wbudowane narzędzie podziału działa doskonale do twoich celów, jeśli utworzysz prostokąt zasięgu o tym samym rozmiarze, co wielokąty, które chcesz podzielić.
ccn
Chyba że źle interpretuję pytanie, myślę, że pyta ono o „Podziel według atrybutu” zamiast „Podziel według lokalizacji”. Podziel (Analiza) zapewnia funkcjonalność „Podziel według lokalizacji”. Komentarz @ccn tutaj oferuje interesujące obejście, które może być zredagowane jako „wyjaśnienie” tej odpowiedzi.
PolyGeo
Martwię się, że pytanie opisuje Split By Attributefunkcjonalność, a twoja odpowiedź dotyczy głównie Split [By Geometry].
PolyGeo
Link jest zepsuty
PolyGeo
9

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
zehpunktbarron
źródło
6

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ę.

David Ainley
źródło
Dziękuję za link! Działa jak urok (i dla wersji 10.2!)
WolverineTime
Ostatnio wypróbowałem to narzędzie i nic się nie stało, gdy go wykonałem. Wybrałem swoją funkcję, wybrałem pole do wyboru funkcji, wybrałem lokalizację wyjściową, kliknąłem OK i nic się nie stało. To po prostu nie „pójdzie” ... czy coś mi brakuje? Dzięki!
rachel.passer
6

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)
Izaak
źródło
4

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')
Samuel_NET
źródło
3

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")
kłopot
źródło
3

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)
Aaron
źródło
Myślę, że minusem tej odpowiedzi jest to, że nie przenosimy atrybutów. Wolę odpowiedź bardziej jak gis.stackexchange.com/a/152165/115, która będzie.
PolyGeo
Dobra uwaga @PolyGeo, jednak zaletą jest to, że można to zawrzeć w innych przepływach pracy, które również wymagają cursoroperacji.
Aaron
... ale może też użyć Select_analysis zamiast FeatureClassToFeatureClass - to tylko jedna linia kodu, która by się zmieniła.
PolyGeo
2

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)
Aaron
źródło