Xuất lớp tính năng thành nhiều lớp tính năng dựa trên các giá trị trường bằng ArcGIS Desktop?


34

Tôi có một lớp đối tượng với hơn 2.000 tính năng và tôi cần tạo cho chúng tất cả các lớp đối tượng riêng dựa trên một trường.

Có cách nào để làm việc này không?

Câu trả lời:


44

Bạn có thể sử dụng công cụ Split By Attribution:

Chia một tập dữ liệu đầu vào theo các thuộc tính duy nhất

Có các phiên bản dành cho:


trong ArcCatalog 10.6, Split By Attributesliên tục tạo các .dbfbảng riêng lẻ , không phải các lớp tính năng riêng lẻ. Nhưng, trong ArcGIS Desktop 10.6, cùng một công cụ tạo ra các shapefile riêng lẻ . Tôi không hiểu tại sao và có cùng kết quả đầu ra khi cố gắng đặt thư mục làm việc cho cả thư mục hoặc cơ sở dữ liệu địa lý.
maycca

22

Bạn có thể đạt được điều này với một mô hình rất đơn giản nếu bạn có ArcGIS 10.0 trở lên.

Tạo một mô hình với Feature Iterator trong đó nhóm theo trường là thuộc tính bạn muốn chọn sau đó gửi đầu ra cho công cụ tính năng sao chép bằng cách sử dụng thay thế nội tuyến để đảm bảo tên tệp duy nhất. Mô hình được hiển thị dưới đây:

Mô hình trích xuất theo thuộc tính


16

Tôi không có quyền truy cập vào ArcMap 10, chỉ 9.3, nhưng tôi hy vọng rằng nó sẽ không khác lắm so với điều này.

Bạn có thể tạo một tập lệnh đơn giản trong Python, để kiểm tra trường thuộc tính của bạn cho các giá trị khác nhau và sau đó, cho mỗi trong số chúng chạy một thao tác CHỌN cho Shapefile ban đầu của bạn.

Nếu bạn không quen thuộc với kịch bản python, tất cả những gì bạn cần làm là mở IDLE (GUI python) tạo một tệp mới và sao chép mã bên dưới. Sau khi điều chỉnh mã cho my_shapefile của bạn, outputdir và my_attribution nó sẽ hoạt động.

# 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

Bạn có thấy công cụ Split Layer By Attribution được cập nhật cho ArcMap 10 tại đây không? Nếu nó không hoạt động, bạn có thể sử dụng Split (Phân tích) cho nhu cầu của bạn.

Việc tách các tính năng đầu vào tạo ra một tập hợp con của nhiều lớp tính năng đầu ra. Các giá trị duy nhất của Trường phân chia tạo thành tên của các lớp đối tượng đầu ra. Chúng được lưu trong không gian làm việc đích.

chia

Mã ví dụ:

import arcpy
arcpy.env.workspace = "c:/data"
arcpy.Split_analysis("Habitat_Analysis.gdb/vegtype", "climate.shp", "Zone",
                     "C:/output/Output.gdb", "1 Meters")

Công cụ Split tích hợp hoạt động tuyệt vời cho mục đích của bạn nếu bạn tạo một hình chữ nhật phạm vi có cùng kích thước với đa giác bạn muốn chia.
ccn

Trừ khi tôi đọc sai câu hỏi, tôi nghĩ rằng nó đang yêu cầu "Chia theo thuộc tính" chứ không phải là "Chia theo vị trí". Split (Phân tích) cung cấp chức năng "Chia theo vị trí". Nhận xét của @ccn ở đây cung cấp một cách giải quyết thú vị mà có lẽ có thể được chỉnh sửa thành "làm rõ" cho câu trả lời này.
PolyGeo

Tôi lo lắng rằng câu hỏi mô tả Split By Attributechức năng và câu trả lời của bạn chủ yếu là về Split [By Geometry].
PolyGeo

Liên kết bị hỏng
PolyGeo

9

Tôi đã sử dụng tập lệnh của @ AlexandreNetocập nhật nó cho người dùng ArcGIS 10.x. Chủ yếu là bây giờ bạn phải nhập "arcpy" thay vì "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

Đây là một cách thậm chí dễ dàng hơn để làm điều này ... và nó xuất ra thành GDB.

http://www.umec.usgs.gov/manloyment/dss/split_by_attribution_tool.html

tải xuống công cụ từ USGS, tôi mất 3 phút để làm những gì tôi đã cố gắng trong 1 giờ.


Cảm ơn vi đương link! Hoạt động như một bùa mê (và cho phiên bản 10.2!)
WolverineTime

Tôi đã thử công cụ này gần đây và không có gì xảy ra khi tôi thực hiện nó. Tôi đã chọn tính năng của mình, chọn trường để chọn tính năng theo, chọn vị trí đầu ra, nhấn OK và không có gì xảy ra. Nó sẽ không "đi" ... tôi có thiếu thứ gì không? Cảm ơn!
rachel.passer

6

Tôi biết bạn có thể sử dụng một trình vòng lặp trong trình xây dựng mô hình, nhưng nếu bạn thích sử dụng python thì đây là điều tôi nghĩ ra. Thêm tập lệnh vào hộp công cụ với các tham số theo thứ tự như Nhập shpfile, các trường (đa giá trị, thu được từ đầu vào) và không gian làm việc. Kịch bản lệnh này sẽ phân chia shapefile thành nhiều shapefile dựa trên các trường bạn chọn và xuất chúng vào một thư mục bạn chọn.

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

Cuối cùng tôi đã có nó hoạt động với SearchC bổng và Chọn_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

Tôi không quen thuộc với các công cụ chọn tính năng lặp trong ModelBuilder, nhưng xuất ra như mã Python chỉ ra rằng chúng có thể được gọi bằng cách sử dụng 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

Bạn có thể sử dụng Con trỏ tìm kiếm để lặp qua các tính năng riêng lẻ trong một lớp đối tượng và chỉ viết các hình học cho các lớp đối tượng duy nhất. Trong ví dụ này, tôi sử dụng một lớp tính năng của Hoa Kỳ và xuất các tiểu bang sang các shapefile mới:

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)

Tôi nghĩ rằng nhược điểm của câu trả lời này là bạn không thực hiện các thuộc tính. Tôi thích một câu trả lời giống như gis.stackexchange.com/a/152165/115 sẽ.
PolyGeo

Điểm hay @PolyGeo, tuy nhiên, nhược điểm là điều này có thể được gói gọn trong các quy trình công việc khác cũng đòi hỏi phải cursorhoạt động.
Aaron

... nhưng vì vậy có thể sử dụng Select_analysis thay cho FeatureClassToFeatureClass - đó chỉ là một dòng mã sẽ thay đổi.
PolyGeo


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.