Create buffer that lies exactly in the middle of two sets of polygons

488
2
01-10-2023 04:35 AM
Labels (3)
AbigailSmart
New Contributor

I am trying to establish a blue carbon baseline for an island in Scotland. In order to do this I need to create a 3 mile buffer (pink line) around my island of interest (outlined in red in the attached image). However in order to not overlap with blue carbon sources from neighboring islands (outlined in orange) we want the buffer to run exaclty halfway between any neighbouring islands. So the buffer would ideally run along the 3 mile radius line where there are no other islands to consider within twice that radius (6 miles - blue buffer line) but then come in where necessary to run along a line which sits exactly halfway between the island of interest and neighboring islands. Is this possible ?

Thank you

0 Kudos
2 Replies
DanPatterson
MVP Esteemed Contributor

If you have the Spatial Analyst extension, look up "Distance Allocation" in the help files.

There are several tools that permit spatial allocations based upon distance 

Solved: Re: Thiessen Polygons, geodesic alternative, for m... - Esri Community

several are mentioned here.  Once the raster data are processed you will get the median lines between polygons which you can use with vector tools to clip/intersect the conventional buffers.  Or you can use the raster distance allocation to delineate your buffer zones.


... sort of retired...
0 Kudos
JohannesLindner
MVP Frequent Contributor

Quick practical application of Dan's answer:

land = "Land" #layer name or fc path

# convert vertices to points
land_points = arcpy.management.FeatureVerticesToPoints(land, "memory/land_points", "ALL")

# create Thiessen polygons for the vertices
# I'm assuming you can use planar calculations! If you need geodesic, use something else.
thiessen = arcpy.analysis.CreateThiessenPolygons(land_points, "memory/thiessen", "ALL")

# dissolve the Thiessen polygons -> centerlines between islands
centerlines = arcpy.management.Dissolve(thiessen, "memory/centerlines", "ORIG_FID")

# create buffers
bufferlines = arcpy.analysis.Buffer(land, "memory/bufferlines", "3 miles")

# intersect buffers and centerlines
intersect = arcpy.analysis.Intersect([bufferlines, centerlines], "memory/intersect")

# dissolve for ORIG_FID (Land_OID -> Vertices) and ORIG_FID_1 (Land_OID -> Buffer)
baselines = arcpy.management.Dissolve(intersect, "memory/baselines", ["ORIG_FID", "ORIG_FID_1"])

# finally, delete every feature where the FIDs don't match
with arcpy.da.UpdateCursor(baselines, ["OID@"], "ORIG_FID <> ORIG_FID_1") as cursor:
    for row in cursor:
        cursor.deleteRow()

 

Islands outlined in red, the resulting baselines in yellow:

JohannesLindner_0-1673364460270.png

 


Have a great day!
Johannes