0

I have a lines feature class with the following attribute table:

enter image description here

When I run the MultipleRingBuffer_analysis function using the following code (provided by user @Emil Brundage), buffers are drawn using the sum of the "width" column of the attribute table and a list of distances 10, 20 and 30 meters.

import arcpy
arcpy.env.workspace = "C:/data/Py.gdb"
fc = "lines"
distances = [10,20,30]
sr = arcpy.Describe(fc).spatialReference
#create feature class
arcpy.CreateFeatureclass_management("C:/data/Py.gdb",
                                     "Multibuffers",
                                     "POLYGON",
                                     spatial_reference = sr)
#insert cursor to insert geometries into feature class
with arcpy.da.InsertCursor ("Multibuffers", ["SHAPE@"]) as iCurs:
    with arcpy.da.SearchCursor(fc, ['SHAPE@', 'width','OID@']) as cursor:
        for geom, width, oid in cursor:
            #buffer in memory
            arcpy.MultipleRingBuffer_analysis(Input_Features=geom,
                                             Output_Feature_class=r'in_memory\buffs',
                                             Distances=[i+width for i in distances],
                                             Buffer_Unit='meters')

            #iterate buffers and add to output feature class
            with arcpy.da.SearchCursor (r'in_memory\buffs', ["SHAPE@"]) as sCurs:
                for row in sCurs:
                    iCurs.insertRow (row)

            #delete in memory buffers
            arcpy.Delete_management (r'in_memory\buffs')

Screenshot 1

Output is one non dissolved feature class containing all the buffers as POLYGON objects (screenshot 1). I need to find a way to dissolve the buffers by ring iteration order in order to obtain something similar as screenshot 2 but with the right distances applied.

enter image description here

1 Answer 1

3

You cant dissolve by buffer width since each feature has different widths. Add a counting field so first buffer gets count 1, second 2, third 3 and dissolve by this:

import arcpy

infc = r'C:\database.gdb\lines'
outfc = r'C:\database.gdb\buffers'
name_of_width_field = 'width'

distances = [100,200,300]

arcpy.env.workspace = r'in_memory'
arcpy.env.overwriteOutput = 1
with arcpy.da.SearchCursor(infc, ['SHAPE@', name_of_width_field,'OID@']) as cursor:
    for geom, width, oid in cursor:
        name = r'Multibuffer_{0}'.format(oid)
        arcpy.MultipleRingBuffer_analysis(Input_Features=geom, 
                                         Output_Feature_class=name, 
                                         Distances=[i+width for i in distances], 
                                         Buffer_Unit='meters', 
                                         Dissolve_Option='NONE')
        arcpy.AddField_management(in_table=name, field_name='count', 
                                 field_type='SHORT')
        c = 1
        with arcpy.da.UpdateCursor(name,'count') as cursor2:
            for row2 in cursor2:
                row2[0]=c
                cursor2.updateRow(row2)
                c+=1
arcpy.Merge_management(inputs=arcpy.ListFeatureClasses(), output='Before_dissolve')
arcpy.Dissolve_management(in_features='Before_dissolve', out_feature_class=outfc, 
                         dissolve_field='count')

enter image description here

2
  • Thanks BERA. Every time a buffer is drawn, the UpdateCursor give a value to the new added field, the value been dependent upon which i in distance the first loop in working one? I just began Python, trying to understand ;)
    – ePoQ
    Commented Jan 31, 2018 at 8:22
  • Yes. The order of the output of multibuffer is shortest buffer to longest buffer so it is just a matter of adding a field and calculate a Count.
    – Bera
    Commented Jan 31, 2018 at 8:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.