Membagi Poligon di titik tengah menggunakan ArcPy?

14

Saya mencoba untuk membagi sekitar 4000 poligon di titik tengahnya, tegak lurus terhadap sumbu terpanjang mereka (yaitu melintasi lebar di titik tengah), seperti pada diagram di bawah ini.

masukkan deskripsi gambar di sini

Idealnya, saya ingin melakukan ini secara otomatis dan menghindari membelah setiap poligon secara manual. Saya telah mengekstrak titik tengah poligon dengan mengubah garis terpanjang yang dapat ditarik di masing-masing, saya hanya perlu menentukan metode untuk menggambar garis lebar di titik ini secara otomatis.

Poligon bervariasi dalam lebarnya, dan karenanya alat yang memecah poligon dengan menentukan garis lebar dengan panjang tertentu sebenarnya bukan yang saya cari.

Ada ide?

Mat
sumber
apakah semua poligon cembung?
AnserGIS
Ya, mereka lebih atau kurang berbentuk mirip dengan yang ditunjukkan pada diagram di atas.
Matt
Buat tegak lurus seperti dijelaskan gis.stackexchange.com/questions/201867/... Gunakan menggunakannya dan asli sebagai input untuk fitur ke poligon. Ini akan membantu untuk melakukan dekat pada poin ke batas
FelixIP
@ Matt apakah jawaban saya menyelesaikan masalah Anda? Jika demikian, bisakah Anda menandainya sebagai dijawab dengan kotak centang?
BERA

Jawaban:

23

Script di bawah ini akan menampilkan kelas fitur baru poligon terpecah dan garis yang digunakan untuk membelah mereka. Diperlukan lisensi tingkat lanjut.

Poligon akan terpecah seperti ini: masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Menggunakan Centroid dari Rectangle Geometri Minimum sebagai titik tengah dan membelah seluruh persegi panjang.

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'

masukkan deskripsi gambar di sini

Atribut akan hilang tetapi Anda dapat menggunakan Spasial Gabung untuk menambahkannya lagi.

BERA
sumber
6
Solusi bagus Saya pikir perlu dicatat bahwa lisensi Advanced diperlukan untuk melakukan operasi ini (splitline, featureToLine dan featureToPolygon). Lebih lanjut, saya pikir menambahkan beberapa komentar di seluruh kode Anda akan membantu pengguna python baru memahami apa yang dilakukan setiap baris.
Fezter
Hai @BERA, maaf atas balasan yang lambat. Script tampaknya tidak berfungsi, menghasilkan kesalahan berikut: ERROR 000466: in_memory \ templine tidak cocok dengan skema target splitlines Gagal dieksekusi (Tambah).
Matt
1
Cobalah untuk mengubah baris append menjadi: arcpy.Append_management (input = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA
Tampaknya akan mendapatkan kesalahan lain, kali ini: Parsing error IndentationError: unindent tidak cocok dengan level indentasi luar mana pun (baris 28)
Matt
Anda harus memiliki 8 spasi sebelum arcpy.Append_manag ...
BERA