Projects

Some of my GIS, drone, and programming work - most is built for the Town of Braintree Engineering Department, some for conservation and academic projects.

Managing a Drone Program

In 2025-2026, I built out a municipal drone program for the Town of Braintree Engineering Department. In the spring of 2026 I earned my FAA Part 107 certification after studying at Bridgewater State University through their sUAS program, which provided a crucial background on drones. Shortly after earning my Part 107, the Engineering Department acquired an RTK-enabled DJI Matrice 4E capable of sub-centimeter positional accuracy. I use it to capture 2D orthomosaics and 3D models for site development monitoring, pre/post-paving documentation, and locating buried infrastructure before it's paved over/ Results are shared with the rest of the organization through ArcGIS Online.

I've also documented SOPs (file structure, pre-flight checklist, mission reporting, data retention, and LAANC airspace approval) so operations are scalable to future remote pilots rather than tied to my own workflows.

Read the full project →

Automating Workorders

Like many municipalities, Braintree tracks workorders, permits, and billing across separate databases that don't talk to each other, and workorders themselves have historically been managed exclusively on paper. This process has resulted in multiple trips to the office to collect, process, and return information about work done by field staff. It's an inefficient process with a single point of failure, since paper copies get lost or damaged in transit. In 2025 I began replacing that process with an ArcGIS Online web map and Experience Builder app that field staff use to record the jobs they do each day.

The solution is built on a hosted feature layer with attachments enabled, so a worker can drop a point where the work was done and photograph the job or the paper workorder itself in the same way they already edit our GIS utility data through Field Maps. A GitHub-based automation checks the layer for new records several times per day, pulls the details from them (work start/end, description, worker names, attachments) into an email, and sends it back to the office, where staff can read about each job and click through to view points on the map. This gives our office a digital source to reference when entering work into other databases, removes the need to carry paper back and forth, and preserves the work on a map for future reference.

Read the full project →

Analyzing Utility Data

EPA's MS4 permit requires municipalities to report volumes of material cleaned from drainage system catchbasins as part of annual reporting. Stormwater field staff record cleaning events in ArcGIS Field Maps, taking three measurements at each basin: clean basin depth (rim to floor, no material), depth to deepest sump (rim to the bottom rim of the deepest outflow pipe), and depth to material (rim to top of sediment). These three values allow us to estimate the volume of material cleaned per basin over time.

I developed a Python-based tool using the arcpy and arcgis modules to summarize those cleaning events on demand. It's a standalone Tkinter GUI program with buttons for 'catchbasin cleaning analysis' and 'sump depth analysis', reporting the number of catchbasins cleaned, estimated total sediment volume over a specified time interval, and other summaries of the stormwater infrastructure we maintain in ArcGIS Online. It runs on any machine with ArcGIS Pro installed and signed in to Braintree's ArcGIS organization, as long as the member has the required layers shared with them. This allows the Stormwater department to pull reportable sediment volumes as needed.

Read the full project →

Processing Utility Documents

As new water and sewer services are connected, documents are produced showing a diagram of the lateral running from the main in the street to the house - these documents are commonly referred to as water or sewer 'tie cards'. Historically they were created and stored in filing cabinets, and copies ended up filed in several places at once, so when someone updated a card the other copies quietly went out of sync. In 2025 I consolidated them into a single authoritative digital archive on Microsoft SharePoint, reorganizing the original water and sewer PDFs into a standard folder scheme: a folder per street, address sub-folders within each, and water, sewer, and sump-pump connection cards filed at the address level, with 'main gate' cards and other street-level records kept at the street level. Field workers, who previously had no way to reach these files from a phone or iPad, now have direct access to view them in the field. The archive also served as the source a contractor used to build our EPA lead-removal inventory of water service connections - pipe material, diameter, install date, and whether a service was previously lead - which we now maintain in GIS as our authoritative lead list.

