Urban growth reshapes watershed hydrology: more impervious surface means more runoff, more flood risk, and less groundwater recharge. Knowing where a city will expand lets planners act before the change happens.
The model produces a prediction, built from observed transitions and validated against what actually happened.
- Delineate watershed from DEM (Fill → Flow Direction → Flow Accumulation → Snap → Watershed).
- Reclassify NLCD 2010 & 2020 into 5 classes.
- Compute the 2010→2020 Markov transition matrix in Python.
- Build CA spatial factors: distance to roads, highways, facilities, plus 3×3 neighborhood influence.
- Calibrate weights & threshold against observed 2020, then simulate 2030.
The Markov matrix quantifies how likely each land cover was to change between 2010 and 2020. Built land was highly stable (>99% stays built), while barren, agriculture, and forest fed the growth.
Neighborhood influence (β4 = 7) was the dominant driver: new growth clusters next to existing development.
| From \ To | Built | Barren | Forest | Agri |
|---|---|---|---|---|
| Built | 0.994 | 0.004 | 0.001 | 0.001 |
| Barren | 0.041 | 0.901 | 0.045 | 0.012 |
| Forest | 0.022 | 0.045 | 0.932 | 0.001 |
| Agriculture | 0.032 | 0.087 | 0.000 | 0.880 |

I compared the model's predicted 2020 against observed 2020. The strong match confirmed the model before I used it to forecast 2030. The 2030 simulation shows continued growth near the city core and along highways.


The model is driven by two Python scripts, both on GitHub:
markov_transition_matrix.pyreads the 2010 and 2020 land-cover rasters and computes the Markov transition count and probability matrices with NumPy and rasterio.calibration_figure_of_merit.pycompares the simulated 2020 built-up map against observed 2020 to compute the Figure of Merit, false positives, and false negatives (arcpy + NumPy).
- Drivers limited to proximity and neighborhood (next: demographics, economics, policy, climate).
- Two-date Markov assumes stationary transitions; 30 m resolution; single watershed.
Read the code
Python scripts (Markov matrix + calibration), README, and all maps on GitHub.