ArcPy kullanarak çokgenleri orta noktada bölme?


14

Aşağıdaki diyagramda olduğu gibi, orta noktalarında, en uzun eksenlerine (yani orta noktadaki genişlik boyunca) dikey olarak yaklaşık 4000 çokgen bölmeye çalışıyorum.

resim açıklamasını buraya girin

İdeal olarak, bunu otomatik olarak yapmak ve her çokgeni elle bölmekten kaçınmak istiyorum. Her birinde çizilebilecek en uzun çizgileri dönüştürerek çokgenlerin orta noktasını çıkardım, sadece bu nokta boyunca otomatik olarak bir genişlik çizgisi çizmek için bir yöntem belirlemem gerekiyor.

Çokgenler genişliklerine göre değişir ve bu nedenle çokgenleri belirli bir uzunluktaki genişlik çizgilerini tanımlayarak bölen araçlar gerçekten aradığım şey değildir.

Herhangi bir fikir?


tüm çokgenler dışbükey midir?
AnserGIS

Evet, yukarıdaki şemada gösterilene benzer şekilde az çok şekillidirler.
Matt

Açıklandığı gibi dikey oluşturun gis.stackexchange.com/questions/201867/… Çokgene özelliğin giriş olarak bunları ve orijinali kullanın. Bu, sınırlardaki noktaların yakınında yapılması
gerekecek

@ Cevabım sorununuzu çözdü mü? Öyleyse onay kutusuyla yanıtlanmış olarak işaretleyebilir misiniz?
BERA

Yanıtlar:


23

Aşağıdaki komut dosyası, bölünmüş çokgenlerin yeni bir özellik sınıfı ve bunları bölmek için kullanılan satırların çıktısını verecektir. Gelişmiş lisans gereklidir.

Çokgenler şu şekilde bölünecektir: resim açıklamasını buraya girin

resim açıklamasını buraya girin

Minimum Sınırlayıcı Geometri Dikdörtgeni Centroid'ini orta nokta olarak kullanma ve dikdörtgene bölme.

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'

resim açıklamasını buraya girin

Öznitelikler kaybolur, ancak bunları tekrar eklemek için Uzamsal Katılmayı kullanabilirsiniz.


6
Harika bir çözüm. Ben bu işlem (splitline, featureToLine ve featureToPolygon) gerçekleştirmek için Gelişmiş lisans gerektiğini belirtmek gerektiğini düşünüyorum. Ayrıca, kodunuz boyunca bazı yorumlar eklemek, yeni python kullanıcılarının her satırın ne yaptığını anlamasına yardımcı olacağını düşünüyorum.
Fezter

Merhaba @BERA, yavaş cevap için özür dilerim. Komut dosyası çalışmıyor ve aşağıdaki hatayı veriyor: ERROR 000466: in_memory \ templine, hedef ayrım çizgilerinin şemasıyla eşleşmiyor Yürütülemedi (Ekle).
Matt

1
Ekleme satırını şu şekilde değiştirmeyi deneyin: arcpy.Append_management (inputs = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA

Bu sefer başka bir hata alıyor gibi görünüyor: Ayrıştırma hatası IndentationError: unindent herhangi bir dış girinti seviyesiyle eşleşmiyor (satır 28)
Matt

Kutuptan önce 8 boşluk olması gerekiyor.Uygulama_değ ...
BERA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.