ArcPy를 사용하여 중간 점에서 다각형 분할?


14

아래 다이어그램에서와 같이 가장 긴 축에 직각으로 (즉, 중간 점의 너비를 가로 질러) 중간 점에서 약 4000 개의 다각형을 분할하려고합니다.

여기에 이미지 설명을 입력하십시오

이상적으로는이 작업을 자동으로 수행하고 각 다각형을 수동으로 분할하지 않도록하고 싶습니다. 각각에 그릴 수있는 가장 긴 선을 변환하여 다각형의 중간 점을 추출했습니다.이 점을 가로 질러 너비 선을 자동으로 그리는 방법을 결정하면됩니다.

다각형의 너비는 다양하므로 특정 길이의 너비 선을 정의하여 다각형을 분할하는 도구는 실제로 내가 원하는 것이 아닙니다.

어떤 아이디어?


모든 다각형이 볼록합니까?
AnserGIS

예, 위 다이어그램에 표시된 것과 다소 비슷합니다.
Matt

gis.stackexchange.com/questions/201867/…에 설명 된대로 수직을 만듭니다 . 다각형과 형상에 대한 입력으로 원본과 원본을 사용합니다. 그것은 경계 지점에 가까운 그렇게하는 데 도움이 될 것입니다
FelixIP

@ 맷이 내 대답으로 문제를 해결 했습니까? 그렇다면 확인란으로 답변 한 것으로 표시 할 수 있습니까?
BERA

답변:


23

아래 스크립트는 분할 다각형의 새로운 피쳐 클래스와 분할에 사용되는 선을 출력합니다. 고급 라이센스가 필요합니다.

다각형은 다음과 같이 분할됩니다. 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

최소 경계 지오메트리의 중심을 사각형으로 사용하여 사각형을 분할합니다.

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
훌륭한 솔루션. 이 작업 (splitline, featureToLine 및 featureToPolygon)을 수행하려면 Advanced 라이센스가 필요합니다. 또한 코드 전체에 주석을 추가하면 새로운 파이썬 사용자가 각 행의 내용을 이해하는 데 도움이 될 것이라고 생각합니다.
Fezter

@BERA 님, 답변이 늦어 죄송합니다. 스크립트가 작동하지 않아 다음 오류가 발생했습니다. ERROR 000466 : in_memory \ templine이 대상 분할 선의 스키마와 일치하지 않습니다 (추가).
Matt

1
추가 줄을 다음과 같이 변경하십시오. arcpy.Append_management (inputs = r'in_memory \ templine ', target = outfc_splitlines, schema_type ='NO_TEST ')
BERA

또 다른 오류가 발생하는 것,이 시간 : 구문 분석 오류 IndentationError는 :내어 쓰기는 외부 들여 쓰기 수준 (라인 28)와 일치하지 않습니다
매트

arcpy.append_manag 전에 8 개의 공백이 있어야합니다.
BERA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.