First due = Station 17, Arnold, Maryland
Ray Bell, Volunteer Fire Fighter I
In my Fire I class, the instructor emphasized the phrase, "know your first due." Your "first due" is the primary response area your station is responsible for. The second and third dues are neighboring districts where you provide mutual aid when incidents escalate or staffing is limited.
I live in Anne Arundel county, Maryland. The Anne Arundel is split up into 47 stations (Wikipedia table; aacounty.org; map). Note: I've been using Cloudflare's markdown endpoint to get a markdown file of a website. If you want to extract the data from aacounty.org you can do:
echo "Name,Address" > fire_stations.csv
for page in {0..7}; do
curl -s -X 'POST' "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_NUMBER}/browser-rendering/markdown" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${CLOUDFLARE_BROWSER_RENDERING_API_KEY}" \
-d "{\"url\": \"https://www.aacounty.org/fire-department/about-us/fire-station-office-locations?page=${page}\"}" \
| jq -r '.result' \
| perl -0777 -ne '
while (/## \[(.*?)\]\([^)]+\)\s*\n+(.*?)\s*\[Get Directions\]/sg) {
$name = $1;
$address = $2;
$address =~ s/\xc2\xa0//g;
$address =~ s/^\s+|\s+$//g;
print "\"$name\",\"$address\"\n";
}' >> fire_stations.csv
sleep 1
done
Each of these stations are assigned a territory which can be found here. We'll grab the data for Station 17 (station, territory, hydrants and calls):
import geopandas as gpd
import pandas as pd
url = "https://opendata.aacounty.org/datasets/AnneArundelMD::fire-stations-2.geojson"
station_gdf = gpd.read_file(url).query("COMPANY == '17'")
station_gdf.to_file("station_17.geojson", driver="GeoJSON")
url = "https://opendata.aacounty.org/datasets/6c4deb51fd6a43d99766a653860ab518_8.geojson"
territory_gdf = gpd.read_file(url).query("COMPANY == '17'")
territory_gdf.to_file("first_due_17.geojson", driver="GeoJSON")
url = "https://opendata.aacounty.org/datasets/f533de6aad7e4c0686b356f6f38e07f2_13.geojson"
hydrants_gdf = gpd.sjoin(gpd.read_file(url), territory_gdf, predicate="within")
hydrants_gdf.to_file("hydrants_17.geojson", driver="GeoJSON")
url = "https://opendata.aacounty.org/datasets/bef0cbe25cf34ef7af537c4b4fe31a59_0.csv"
calls_df = pd.read_csv(url).query("IncidentLocationFireDistrict == '17'").to_csv("calls_17.csv", index=False)
Company 17 (Arnold, Maryland). Station in center and hydrants are in red.
There is no substitute for seat time; nothing beats learning your first due like riding the district and seeing every corner firsthand. Understanding the specific layout of residential structures is vital—that knowledge becomes a lifeline when a building is charged with smoke and your visibility drops to zero.
When you aren't on the engine or ambo, you can explore the first due from the comfort of an armchair using Google Maps and Street View. To take it a step further, you can use Google Maps grounding in Gemini to create a "fly-by" application. This allows you to virtually navigate the territory while asking specific questions about landmarks, access points, or hydrant locations.
Fly by app of Arnold for Fire Fighters. Built using google AI studio
Satellite embeddings are an essential tool for modern geographic analysis. By condensing diverse, multi-spectral satellite data into a single, high-dimensional representation, they allow us to capture the "essence" of a landscape.
I will grab Google Alpha Earth data for Arnold:
import geopandas as gpd
import numpy as np
import rioxarray
import xarray as xr
gdf = gpd.read_file("first_due_17.geojson")
minx, miny, maxx, maxy = gdf.total_bounds
ds = xr.open_zarr(
"s3://us-west-2.opendata.source.coop/tge-labs/aef-mosaic/",
storage_options={"anon": True}
).sel(time=2025, x=slice(minx, maxx), y=slice(maxy, miny))
ds = ((ds / 127.5) ** 2) * np.sign(ds)
ds = ds.rio.write_crs("epsg:4326").rio.clip(gdf.geometry, gdf.crs)
ds.to_zarr("alpha_earth_17.zarr")
You can do so many things with the satellite embeddings:
Water access point mapping: the satellite embeddings can identify shoreline, marina, and water-adjacent pixels. You could extract a map of every accessible water entry point in your first due — piers, boat ramps, beach access, rocky shoreline — and note which have road access.
Vegetation / brush fire risk zones: the embeddings distinguish dense tree canopy from structures cleanly. You can create a map showing where vegetation and buildings are intermixed (wildland-urban interface). Arnold has wooded residential streets that could carry fire from brush to structure.
Similarity search: "find me everything that looks like this" Given any lat/lon (say, a property where a serious incident occurred), you can extract that pixel's 64-number fingerprint and find the N most visually similar locations across the whole first due. Useful for: "we had a bad fire at this house type — where are all the others?"
Impervious surface / flood staging: High impervious surface areas (parking lots, rooftops, pavement) have high runoff. Combined with terrain, this helps identify where water accumulates — relevant for both water rescues and water supply.
Dead-end / access complexity, Cul-de-sacs and single-access neighborhoods have a distinct satellite signature (radial street pattern, more green space). You could flag these for apparatus positioning awareness.
I did some clustering to find similar points which showed:
Dense residential areas
Ritchie Highway commercial corridor
Wooded areas
Spatial residential areas
Water front areas
Clustering with Google Alpha Earth Satellite embeddings
I pulled data from the US census for economic tracts that overlap for 17's first due. (see here).
Behind every census tract is a set of variables that changes how we fight a fire. Looking at the data for Arnold, we see that 40.2% of homes were built pre-1980. In the fire service, that number tells us to expect different construction materials and potentially faster fire spread compared to modern code-compliant builds. When you combine that with a 15.2% population over age 65, your search and rescue profile changes instantly.
Census data for station 17