Merging newly scanned cards into that archive is its own workflow, and with a backlog of several thousand cards to process it was worth automating. I created a Tkinter-based Python program that takes a folder of fresh scans (still carrying whatever random filenames the Xerox assigned), previews them one at a time, and lets the user rename each to our standard convention - 100 MAIN ST - WATER CARD, 100 MAIN ST - SEWER CARD, and so on. The program then locates the existing SharePoint file by that name and displays both side by side for cropping, page reordering or deletion, and merging, with undo/redo and a preview of the final PDF before committing the save. If no match is found, the user can search manually for a mis-named or misspelled counterpart, or choose 'create' to generate the correct folder, sub-folder, and file in place. That replaced a per-card routine of opening each PDF in Adobe or Bluebeam, cropping, renaming, and hunting down its SharePoint counterpart by hand. These days the cards trickle in a handful at a time and I handle them manually in Bluebeam, but this program is what made the original ~10,000 file backlog manageable.

Read the full project →

Automating Address and Parcel Updates

I maintain Braintree's tax parcel data to the MassGIS standard, keeping it in sync with the Assessor's office and the Registry of Deeds as properties split, merge, or get reassessed. That work includes managing a master geodatabase of parcels, assessment records, and lookup tables, publishing to ArcGIS Online through a custom 'update parcels' Python script, and generating standardized tax maps of the update/s with a script tool I built for the purpose.

I also assign and manage address numbers in GIS and maintain Braintree's Master Address Database, which was built from the MassGIS NextGen 9-1-1 format and stays linked to assessor records through a unique GIS_ID. It integrates with PermitEyes to enforce official address assignment before building permits can be issued, which keeps addressing authoritative and prevents bad / hand-typed addresses from entering the system.

Read the full project →

Analyzing Impervious Surfaces

The Stormwater department bills a utility fee on residential and non-residential properties, and while residential parcels pay a fixed fee, non-residential parcels are billed on how much impervious surface exists on them. As properties are developed or boundaries change, that number changes too, so it has to be routinely recalculated and compared against historical data to keep our billing database accurate. I produced an automated, parcel-level comparison of impervious surface change using ArcPy geoprocessing workflows and custom scripts, calculating the impervious area that actually exists on each non-residential parcel and comparing it to the value being billed and to prior years.

Most of the time those numbers align closely, but the analysis surfaces parcels that appear to be over- or under-billed. Often that's an artifact of an imperfect impervious surface dataset, but in some cases it's a genuine billing discrepancy worth investigating. The analysis runs in ArcGIS Pro and exports cleanly to an Excel table that the Stormwater department can use to check parcels against the billing system and update it accordingly.

Read the full project →

Monitoring Hydrant Flushing

In 2024 I began developing an ArcGIS Online solution for monitoring fire hydrant flushing operations. Field workers in the Water and Sewer department needed a way to visualize and track flushing on a map, store multiple records per hydrant, and see at a glance which hydrants had been flushed and which hadn't. I worked closely with field staff to understand their needs before architecting a solution that would benefit them in the field as well as office staff.

The result lets staff view hydrants by flush status, condition, service (i.e. out of order), pressure (i.e. high / low), manufacturer, and other properties. That same information is useful to the Fire Department, which can check current hydrant operation status and pressure to respond to emergencies more effectively.

Read the full project →

Using a Survey-grade GPS

In 2025, the Engineering Department purchased an Emlid Reach RX RTK-enabled GPS unit to support GIS data collection workflows. It connects to the MaCORS RTK network over NTRIP to improve positional accuracy to sub-centimeter, and pairs with ArcGIS Field Maps as an external receiver in place of the significantly less capable GPS built into a mobile device.

Using maps I've produced, staff reposition existing features like fire hydrants and manholes (or add new ones) almost exactly where they are in real life, which pays off for anyone later looking for an asset buried by ground or snow. We started with one unit to see how easy it was to use and how much use we'd get from it; it was successful enough that we bought a second. The Water & Sewer department uses the original day-to-day, and the Stormwater department uses the other to update our drainage system data, slowly improving the accuracy of our utility datasets over time.

