Розщеплення полігонів у середині точки за допомогою ArcPy?


14

Я намагаюся розділити близько 4000 багатокутників у їх середині, перпендикулярно їх найдовшій осі (тобто по ширині в середині точки), як на схемі нижче.

введіть тут опис зображення

В ідеалі я хотів би зробити це автоматично і уникати розділення кожного багатокутника вручну. Я витягнув середню точку полігонів шляхом перетворення найдовших ліній, які можна намалювати в кожному, мені просто потрібно визначити метод автоматичного малювання лінії ширини через цю точку.

Полігони різняться за своєю шириною, а значить, інструменти, які розбивають багатокутники, визначаючи лінії ширини певної довжини, насправді не те, що я шукаю.

Будь-які ідеї?


чи всі багатокутники опуклі?
AnserGIS

Так, вони мають більш-менш форму, подібну до тієї, що показана на наведеній вище схемі.
Метт

Створіть перпендикуляр, як описано gis.stackexchange.com/questions/201867/… Використовуйте використовувати їх та оригінал як входи для функції багатокутника. Це допоможе зробити поблизу точки до меж
FelixIP

@Matt моя відповідь вирішила вашу проблему? Якщо так, чи можете ви позначити його як відповідь за допомогою позначки?
БЕРА

Відповіді:


23

Сценарій нижче виведе новий клас функцій розділених багатокутників та ліній, що використовуються для їх розбиття. Потрібна розширена ліцензія.

Полігони будуть розбиті так: введіть тут опис зображення

введіть тут опис зображення

Використовуючи прямокутник Centroid of Minimum Bounding Geometry як середню точку і розділити по прямокутнику.

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
Прекрасне рішення. Я думаю, що слід зазначити, що для виконання цієї операції потрібна ліцензія Advanced (роздільна лінія, featureToLine та featureToPolygon). Крім того, я думаю, що додавання коментарів у ваш код допоможе новим користувачам python зрозуміти, що робить кожен рядок.
Фестер

Привіт @BERA, вибачте за повільну відповідь. Схоже, сценарій не працює, видаючи таку помилку: ПОМИЛКА 000466: in_memory \ templine не відповідає схемі цільових розщеплень Не вдалося виконати (Додати).
Метт

1
Спробуйте змінити рядок додавання на: arcpy.Append_management (inputs = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA

Начебто отримаємо ще одну помилку, на цей раз: Помилка розбору IndentationError: unindent не відповідає жодному зовнішньому рівню відступу (рядок 28)
Метт

Перед arcpy.Append_manag потрібно мати 8 пробілів ...
BERA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.