Chia đa giác tại điểm giữa bằng ArcPy?


14

Tôi đang cố gắng phân chia khoảng 4000 đa giác tại điểm giữa của chúng, vuông góc với trục dài nhất của chúng (tức là trên chiều rộng tại điểm giữa), như trong sơ đồ bên dưới.

nhập mô tả hình ảnh ở đây

Lý tưởng nhất, tôi muốn làm điều này tự động và tránh chia tách từng đa giác theo cách thủ công. Tôi đã trích xuất trung điểm của đa giác bằng cách chuyển đổi các dòng dài nhất có thể được vẽ trong mỗi dòng, tôi chỉ cần xác định một phương pháp để tự động vẽ một đường rộng qua điểm này.

Đa giác khác nhau về chiều rộng của chúng, và do đó các công cụ phân chia đa giác bằng cách xác định các đường rộng có độ dài nhất định không thực sự là thứ tôi đang tìm kiếm.

Có ý kiến ​​gì không?


tất cả các đa giác lồi?
AnserGIS

Có, chúng ít nhiều có hình dạng tương tự như trong sơ đồ trên.
Matt

Tạo vuông góc như mô tả gis.stackexchange.com/questions/201867/ Khăn Sử dụng sử dụng chúng và bản gốc làm đầu vào cho tính năng cho đa giác. Nó sẽ giúp làm gần các điểm đến ranh giới
FelixIP

@Matt đã làm câu trả lời của tôi giải quyết vấn đề của bạn? Nếu vậy bạn có thể đánh dấu nó là trả lời với hộp kiểm?
BERA

Câu trả lời:


23

Script bên dưới sẽ xuất ra một lớp tính năng mới của đa giác phân tách và các dòng được sử dụng để phân tách chúng. Cần có giấy phép nâng cao.

Các đa giác sẽ được phân chia như thế này: nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Sử dụng hình chữ nhật Centroid of Minimal Bounding Geometry làm trung điểm và phân chia trên hình chữ nhật.

import arcpy
print 'Running'
arcpy.env.workspace = r'C:\TEST.gdb'    #Change to match your data
infc = r'polygons123'                   #Change to match your data
outfc_splitlines = r'splitlines'        
outfc_splitpolygons=r'splitpolygons'    

spatial_ref = arcpy.Describe(infc).spatialReference
arcpy.CreateFeatureclass_management(out_path=arcpy.env.workspace, out_name=outfc_splitlines, geometry_type='POLYLINE',spatial_reference=spatial_ref) #Creates a new feature class to hold the split lines

with arcpy.da.SearchCursor(infc,['SHAPE@','SHAPE@X','SHAPE@Y']) as cursor: #For each input polygon create a minimum bounding rectangle
    for row in cursor:
        arcpy.MinimumBoundingGeometry_management(row[0],r'in_memory\bounding','RECTANGLE_BY_WIDTH')
        arcpy.SplitLine_management(r'in_memory\bounding', r'in_memory\splitline') #Split the rectangle into four lines, one for each side
        linelist=[]
        with arcpy.da.SearchCursor(r'in_memory\splitline',['SHAPE@LENGTH','SHAPE@']) as cursor2:
            for row2 in cursor2:
                linelist.append(row2) #Store the lines lenghts and geometries in a list
            linelist=sorted(linelist,key=lambda x: x[0]) #Sort shortest to longest (the two shortest sides of the rectangles come first and second in list)
        arcpy.CopyFeatures_management(in_features=linelist[0][1], out_feature_class=r'in_memory\templine') #Copy the first line to memory
        with arcpy.da.UpdateCursor(r'in_memory\templine',['SHAPE@X','SHAPE@Y']) as cursor3:
            for row3 in cursor3:
                newcentroidx=row[1] #Find x coord of bounding rectangle centroid
                newcentroidy=row[2] #Find y..
                row3[0]=newcentroidx #Assign this to the shortest line
                row3[1]=newcentroidy #Assign this to the shortest line
                cursor3.updateRow(row3) #Move the line to the centroid of bounding rectangle
        arcpy.Append_management(inputs=r'in_memory\templine', target=outfc_splitlines) #Save this line in splitline feature class
#After all split lines are created convert input polygons to lines, merge with split lines and create new polygons from lines.

arcpy.FeatureToLine_management(in_features=infc, out_feature_class=r'in_memory\polytemp')
arcpy.Merge_management(inputs=[r'in_memory\polytemp',outfc_splitlines], output=r'in_memory\templines')
arcpy.FeatureToPolygon_management(in_features=r'in_memory\templines', out_feature_class=outfc_splitpolygons)
print 'Done'

nhập mô tả hình ảnh ở đây

Các thuộc tính sẽ bị mất nhưng bạn có thể sử dụng Spatial Join để thêm chúng một lần nữa.


6
Giải pháp tuyệt vời. Tôi nghĩ cần lưu ý rằng giấy phép Nâng cao là bắt buộc để thực hiện thao tác này (splitline, FeatureToLine và FeatureToPolygon). Hơn nữa, tôi nghĩ rằng việc thêm một số nhận xét trong toàn bộ mã của bạn sẽ giúp người dùng python mới hiểu được mỗi dòng đang làm gì.
Fezter

Xin chào @BERA, xin lỗi vì trả lời chậm. Tập lệnh dường như không hoạt động, xuất ra lỗi sau: ERROR 000466: in_memory \ templine không khớp với lược đồ phân chia mục tiêu Không thể thực thi (Nối thêm).
Matt

1
Hãy thử thay đổi dòng chắp thêm thành: arcpy.Append_man Quản lý (input = r'in_memory \ templine ', target = outfc_splitlines, giản_type =' NO_TEST ')
BERA

Có vẻ như sẽ gặp một lỗi khác, lần này: Phân tích lỗi thụt lềError: unindent không khớp với bất kỳ mức thụt ngoài nào (dòng 28)
Matt

Bạn cần có 8 khoảng trắng trước arcpy.Append_manag ...
BERA
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.