Repeating Shapes
Summary
Tessellates an area of interest with hexagons, squares, triangles or rectangles (brick courses with an adjustable offset), or lays out sampling points or circles in a square or triangular arrangement — at any orientation angle. Sizes are given in real units (hectares, acres, feet, miles, …) and converted to the output coordinate system automatically; typing any one measure fills the others. The area of interest is a polygon layer (selection honored, holes respected), line or point features (shapes touching them are kept), or a plain extent; edge shapes are kept whole when they intersect the area, kept only when their center is inside, or clipped. Geographic data is computed in an automatic equal-area projection so cell areas are exact.
A modernized port of the classic Repeating Shapes extension — the standard way to build systematic sampling grids, hexagonal analysis cells, plot networks, and tessellations for cluster designs.
Usage
The eight patterns
- Hexagons — sized by area, edge, width across the flats, or corner-to-corner diameter.
- Squares — by area or edge.
- Triangles — by area, edge, or height.
- Rectangles (brick courses) — by Edge 1 and Edge 2, with a percent brick offset per course (50 = running bond, 33 = staircase, 0 = aligned columns).
- Circles in a square or triangular pattern — by area, radius, diameter or circumference, plus a center spacing (default: touching).
- Points in a square or triangular pattern — by center spacing.
Typing a value into any one size box fills the others automatically — enter a square area of 4 square miles and the edge length becomes 2 miles — exactly as the original dialogs did. Sizes carry real units (area: square meters, hectares, square kilometers, square feet, acres, square miles; length: meters, kilometers, feet, miles), and choosing an area unit snaps the length unit to its natural partner. Everything is converted to the output coordinate system internally, so there is no need to look up its units.
Two ways to run it
The ribbon button opens the tool's own window — a friendlier front end than the geoprocessing pane, with the eight patterns as picture tiles, the size boxes filling each other as you type, live unit hints, a measure diagram for the chosen shape, and an area-of-interest picker that accepts a layer (drag one straight from the Contents pane) or the current map view's extent. Behind the scenes the window runs the very same geoprocessing tool, so every run lands in the Geoprocessing History with its full parameters. The standard geoprocessing tool remains available in the toolbox for the GP pane, ModelBuilder and Python — same engine, same results, either door.
The area of interest
Polygons enclose: the shapes fill the polygons' area, with multiple polygons unioned, holes respected, and a layer selection honored. Lines or points select instead: every shape touching a line (hexagons over a river) or containing a point (analysis cells around observation locations) is kept whole — and for point patterns, where a bare point has no extent, each lattice point's implied tile plays the shape's role. A plain extent works when no features are given, and the Extent geoprocessing environment overrides both.
Shapes at the area's edge
Three policies. The classic behavior — and the default — keeps every whole shape that intersects the area, because sampling designs usually want complete cells. Alternatively keep only shapes whose center falls inside, or clip the border shapes to the area for a true partition (edge cells then differ in area — the Area_Ha field tells you by how much). With line or point features there is no “inside,” so touching shapes are always kept whole. The orientation angle rotates the whole lattice counterclockwise about the area's center; by symmetry, hexagons and triangles repeat every 60° and squares every 90°.
Geographic data: an honest treatment
Truly regular equal-area tessellations of a curved surface are impossible — Euler's formula forces 12 pentagons into any hexagon-dominant tiling of a sphere, which is why a soccer ball looks the way it does — so something must flex. This tool keeps cell areas exact by computing in an automatic Lambert azimuthal equal-area projection centered on the area of interest (built on the input's own datum) and writing the results back in the input geographic coordinate system; shape regularity absorbs the distortion, which grows only as (distance/2R)² — about 0.15% at 500 km from the center, invisible at management scales. Continental or global tessellation belongs to discrete global grid systems (ISEA3H, H3), which accept those 12 pentagons in exchange for global coverage; the tool warns when the area of interest approaches that scale.
Speed
The original extension built every shape one at a time and then deleted the extras feature-by-feature; this version generates the whole lattice numerically, filters it in bulk, and only writes the shapes that survive — typically orders of magnitude faster. Six-figure cell counts complete in about a minute, most of it simply writing the output.
Systematic and random designs together
This tool is the systematic half of a sampling-design pair: its point patterns are exactly the gridded arrays that Esri's Create Spatial Sampling Locations calls Systematic, with more arrangements and full control of spacing and orientation, while the Random Point Generator draws the random designs. The two also combine into cluster sampling: tessellate the study area here, then run Select Random Records to keep a random subset of the tiles.
ModelBuilder
The output feature class — points for the point patterns, polygons otherwise, with Cell_ID and (for polygons) a geodesic-hectares Area_Ha field — chains directly into zonal statistics, spatial joins, or the cluster-sampling recipe above:
One more field note: if your tiles are point patterns destined for on-the-ground visits, the Estimated Shortest Path through Points tool will order the points into an efficient field survey route to follow — often a substantial saving in overall effort and time (and systematic patterns, with their regularity, route especially well).
Parameters
These are the geoprocessing tool's parameters (the window presents the same choices with its gallery and interlocking size boxes). Give any one size measure for the chosen shape; the rest fill in automatically.
| Label | Explanation | Data type |
|---|---|---|
| Shape and patternRequired · shape_type | The pattern to generate: Hexagons; Squares; Triangles; Rectangles (brick courses); Circles — square or triangular pattern; Points — square or triangular pattern. | String |
| Area of interestOptional · boundary | Polygons enclose the area to fill (unioned, holes respected, selection honored). Line or point features instead select: every shape touching a line or containing a point is kept whole. Leave blank to use the extent parameter. | Feature Layer |
| ExtentOptional · extent | A plain rectangular area of interest, used when no feature layer is given. The Extent geoprocessing environment overrides both. | Extent |
| Shape areaOptional · area | The area of one hexagon, square, triangle or circle, in the area units below. | Double |
| Area unitsOptional · area_units | Square meters, hectares, square kilometers, square feet, acres, or square miles. Choosing one snaps the length units to its natural partner (square miles → miles, acres → feet, …). | String |
| Units for all lengths, spacings and radiiOptional · linear_units | Meters, kilometers, feet or miles — for every length box: edge, width, height, diameter, radius, circumference and spacing. | String |
| Edge lengthOptional · edge | The edge (side) length of a hexagon, triangle or square. | Double |
| WidthOptional · width | The hexagon's width across the flats, or the rectangle's Edge 1. | Double |
| HeightOptional · height | The triangle's height (base to apex), or the rectangle's Edge 2. | Double |
| DiameterOptional · diameter | The hexagon's corner-to-corner diameter, or the circle's diameter. | Double |
| Circle radiusOptional · radius | The circle's radius. | Double |
| Circle circumferenceOptional · circumference | The circle's circumference. | Double |
| Spacing between point or circle centersOptional · spacing | The center-to-center distance between points or circles. For circles it defaults to twice the radius — touching circles. | Double |
| Brick offset, percent of Edge 1Optional · offset_pct | How far each course of rectangles shifts relative to the course below, as a percent of Edge 1: 50 = running bond (bricks), 33 = staircase, 0 = aligned columns. | Double |
| Orientation (degrees, counterclockwise)Optional · orientation | Rotates the whole lattice counterclockwise about the area's center. Hexagons and triangles repeat every 60°, squares every 90°. | Double |
| Shapes at the area's edgeOptional · edge_policy | Keep whole shapes intersecting the area (the classic behavior); keep shapes whose center is inside; or clip shapes to the area. Applies to polygon or extent areas of interest; with line or point features, touching shapes are always kept whole. | String |
| Output feature classRequired · out_fc | The output (points for the point patterns, polygons otherwise), with Cell_ID and — for polygons — a geodesic-hectares Area_Ha field. | Feature Class |
Python
100-hectare hexagons over a study area, whole cells kept:
import arcpy
arcpy.ImportToolbox(r"C:\path\to\JennessEnterprisesTools.pyt") # your install path
arcpy.jenness.RepeatingShapes(
shape_type="Hexagons",
boundary=r"D:\data\study.gdb\study_area",
area=100.0, area_units="Hectares",
orientation=15.0,
edge_policy="Keep whole shapes intersecting the area (original)",
out_fc=r"D:\data\study.gdb\hex_100ha")
Recommended citation
Credits
By Jeff Jenness, Jenness Enterprises (www.jennessent.com). A modernized port of the author's ArcView 3.x Repeating Shapes (repeat_shapes.avx) extension.
Licensing information
Works at every ArcGIS Pro license level (Basic, Standard, Advanced). No extension licenses are required.
Related tools and pages
- Random Point Generator — the random half of the sampling-design pair.
- Select Random Records — keeps a random subset of the tiles for cluster designs.
- Voronoi (Thiessen) Polygons — point-driven tessellation, when the cells should follow the data rather than a regular lattice.
- Adaptive Voronoi Polygons — near-equal-area cells molded to a boundary, between this tool's regularity and Voronoi's data-following.
- Estimated Shortest Path through Points — order the point patterns into an efficient field survey route for hiking to every station.