Mengekspor kelas fitur ke beberapa kelas fitur berdasarkan nilai-nilai bidang menggunakan ArcGIS Desktop?

34

Saya memiliki kelas fitur dengan lebih dari 2.000 fitur, dan saya harus menjadikan mereka semua kelas fitur individual berdasarkan bidang.

Apakah ada cara untuk melakukan ini?

Sophie
sumber

Jawaban:

44

Anda dapat menggunakan alat Split By Attributes:

Membagi dataset input dengan atribut unik

Ada versi yang tersedia untuk:

artwork21
sumber
di ArcCatalog 10.6, secara Split By Attributeskonstan menghasilkan .dbftabel individual , bukan kelas fitur individual. Tapi, di ArcGIS Desktop 10.6, alat yang sama menghasilkan shapefile individu dengan benar . Saya tidak mengerti mengapa, dan mendapat keluaran yang sama dengan mencoba mengatur direktori kerja ke folder atau geodatabase.
maycca
22

Anda dapat mencapai ini dengan model yang sangat sederhana jika Anda memiliki ArcGIS 10.0 atau lebih tinggi.

Buat model dengan Feature Iterator di mana grup dengan bidang adalah atribut yang ingin Anda pilih saat itu kemudian mengirim output ke alat fitur copy menggunakan substitusi inline untuk memastikan nama file yang unik. Model ditunjukkan di bawah ini:

Model untuk mengekstraksi berdasarkan atribut

Hornbydd
sumber
16

Saya tidak memiliki akses ke ArcMap 10, hanya 9.3, tetapi saya berharap itu tidak akan jauh berbeda dari ini.

Anda bisa membuat skrip sederhana dengan Python, yang memeriksa bidang atribut Anda untuk nilai yang berbeda, dan kemudian, untuk masing-masing menjalankan operasi SELECT ke Shapefile asli Anda.

Jika Anda tidak terbiasa dengan skrip python, yang perlu Anda lakukan adalah membuka IDLE Anda (python GUI) membuat file baru, dan menyalin kode di bawah ini. Setelah mengadaptasi kode untuk my_shapefile Anda, outputdir dan my_attribute seharusnya bekerja.

# 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
sumber
13

Apakah Anda melihat alat Split Layer By Attributes diperbarui untuk ArcMap 10 di sini ? Jika tidak berhasil, Anda dapat menggunakan Split (Analisis) untuk kebutuhan Anda.

Memisahkan Fitur Input menciptakan subset dari beberapa kelas fitur output. Nilai unik Bidang Pisah membentuk nama-nama kelas fitur keluaran. Ini disimpan di ruang kerja target.

membagi

Kode Contoh:

import arcpy
arcpy.env.workspace = "c:/data"
arcpy.Split_analysis("Habitat_Analysis.gdb/vegtype", "climate.shp", "Zone",
                     "C:/output/Output.gdb", "1 Meters")
Aragon
sumber
Alat Split bawaan berfungsi sangat baik untuk keperluan Anda jika Anda membuat sebuah persegi panjang dengan ukuran yang sama dengan poligon yang ingin Anda bagi.
ccn
Kecuali saya salah membaca pertanyaan saya pikir itu meminta "Split By Attribute" daripada "Split By Location". Split (Analisis) menyediakan fungsionalitas "Split Berdasarkan Lokasi". Komentar oleh @ccn di sini menawarkan solusi yang menarik yang mungkin dapat diedit sebagai "klarifikasi" untuk jawaban ini.
PolyGeo
Saya khawatir pertanyaannya menjelaskan Split By Attributefungsionalitas dan jawaban Anda sebagian besar tentang Split [By Geometry].
PolyGeo
Tautan rusak
PolyGeo
9

Saya menggunakan skrip @ AlexandreNeto dan memperbaruinya untuk pengguna ArcGIS 10.x. Terutama Anda sekarang harus mengimpor "arcpy" daripada "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
sumber
6

Ini adalah cara yang bahkan lebih mudah untuk melakukan ini ... dan hasilnya menjadi GDB.

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

mengunduh alat dari USGS, butuh waktu 3 menit untuk melakukan apa yang saya coba selama 1 jam.

David Ainley
sumber
Terima kasih atas tautannya! Bekerja seperti pesona (dan untuk versi 10.2!)
WolverineTime
Saya mencoba alat ini baru-baru ini, dan tidak ada yang terjadi ketika saya menjalankannya. Saya memilih fitur saya, memilih bidang untuk memilih fitur, memilih lokasi keluaran, tekan OK dan tidak ada yang terjadi. Itu tidak akan "pergi" ... apakah saya melewatkan sesuatu? Terima kasih!
rachel.passer
6

Saya tahu Anda dapat menggunakan iterator dalam model builder, tetapi jika Anda lebih suka menggunakan python di sini adalah sesuatu yang saya hasilkan. Tambahkan skrip ke kotak alat dengan parameter dalam urutan sebagai Input shpfile, bidang (multinilai, diperoleh dari input), dan ruang kerja. Script ini akan membagi shapefile menjadi beberapa shapefile berdasarkan bidang yang Anda pilih, dan mengeluarkannya ke folder pilihan Anda.

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)
Ishak
sumber
4

Saya akhirnya berhasil bekerja dengan SearchCursor dan 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
sumber
3

Saya tidak terbiasa dengan alat Seleksi Fitur Iterate di ModelBuilder, tetapi mengekspor hanya itu sebagai kode Python menunjukkan bahwa mereka dapat dipanggil menggunakan 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")
bermasalah
sumber
3

Anda dapat menggunakan kursor pencarian untuk mengulangi setiap fitur dalam kelas fitur dan menulis hanya geometri ke kelas fitur unik. Dalam contoh ini, saya menggunakan kelas fitur Amerika Serikat dan mengekspor negara bagian ke shapefile baru:

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)
Harun
sumber
Saya pikir kelemahan dari jawaban ini adalah Anda tidak membawa atribut. Saya lebih suka jawaban lebih seperti gis.stackexchange.com/a/152165/115 yang akan.
PolyGeo
Poin bagus @PolyGeo, bagaimanapun, kelebihannya adalah ini dapat dibungkus dengan alur kerja lain yang juga membutuhkan cursoroperasi.
Aaron
... tetapi bisa juga menggunakan Select_analysis sebagai pengganti FeatureClassToFeatureClass - hanya satu baris kode yang akan berubah.
PolyGeo
2

Anda dapat menggunakan token geometri (SHAPE @) di dalam Fitur Salin (Manajemen Data) untuk mengekspor setiap fitur.

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)
Harun
sumber