ส่งออกคลาสคุณลักษณะไปยังคลาสฟีเจอร์หลาย ๆ อันตามค่าฟิลด์โดยใช้ ArcGIS Desktop?


34

ฉันมีคลาสฟีเจอร์พร้อมฟีเจอร์มากกว่า 2,000 ฟีเจอร์และฉันต้องทำให้คลาสฟีเจอร์แต่ละรายการเป็นไปตามฟิลด์

มีวิธีทำเช่นนี้หรือไม่?

คำตอบ:


44

คุณสามารถใช้เครื่องมือ Split By Attributes:

แยกชุดข้อมูลอินพุตด้วยแอ็ตทริบิวต์เฉพาะ

มีรุ่นสำหรับ:


ในArcCatalog 10.6 Split By Attributesสร้าง.dbfตารางแต่ละตารางอย่างต่อเนื่องไม่ใช่คลาสของคุณลักษณะเฉพาะ แต่ใน ArcGIS สก์ท็อป 10.6 ที่เครื่องมือเดียวกันสร้าง shapefiles ฉันไม่เข้าใจว่าทำไมและได้ผลลัพธ์เดียวกันพยายามตั้งไดเรกทอรีทำงานเป็นทั้งโฟลเดอร์หรือฐานข้อมูล
maycca

22

คุณสามารถทำสิ่งนี้ได้ด้วยแบบจำลองที่ง่ายมากหากคุณมี ArcGIS 10.0 หรือสูงกว่า

สร้างแบบจำลองด้วยฟีเจอร์ตัววนซ้ำที่ฟิลด์ตามกลุ่มคือแอ็ตทริบิวต์ที่คุณต้องการเลือกจากนั้นส่งผลลัพธ์ไปยังเครื่องมือคัดลอกคุณลักษณะโดยใช้การทดแทนแบบอินไลน์เพื่อให้แน่ใจว่าชื่อไฟล์ที่ไม่ซ้ำกัน รูปแบบที่แสดงด้านล่าง:

แบบจำลองสำหรับการแยกตามคุณสมบัติ


16

ฉันไม่สามารถเข้าถึง ArcMap 10 เพียง 9.3 แต่ฉันคาดหวังว่ามันจะไม่แตกต่างจากนี้

คุณสามารถสร้างสคริปต์อย่างง่ายใน Python ซึ่งจะตรวจสอบฟิลด์แอ็ตทริบิวต์ของคุณเพื่อหาค่าที่แตกต่างกันจากนั้นแต่ละไฟล์จะรันการดำเนินการ SELECT กับ Shapefile ดั้งเดิมของคุณ

หากคุณไม่คุ้นเคยกับการเขียนสคริปต์ python สิ่งที่คุณต้องทำคือเปิด IDLE (the python GUI) เพื่อสร้างไฟล์ใหม่และคัดลอกรหัสด้านล่าง หลังจากปรับรหัสสำหรับ 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 Field จะสร้างชื่อของคลาสคุณลักษณะเอาท์พุท สิ่งเหล่านี้จะถูกบันทึกไว้ในพื้นที่ทำงานเป้าหมาย

แยก

รหัสตัวอย่าง:

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 ที่นี่มีวิธีแก้ปัญหาที่น่าสนใจซึ่งอาจแก้ไขได้ในฐานะ "คำชี้แจง" สำหรับคำตอบนี้
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

6

นี่เป็นวิธีที่ง่ายยิ่งกว่าในการทำเช่นนี้ ... และส่งออกไปยัง GDB

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

ดาวน์โหลดเครื่องมือจาก USGS ใช้เวลา 3 นาทีในการทำสิ่งที่ฉันพยายามเป็นเวลา 1 ชั่วโมง


ขอบคุณสำหรับลิงค์! ทำงานเช่นเสน่ห์ (และสำหรับรุ่น 10.2)
WolverineTime

ฉันลองใช้เครื่องมือนี้เมื่อเร็ว ๆ นี้และไม่มีอะไรเกิดขึ้นเมื่อฉันเรียกใช้งาน ฉันเลือกคุณสมบัติของฉันเลือกฟิลด์เพื่อเลือกคุณสมบัติเลือกตำแหน่งเอาต์พุตกดตกลงและไม่มีอะไรเกิดขึ้น มันจะไม่ "ไป" ... ฉันจะทำบางสิ่งบางอย่างเหรอ? ขอบคุณ!
rachel.passer

6

ฉันรู้ว่าคุณสามารถใช้ตัววนซ้ำในตัวสร้างแบบจำลองได้ แต่ถ้าคุณต้องการใช้ไพ ธ อนนี่เป็นสิ่งที่ฉันคิดขึ้นมา เพิ่มสคริปต์ลงในกล่องเครื่องมือพร้อมพารามิเตอร์ตามลำดับเป็น Input shpfile ฟิลด์ (หลายค่าที่ได้จากอินพุต) และพื้นที่ทำงาน สคริปต์นี้จะแบ่ง Shapefile ออกเป็นหลาย Shapefiles ตามฟิลด์ที่คุณเลือกและส่งออกไปยังโฟลเดอร์ที่คุณเลือก

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

คุณสามารถใช้ Cursor การค้นหาเพื่อวนซ้ำคุณสมบัติแต่ละรายการในคลาสคุณลักษณะและเขียนเฉพาะรูปทรงเรขาคณิตไปยังคลาสคุณลักษณะเฉพาะ ในตัวอย่างนี้ฉันใช้คลาสคุณลักษณะของสหรัฐอเมริกาและส่งออกสถานะไปยังรูปร่างไฟล์ใหม่:

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

คุณสามารถใช้โทเค็นเรขาคณิต (SHAPE @) ภายในคุณลักษณะการคัดลอก (การจัดการข้อมูล)เพื่อส่งออกแต่ละคุณลักษณะ

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)

2

ใน Arcpy เคอร์เซอร์ให้เกียรติเลเยอร์ / TableView ตัวเลือก ตามที่ได้รับรายชื่อของคุณสมบัติที่เลือกใน ArcGIS สำหรับเดสก์ท็อปโดยใช้รหัสหลาม? คุณสามารถทำซ้ำการเลือกคุณสมบัติ

อย่างไรก็ตามหากคุณต้องการทำการเลือกโดยใช้ arcpy ให้ใช้เครื่องมือSelectLayerByAttribute_management

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.