1

How to create a buffer (or buffer-like feature) based on a specific area (in km2)?

I have a specific area (e.g. 14.5 km2) and would like to lay this area as a buffer (or something similar to a buffer) around a pre-existing, irregularly-shaped polygon.

This buffer should be of equal width around the polygon, so that I can extract the distance between the outer margins of the polygon and the newly created buffer.

Is there a way to do this? I'm using ArcGIS Pro 2.4.0.

3
  • 2
    The buffer area without/excluding the buffered polygon should be for example 14.5, or including the polygon? How exact does it have to be, for example 14.4-14.6 is ok?
    – Bera
    Commented Apr 22, 2020 at 8:44
  • 1
    Excluding the polygon. The buffer alone should be of the specified area.
    – M_S
    Commented Apr 22, 2020 at 8:45
  • Your suggested accuracy is more than fine.
    – M_S
    Commented Apr 22, 2020 at 9:58

1 Answer 1

2

I think you will need to use arcpy, or a complicated Modelbuilder model.

Example which you will have to adjust (can with bad while conditions run forever):

import arcpy
arcpy.env.overwriteOutput = True

fc = r"C:\GIS\data\testdata\ak_riks.shp"
bufferarea = 400000000 #Goal
radius_increment = 100 #For each iteration increase buffer distance with this
good_enough = bufferarea*0.1

arcpy.MakeFeatureLayer_management(in_features=fc, out_layer='lyr', where_clause="{0} = '1487'".format(arcpy.AddFieldDelimiters(datasource=fc, field='KOM_KOD'))) #Im selecting one polygon to test with

arcpy.CreateFeatureclass_management(out_path='memory', out_name='tempfc2', geometry_type='POLYGON', spatial_reference=arcpy.Describe(fc).spatialreference) #Create temp output fc
icur = arcpy.da.InsertCursor(r'memory\tempfc2','SHAPE@') #Insertcursor to insert new rows into it

dist = radius_increment
with arcpy.da.SearchCursor('lyr','SHAPE@') as cursor:
    area_diff = good_enough*10
    current_area = 0
    for row in cursor:
        while area_diff>good_enough and current_area < bufferarea+good_enough: #Buffer with increasing distance until these conditions are met. You should/have to adjust this line. To get optimal resultat without running forever
            buffer = row[0].buffer(dist) #Buffer
            buffer_diff = buffer.difference(row[0]) #Erase original polygon from buffer
            current_area = buffer_diff.area #Find area
            dist+=radius_increment #Increate buffer distance for next try
        print('Success!')
        icur.insertRow([buffer_diff])

enter image description here

1
  • 1
    Many thanks! Will try this.
    – M_S
    Commented Apr 22, 2020 at 9:47

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.