GIS · Spatial Analysis · Portland, OR
I map rivers reopening, oaks counted, birds resting.
I'm a GIS analyst with nine years of professional web development behind me. I build
spatial datasets with documented schemas, run the analysis, and publish the results as
maps and dashboards you can open in a browser.
Selected work
2026
01 · Analysis + Web GIS
Oregon Dam Removal Tracker
ArcGIS Pro
AGOL
Python
This project involved compiling a statewide geodatabase of 95 dam removals in
(mostly) Oregon from federal and NGO sources (American Rivers, NID, NOAA), and
publishing a hosted feature layer with an interactive Web Map and Dashboard. I
joined the dam locations to NHDPlus flowlines and traced upstream to estimate that
the dam removals reopened roughly
1,750 river miles of fish habitat. I used spatial
joins to StreamNet, ODFW, and NOAA/USFWS critical habitat layers to identify the
endangered species affected by each dam removal. The layer follows a 24-field schema
with a data dictionary that records the source, method, and fill rate for every
attribute.
Open the dashboard
→
View in AGOL
→
02 · Field Data Collection
Oregon White Oak Survey
Field Maps
ArcGIS Pro
AGOL
A mobile field-data-collection tool for surveying individual Oregon white oak (Quercus garryana): tree condition, conifer encroachment, restoration priority, etc. The form uses
attribute domains, conditional form logic, required fields, and photo attachments,
with a schema modeled on Washington Department of Fish and Wildlife and BLM Salem
District oak-woodland protocols.
Open in Field Maps
→
View in AGOL
→
The Field Maps link opens the survey in the ArcGIS Field Maps mobile app.
03 · Data Science / Python
Osprey Migration Rest Stops
pandas
scikit-learn
DBSCAN
ArcGIS Pro
Where do osprey (Pandion haliaetus) stop to rest during their migration?
These locations are important for conservationists to protect, in addition to the
species' summer and winter locations. Even though
this study
was intended for a different purpose, I wanted to see if I could use the data from
it to detect these locations. I wrote a Python script that uses
Net Squared Displacement
to flag stationary segments and clusters them with
DBSCAN
to find shared stopovers. It identified
78 stopovers, 24 of them shared.
View the poster
→
View the repo
→