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.

asked Apr 22, 2020 at 8:42
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? Commented Apr 22, 2020 at 8:44
  • 1
    Excluding the polygon. The buffer alone should be of the specified area. Commented Apr 22, 2020 at 8:45
  • Your suggested accuracy is more than fine. 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

answered Apr 22, 2020 at 9:23
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.