Creating square buffer around point feature using ArcGIS for Desktop?
Try these steps with ArcMap 10:
- Buffer your point feature (ArcToolbox > Analysis Tools > Proximity > Buffer). Make sure to select the correct distance in the Linear unit box.
- Input your newly created buffers into the Feature Envelope to Polygon tool (Data Management Tools > Features > Feature Envelope to Polygon). Make sure to select the "Create multpart features" box if you have multiple points.
For a Python solution:
Using SearchCursor and InsertCursor to create square buffers
A possible solution would be to create your "normal" round buffers using the standard ESRI buffer tool with whatever radius you would like and then performing a Feature Envelope To Polygon on that resulting feature class of buffers. This creates a square envelope feature around the extent of each feature. Feature Envelope to Polygon is located within Data Management>Features. The model builder model would look similar to:
Since the script linked at the end of Aaron's code can only be used for square buffers and doesn't make use of the newer arcpy.da module, I've written a script that can be used to create rectangle buffers. On a 10k random point dataset, it completed in 10 seconds:
import os, arcpy
point_FC = arcpy.GetParameterAsText(0)
w = float(arcpy.GetParameterAsText(1))
h = float(arcpy.GetParameterAsText(2))
output_FC = arcpy.GetParameterAsText(3)
def rect(coord, w, h):
#Given XY coordinates and rectangle dimensions,
#return a polygon object of a rectangle centered about the point
x,y = coord
w *= 0.5
h *= 0.5
xmin,xmax = x-w, x+w
ymin,ymax = y-h, y+h
poly = ((xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin))
return arcpy.Polygon(arcpy.Array(arcpy.Point(*p) for p in poly))
#Create output feature class.
spatref = arcpy.Describe(point_FC).spatialReference
folder, base = os.path.split(output_FC)
arcpy.CreateFeatureclass_management(folder, base, "POLYGON", spatial_reference=spatref)
#Get field object for every field in input except OID and Shape.
fields = [f for f in arcpy.ListFields(point_FC) if f.type not in ("OID", "Geometry")]
for field in fields:
arcpy.AddField_management(output_FC, field.name, field.type, field.precision,
field.scale, field.length, field.aliasName,
field.isNullable, field.required, field.domain)
#Get field names to be inputted to cursors.
#Need SHAPE@XY token to read point coords and SHAPE@ token to write polygon coords.
fnames = [f.name for f in fields]
fields_in = fnames[::]
fields_out = fnames[::]
fields_in.append("SHAPE@XY")
fields_out.append("SHAPE@")
#Create buffers and write attributes to output FC, if any.
count = int(arcpy.GetCount_management(point_FC)[0])
arcpy.SetProgressor("step", "Buffering...", 0, count, 1)
with arcpy.da.SearchCursor(point_FC, fields_in) as Scursor, arcpy.da.InsertCursor(output_FC, fields_out) as Icursor:
for i,row_in in enumerate(Scursor):
#"Convert" point to rectangle
arcpy.SetProgressorPosition(i)
feature = list(row_in)
feature[-1] = rect(feature[-1], w, h)
Icursor.insertRow(feature)