Forest Fragmentation Explained
On this page
Problem statement
When forest is cleared, what remains is not simply less forest. It is forest broken into pieces, with more edge per hectare, less interior, and wider gaps between the pieces. Edges are hotter, drier and windier than interiors; they burn more easily, lose large trees faster, and are avoided by species that need interior conditions. A landscape can keep half its forest and lose most of its interior habitat.
Fragmentation is the structure of what is left, and it has its own vocabulary: patches, edge density, core area, connectivity. Each measure answers a different ecological question and each depends on choices β pixel size, connectivity rule, edge depth β that decide the number.
Quick answer
Four families of measures describe a fragmented landscape:
| Family | Measure | Question |
|---|---|---|
| area | forest share, largest patch index | how much, and how much in one piece |
| subdivision | number of patches, mean patch size | how broken up |
| edge | edge density (m/ha) | how much is exposed |
| core | core area share at a given depth | how much interior survives |
import numpy as np, rasterio
from scipy import ndimage
with rasterio.open("rondonia_gfc.tif") as src: # Hansen stack, reading guide
treecover, lossyear, datamask = src.read()
f2000 = (treecover > 30) & (datamask == 1)
def describe(f):
lab, n = ndimage.label(f, structure=np.ones((3, 3)))
sizes = np.bincount(lab.ravel())[1:]
core100 = ndimage.binary_erosion(f, iterations=4) # 4 pixels β 110 m
return (100 * f.mean(), 100 * sizes.max() / f.sum(), n, 100 * core100.sum() / f.sum())
print(f"{'forest share':>13}{'largest patch':>15}{'patches':>9}{'core β₯ ~100 m':>15}")
for y in (2000, 2012, 2024):
f = f2000 & ((lossyear == 0) | (lossyear > y - 2000)) if y > 2000 else f2000
fs, lp, n, core = describe(f)
print(f"{y}: {fs:>7.0f}%{lp:>14.0f}%{n:>9,}{core:>14.0f}%")
forest share largest patch patches core β₯ ~100 m
2000: 46% 57% 14,079 50%
2012: 33% 8% 20,197 36%
2024: 26% 4% 25,871 28%
The forest share falls from 46% to 26%, but the largest patch collapses from 57% of the forest to 4%, and the number of patches almost doubles. Each measure describes a different part of the same process.
Loss versus fragmentation, patches, edge, core
1. Distinguish habitat loss from fragmentation
Losing forest area is habitat loss. Breaking the remaining area into more, smaller, more isolated pieces is fragmentation. They usually happen together and have different consequences; measures should separate them.
2. Define the patch
A patch is a connected set of forest pixels. Four-connectivity (shared edges) or eight-connectivity (edges and corners) changes patch counts; state which.
3. Measure edge relative to area
Edge density β metres of forest edge per hectare of landscape β compares landscapes of different sizes. Edge length alone does not.
4. Choose an edge depth for core area
Edge effects on microclimate reach roughly 100 m into tropical forest; tree mortality and fire effects further. Core area at the chosen depth measures interior habitat.
5. Consider connectivity
Distance between patches decides whether animals and seeds can move between them. Nearest-neighbour distance and graph-based connectivity indices add that dimension.
Same area, different structure
The data used on this page
The RondΓ΄nia window used throughout the forest guides (63.0Β°β62.5Β°W, 10.8Β°β10.3Β°S): Hansen Global Forest Change v1.12 β tree cover in 2000, the year of loss, and the data mask β read from Google's storage into a three-band rondonia_gfc.tif, as in the Hansen reading guide.
import os
import rasterio
from rasterio.windows import from_bounds
W, S, E, N = -63.0, -10.8, -62.5, -10.3
V = "GFC-2024-v1.12"
if not os.path.exists("rondonia_gfc.tif"):
bands = []
for name in ("treecover2000", "lossyear", "datamask"):
url = f"https://storage.googleapis.com/earthenginepartners-hansen/{V}/Hansen_{V}_{name}_10S_070W.tif"
with rasterio.open(url) as src:
window = from_bounds(W, S, E, N, src.transform)
bands.append(src.read(1, window=window))
profile = src.profile | {"count": 3, "width": bands[0].shape[1], "height": bands[0].shape[0],
"transform": src.window_transform(window), "compress": "deflate",
"driver": "GTiff", "tiled": False}
profile.pop("blockxsize", None)
profile.pop("blockysize", None)
with rasterio.open("rondonia_gfc.tif", "w", **profile) as dst:
for i, band in enumerate(bands, start=1):
dst.write(band, i)
with rasterio.open("rondonia_gfc.tif") as src:
print(src.count, src.shape, src.crs, src.res)
3 (2000, 2000) EPSG:4326 (0.00025, 0.00025)
Example 1 β same area, different structure
side = 300
one_block = np.zeros((side, side), bool)
one_block[75:225, 75:225] = True # 150 Γ 150 block
pieces = np.zeros((side, side), bool)
for r in range(0, side, 60):
for c in range(0, side, 60):
pieces[r + 5:r + 5 + 33, c + 5:c + 5 + 33] = True # 25 blocks of 33 Γ 33
print(f"one block: {one_block.sum():,} pixels; 25 pieces: {pieces.sum():,} pixels")
for name, f in (("one block", one_block), ("25 pieces", pieces)):
edge = f & ~ndimage.binary_erosion(f)
core = ndimage.binary_erosion(f, iterations=4)
print(f"{name:<10} edge pixels {edge.sum():>6,}, core share {core.sum() / f.sum():.0%}")
one block: 22,500 pixels; 25 pieces: 27,225 pixels
one block edge pixels 596, core share 90%
25 pieces edge pixels 3,200, core share 57%
A synthetic landscape isolates the structural effect. The 25 pieces hold a fifth more forest than the single block, yet have more than five times its edge and a core share of 57% against 90%. More forest, less interior: that is fragmentation without habitat loss.
Example 2 β edge depth
f24 = f2000 & (lossyear == 0)
for depth_px, label in ((1, "~27 m"), (4, "~110 m"), (11, "~300 m"), (36, "~1 km")):
core = ndimage.binary_erosion(f24, iterations=depth_px)
print(f"core at {label:>6}: {core.sum() / f24.sum():.0%} of 2024 forest")
core at ~27 m: 61% of 2024 forest
core at ~110 m: 28% of 2024 forest
core at ~300 m: 9% of 2024 forest
core at ~1 km: 1% of 2024 forest
Even one pixel in from the edge, 39% of the forest left in 2024 is edge. At the ~100 m depth of microclimate effects only 28% counts as core; at the depth of fire and large-mammal effects almost none does. The appropriate depth depends on which organism or process the question is about.
Example 3 β the largest patch collapses
prev = None
for y in range(2000, 2025, 2):
f = f2000 & ((lossyear == 0) | (lossyear > y - 2000)) if y > 2000 else f2000
lab, _ = ndimage.label(f, structure=np.ones((3, 3)))
lp = np.bincount(lab.ravel())[1:].max() / f2000.sum()
if prev is not None and prev - lp > 0.05:
print(f"{y}: largest patch fell from {prev:.0%} to {lp:.0%} of the 2000 forest")
prev = lp
print(f"2024: largest patch {prev:.0%} of the 2000 forest")
2002: largest patch fell from 57% to 16% of the 2000 forest
2004: largest patch fell from 16% to 8% of the 2000 forest
2024: largest patch 2% of the 2000 forest
The largest patch does not decline smoothly: it drops in steps when a clearing finally cuts through a connecting strip. Those thresholds are where a landscape changes from a forest with clearings into clearings with forest remnants.
Why edges matter, and the largest patch collapses
Why edges matter ecologically
At a forest edge, sun and wind reach into the stand. Temperatures rise, humidity falls, large trees die more often and fires spread in from the pasture. In Amazonian studies these effects are measurable 100 m or more into the forest. A fragmented forest therefore behaves like a smaller one than its area suggests.
Why the largest patch index is sensitive
Connectivity through a landscape can depend on a few narrow strips. When one is cleared, a large patch splits into two; the largest patch index drops abruptly even though little area was lost. That makes it an early indicator of structural change.
Why measures depend on resolution
Coarser pixels merge nearby patches and fill narrow gaps; finer pixels separate them. Patch counts and edge lengths change with pixel size, and comparisons across datasets of different resolution are unreliable.
Study-area cuts, linear gaps and regrowth
- Study area boundaries cut patches; patches touching the boundary are incomplete.
- Linear gaps (roads, rivers) narrower than a pixel may not appear.
- Regrowth can reconnect patches; loss-only data cannot show it after 2012.
- FRAGSTATS and pylandstats compute dozens of landscape metrics; most are variants of the four families.
- Matrix quality matters too: forest surrounded by old regrowth is less isolated than forest surrounded by soy.
Internal links
- How to measure forest fragmentation β the computations
- Fragmentation metrics change with resolution β the fix guide
- How to measure deforestation near roads β what creates the pattern
- Forest definitions explained β what counts as a forest pixel
- Biodiversity metrics explained β why structure matters for species
- How to map forest loss hotspots with H3 β where the change is
FAQ
What is forest fragmentation?
The breaking of forest into smaller, more isolated pieces with more edge and less interior.
Is fragmentation the same as deforestation?
No. Deforestation removes area; fragmentation changes the structure of what remains. They usually happen together.
What is edge density?
The length of forest edge per unit of landscape area, usually metres per hectare.
What edge depth should I use for core area?
About 100 m for microclimate effects in tropical forest; more for fire and some species. State the depth.
Why did the largest patch drop suddenly?
A clearing cut through the strip connecting two large parts of one patch.
Do fragmentation metrics depend on resolution?
Yes. Patch counts and edge lengths change with pixel size.