I am trying to create a 5ha plot around a point within a permissions layer. The permissions layer doesn't always extend 5ha around the point in a square so I cannot clip it. I would like to automate this process.

My current approach is to clip 5ha around the points and then use those where it creates a full square.

enter image description here

Then Use the subdivide polygon tool in ArcGIS Pro and use the polygons where the point is mostly in the centre. enter image description here

Then draw the 5ha manually for the rest of the polygons.

enter image description here

Is there a way to automate this process in R? I've only found how to subdivide the polygon into equal areas.

  • 3
    Welcome to GIS SE. As a new user, please take the Tour, which emphasizes the importance of asking One question per Question. Please choose either ArcGIS or R as the focus of your question, the Edit it to indicate what you have tried. Note that squares with a fixed area will only appear square in an appropriate projection.
    – Vince
    Commented Nov 3, 2022 at 12:06
  • Now that this has an ArcMap answer I think you should ask new separate questions for R and ArcGIS Pro, if you still need those questions answered.
    – PolyGeo
    Commented Nov 6, 2022 at 22:32

1 Answer 1


Solution to this is near identical to Creating buffers of specific size. It is about iterations... Script below assumes that you have initial squares layer (clone) and its' table has reference to limiting polygon OID:

enter image description here enter image description here

Adjust naming of layers in your map to match ones in a script and run it from Python window.

d = arcpy.Describe("PARENT")
SR = d.spatialReference
parentShapes = {oid:shp for oid,shp in arcpy.da.SearchCursor("PARENT",["OID@","SHAPE@"])}
with arcpy.da.UpdateCursor("clone",["SHAPE@","AREA_M2","ORIG_FID"]) as cursor:
    for shp,target,parent in cursor:
        parentPgon = parentShapes[parent]
        cPoint = arcpy.PointGeometry(shp.centroid,SR)
        middle = pow(target,0.5)/2
        low = middle; high = middle*10
        while True:
            square = cPoint.buffer(middle).extent.polygon
            isect = square.intersect(parentPgon,4)
            if (high - low) < 0.001: break
            curArea = isect.area
            if curArea<target:low=middle


enter image description here

enter image description here

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