Work
City of Lake Forest • Police Department

Police Transparency
Dashboard

ArcGIS Experience Builder application backed by an automated Python pipeline that geocodes, categorizes, anonymizes, and publishes crime incident data for public consumption.

ArcGIS Experience Builder ArcGIS Online Python Geocoding Public Safety
~92%
Time reduction per update
5 min
Automated update run
60–90
Minutes — previous manual process
01

The Problem

Context

The City of Lake Forest's police department needed a public-facing tool to communicate where crime incidents had occurred in the community — a standard transparency need for municipal police departments. But the raw data they had to work with was a messy export from their records management system: inconsistent address formats, unstandardized incident categories, and no spatial component.

Manual burden

Before this project, publishing an update meant manually cleaning the spreadsheet, geocoding addresses one by one, sorting incidents into display-ready categories, and hand-placing the data into whatever publishing workflow was in use. Each update cycle consumed 60 to 90 minutes of staff time — a significant load for a recurring operational task.

Privacy constraint

Crime incident addresses can't simply be published at the parcel level. Specific addresses can identify victims, expose residents, or create legal exposure. Any public tool had to find the right level of geographic detail — informative enough to be useful, aggregated enough to protect individual addresses.

02

The Solution

Public dashboard

Built an ArcGIS Experience Builder application as the public-facing interface — a spatial dashboard giving residents a clear, map-based view of where incident types have occurred across the city. The Experience Builder platform made it straightforward to configure layout, filtering controls, and display logic without custom front-end development.

Automated Python pipeline

Wrote a Python script that takes the raw police department export and handles the full processing chain automatically: geocoding addresses from the messy PD format, categorizing and sorting incidents into display-ready types, anonymizing location points by rolling them up to 100-block zones, and posting the processed dataset directly to ArcGIS Online via the REST API. An update that previously required 60–90 minutes of manual work now runs in approximately 5 minutes.

The anonymization decision

The 100-block zone approach was the key design choice. Rather than suppress all location data or display precise addresses, the script rolls each incident's coordinates to the midpoint of its 100 block (e.g., "400–499 Main St" becomes a single representative point). This gives residents meaningful neighborhood-level context — "there have been vehicle break-ins in this part of town" — without exposing the precise residential or commercial address involved. It's the right level of aggregation for public consumption.

03

Result & Impact

Operational impact

The update process dropped from 60–90 minutes of manual staff work to a 5-minute automated script run — approximately 92% time reduction. Staff no longer need to manually clean addresses, geocode individual records, or hand-sort categories before publishing. The pipeline handles all of it consistently, every time.

Public transparency

The City of Lake Forest now has a maintained, public-facing tool that communicates crime incident patterns to residents — meeting a genuine community transparency need that previously had no adequate solution.

Privacy-conscious design

The project demonstrates that privacy-sensitive public data doesn't require choosing between transparency and protection. The 100-block aggregation approach is a replicable pattern for any municipality facing the same tradeoff with crime data, code enforcement records, or similar incident datasets.

Privacy & Ethics Note

Address anonymization was a deliberate design requirement, not an afterthought. Rolling coordinates to 100-block zones protects individual addresses — including potential victim residences — while preserving the spatial patterns that give the data its public value. The script enforces this transformation consistently; there is no manual step where a specific address could accidentally appear in the published layer.

Technologies used

ArcGIS Experience Builder

Public-facing dashboard application — map view, incident type filtering, and display configuration without custom front-end development.

ArcGIS Online

Hosted feature layer for the processed incident data. The Python pipeline posts updates via the ArcGIS REST API, keeping the published layer current.

Python

Core automation script handling geocoding, incident categorization, 100-block anonymization, and ArcGIS Online publishing via the REST API.

Geocoding

Address standardization and geocoding applied to the raw PD export — converting messy, inconsistent address strings into spatial coordinates.

ArcGIS REST API

Programmatic layer updates — the Python script pushes processed data to the hosted feature layer via REST, eliminating the need for manual publishing steps.

More work like this