แยกรูปหลายเหลี่ยมที่จุดกึ่งกลางโดยใช้ ArcPy?


14

ฉันพยายามแยกรูปหลายเหลี่ยมประมาณ 4000 รูปหลายเหลี่ยมที่จุดกึ่งกลางของพวกเขาตั้งฉากกับแกนที่ยาวที่สุดของพวกเขา (เช่นข้ามความกว้างที่จุดกึ่งกลาง) ดังในแผนภาพด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

เป็นการดีที่ฉันต้องการทำสิ่งนี้โดยอัตโนมัติและหลีกเลี่ยงการแบ่งแต่ละรูปหลายเหลี่ยมด้วยตนเอง ฉันได้แยกจุดกึ่งกลางของรูปหลายเหลี่ยมด้วยการแปลงเส้นที่ยาวที่สุดที่สามารถวาดได้ในแต่ละอันฉันแค่ต้องกำหนดวิธีในการวาดเส้นความกว้างข้ามจุดนี้โดยอัตโนมัติ

รูปหลายเหลี่ยมแตกต่างกันไปในความกว้างของพวกเขาและด้วยเหตุนี้เครื่องมือที่แบ่งรูปหลายเหลี่ยมโดยการกำหนดเส้นความกว้างที่มีความยาวที่แน่นอนนั้นไม่ใช่สิ่งที่ฉันกำลังมองหา

ความคิดใด ๆ


รูปหลายเหลี่ยมนูนออกมาหรือไม่
AnserGIS

ใช่พวกเขามีรูปร่างคล้ายกันมากขึ้นหรือน้อยลงตามที่แสดงในแผนภาพด้านบน
Matt

สร้างตั้งฉากตามที่อธิบายไว้ในgis.stackexchange.com/questions/201867/…ใช้พวกเขาและต้นฉบับเป็นอินพุตสำหรับคุณสมบัติในการโพลีกอน มันจะช่วยให้ใกล้กับจุดถึงขอบเขต
FelixIP

@ คำตอบของฉันไม่ได้แก้ปัญหาของคุณ? ถ้าเป็นเช่นนั้นคุณสามารถทำเครื่องหมายเป็นตอบด้วยช่องทำเครื่องหมาย?
BERA

คำตอบ:


23

สคริปต์ด้านล่างจะแสดงคลาสคุณลักษณะใหม่ของรูปหลายเหลี่ยมแยกและบรรทัดที่ใช้สำหรับแยก ต้องมีใบอนุญาตขั้นสูง

รูปหลายเหลี่ยมจะถูกแบ่งดังนี้: ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ใช้ Centroid ของสี่เหลี่ยมเรขาคณิตขั้นต่ำเป็นจุดกึ่งกลางและแยกไปตามสี่เหลี่ยมผืนผ้า

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'

ป้อนคำอธิบายรูปภาพที่นี่

แอตทริบิวต์จะหายไป แต่คุณสามารถใช้ Spatial Join เพื่อเพิ่มอีกครั้ง


6
ทางออกที่ดี ฉันคิดว่าควรสังเกตว่าต้องมีสิทธิ์ใช้งานขั้นสูงเพื่อดำเนินการนี้ (แยกบรรทัด, featureToLine และ featureToPolygon) นอกจากนี้ฉันคิดว่าการเพิ่มความคิดเห็นบางส่วนในรหัสของคุณจะช่วยให้ผู้ใช้งานหลามใหม่เข้าใจว่าแต่ละบรรทัดทำอะไร
Fezter

สวัสดี @BERA ขออภัยที่ตอบช้า สคริปต์ดูเหมือนจะไม่ทำงานโดยแสดงข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด 000466: in_memory \ templine ไม่ตรงกับสคีมาของเส้นแบ่งเป้าหมายล้มเหลวในการดำเนินการ (ผนวก)
แมตต์

1
ลองเปลี่ยนสายผนวกเป็น: arcpy.Append_management (อินพุต = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA

ดูเหมือนจะได้รับข้อผิดพลาดอีกครั้งในขณะนี้: การแยกวิเคราะห์ข้อผิดพลาด IndentationError: unindent ไม่ตรงกับระดับการเยื้องภายนอกใด ๆ (บรรทัดที่ 28)
แมตต์

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