In the summer of 2025 our intern used the Reach RX to map out headstones in town-managed cemeteries. The GPS was later used by another intern in the summer of 2026 to map the locations of memorial signs and Hometown Hero banners around town. These datasets resulted in two public-facing web apps I made to share the legacies of the commemorated individuals: our Cemetery Viewer and Memorial Viewer.

Read the full project →

Creating a Map Grid and Street Name Index

Many of the maps I produce share the same standard layout: a map area with the usual elements (title, legend, scale bar, north arrow, description) and a sidebar street list keyed to a grid on the map (A1, B1, A2, B2, and so on), broken up alphabetically so someone can find a street name and go straight to the right cell. That requires the grid to exist as a feature class, with each cell as a feature, so cell values can be spatially joined to the streets - and it requires every map using it to share the same extent, which I enforce by adding the town boundary polygon to each map (toggled off if necessary) and using ArcGIS Pro's 'fit extent' (Alt + click layer) on a standard-size 36"x36" map template. I drew the initial rectangle from inside an activated map layout so it sized closely to the actual map window element, then used a Python script to divide it into a reasonable grid and enrich it with the correct cell values.

The street list needed its own cleanup, since our master MassDOT roads dataset often carries multiple features per road (different segments, non-continuous roads). I dissolved a copy of the roads layer on road name to create a single feature per unique name, split that by the grid, then de-duplicated again keeping only the longest segment per name - so each road is labeled in the cell it overlaps most, rather than in every cell it touches, or a cell it only partially clips. Spatially joining that result back to the grid produces a list of unique street names each tied to a single grid cell value, and a custom Arcade script drives a Text (distinctValues list) layout element that draws the list in the sidebar.

Read the full project →

Land Preservation Society of Norton

The Land Preservation Society (LPS) of Norton is a small non-profit land conservation organization I have been involved with since 2018. Over that time, LPS has served as an informal GIS learning ground for me. I've GPS-mapped trail systems, developed trail maps, and created interactive GIS applications for the organization. LPS also became the case study for my Master's thesis in GIS, giving me the chance to apply academic research methods to a real conservation challenge I already knew well. Recently I joined the Board of Directors, and continue to provide volunteer GIS support to LPS through the Technology Committee.

View the LPS website →
View the interactive trail map →

Master's Thesis

I present a case study on applying ArcGIS software to support the mission of a small Massachusetts conservation group, the Land Preservation Society of Norton. The project includes custom ArcGIS Pro tools built with ModelBuilder and ArcPy, a curated geodatabase of statewide data layers used throughout the analysis, and an ArcGIS StoryMap that walks through the methodology. The thesis focuses on two analyses.

Wildlife corridor prediction. The Parcel Acquisition tool generates theoretical wildlife corridors between conserved habitats, using least-cost paths as a proxy for identifying high-priority parcels for land acquisition.

Habitat fragmentation potential. The Fragmentation Potential tool generates a raster layer indicating how likely a core wildlife habitat is to become fragmented, based on proximity to roads and buildings.

Viewed together, the outputs of both tools highlight areas that conservation groups may prioritize for land acquisition. This turns fragmentation risk and corridor connectivity into a decision-making tool that is repeatable by other conservation groups for any town in Massachusetts.

View the story map →
Download the thesis PDF →

Code and Tools

Alongside the project work above, I maintain two public repositories of standalone utilities. The GIS toolbox collects ArcPy scripts and ArcGIS Pro script tools built for recurring municipal tasks - creating flight boundaries for drone missions, converting annotation to point features, and calculating geodesic centroids, among others. The Python toolbox holds general-purpose desktop utilities designed for packaging with PyInstaller, including a QR code generator, a URL shortener, a file tree viewer, and a PDF page rotator.

ArcGIS Pro tools and toolbox →
General Python tools →

I occasionally build small/personal web maps with QGIS and Leaflet, as a free alternative to ArcGIS. This one is a trail map of the Blue Hills Reservation in Canton, MA.

Blue Hills Trail Map →