Background Image of a River

Projects & Posts

City of Lancaster Public Transit

A NodeJS GTFS Feed & Interactive Map Generator

This project consists of a NodeJS script that generates a GTFS feed and interactive map. The only requirements are a GeoJSON routes file, a GeoJSON and stops file, and a handful of static GTFS text files. The result is a feed that can be published to Google, Transit, or any transit feed service, as well as an interactive map with schedules for each route. The schedules can be fixed route with specific times or loop routes that run every hour.

Peaks 3D Visualization

An Exporation of the Highest Mountain Peaks in the US

An exploration of the Mapbox GL JS 3D terrain functions, using the tallest US mountain peaks in each state as the study subject. Each map view in this demo project was carefully selected to provide an excellent view of the peak and its surroundings. The terrain extrusion still has a tendency to crash browsers.

Export GeoJSON from PostgreSQL using Beekeeper Studio

Query > Download > Copy > Paste!

Beekeeper Studio is an open source SQL editor written in NodeJS and Vue JS. The UI is clean and simple, and it has just the right amount of tools to get the job done. The query interface even has a handy Download button to export the ...

FOSS4G Image Processing

Creating Cloud Optimized GeoTIFFs and Raster Tiles using GDAL and QGIS

This is a talk I gave at the 2021 Ohio GIS Conference. It outlines an open source pipeline for creating Cloud Optimized GeoTIFFs and raster tiles from a collection of TIFF files....

Generating Cloud Optimized GeoTIFFs and Raster Tiles with GDAL

TLDR: gdalbuildvrt, gdal_translate, gdal_warp and gdaladdo

The following outlines the basic steps for generating Cloud Optimized GeoTIFFs and raster tiles from one or more raw TIFF files....

Wedding Website

A Single-Page Wedding Wedsite with an Interactive Map

This single-page website features image modals, an interactive map and a contact form. The website is bundled with the Parcel bundler and hosted with Netlify which also takes care of form reponses.

Pandemix Data Visualization

What if all US COVID Deaths occurred in one geographic area?

This project is based on the amazing map Brazilian Lupa. It uses a dot density visualization to represent deaths from US COVID-19 clustered in one geographic area. The populations are based on US Census Block Groups, with one dot representing 20 US deaths. All statistics are generated client-side using vector tiles and web-workers

From the Ashes of Shapefiles

A Presentation for the 2020 Virtual Ohio GIS Conference

This talk describes the slow and painful migration from a legacy GIS data structure of hundreds of shapefiles to a modern setup using a mix of Postgres, QGIS and ArcPro. Many small organizations and municipalities face this issue and it is one that is sure to resonate even with those supporting a...

GIS and Remote Work

An Exploration of a GIS Remote Work Toolkit

In the aftermath of the Coronavirus pandemic, remote work may well be come the new normal, as businesses and government agencies discover that productivity can be maintained or even increased when implementing remote work options. And the tools to implement this transition at the employee level a...

Exporting AGOL Feature Services to GeoJSON

Using NodeJS and Batches to Transform an ArcGIS Online Feature Service to GeoJSON

Recently I had the need to pull data from ArcGIS Online into a Mapbox GL JS web map. While it would be possible to use the WMS publishing feature in AGOL to display this layer, what would be ideal is to have access to the raw data. The data also needs updated on a regular basis, so manually downl...

Ohio COVID-19 Dashboard

A Simple, Client Side Tracking Dashboard for COVID-19 in Ohio

Update: This visualization is no longer being updated. There are a wide variety of authoritative COVID-19 trackers on the internet, including ones from Bing, Google, National Geographic, the New York Times, as well as the sites listed at the bottom of this post. Please refer to these for the ...

RTK to WGS84

Transforming Coordinates with JavaScript using proj4.js

In my day job we recently completed a project to field locate our water utility assets using a high-accuracy GPS unit. Now that this data is online and accessible in our web maps, our field crews requested a method to locate these assets again using GPS if need be, for instance if there is a foot...

Highlighting Features in Mapbox GL JS

A Comparison of Filter and Feature-State

Creating a hover effect is a great way to add interactivity to web maps. In mapbox-gl there are two main methods to accomplish this feature: setFeatureState() and setFilter(). Up until now (late 2019) I had been using the setFilter method to create a highlig...

Network Tracing with Turf JS

A Client Side Solution for Simple Upstream and Downstream Linear Network Analysis

A primary focus of my day job is managing utility datasets for a small municipality. I am currently in the process of taking a simple database of lines and points and turning it into a true utility network. One of the benefits of having this new seamless database is to perform network traces. Thi...

Progressive Web Apps

Using PWA Components for Web Maps

The GitHub repository with all the code needed to follow along with this presentation can be found at The live demo is available at

Open Parcel Viewer

A Client-Side Parcel Viewer built with Leaflet

The Open Parcel Viewer is a client-side application written in plain javascript and jquery. It is capable of rendering up to 50k polygons on desktop and mobile. The app uses Leaflet as the mapping api and Jekyll as a build tool. Color, initial map center/zoom and the search field can be defined i...

Leaflet Store Locator

A Leaflet Version of the Original Mapbox JS Store Locator Example

This simple, responsive store locator is based on the original Mapbox JS example, tweaked to use Leaflet 1.0 and custom icons. The sidebar uses a jQuery filter function (thanks jsfiddle). The nearest store function uses TurfJS, b...

Intro to Turf JS

Geospatial Analysis for the Browser, Desktop & Server

This presentation was given at the 2018 Ohio GIS Conference. The NodeJS example is hard-coded from a real-world example in the original presentation and has been replaced with the estimated response time....

Mapping with Vector Tiles

Query Features Outside the Viewport

The goal of my original post on client-side web mapping for large datasets was to create an inexpensive, robust county-wide parcel viewer web application. The base functionality would include the ability to both identify and sear...

GPX Visualize

A Visualization for GPS Tracks

This pojects uses the medium of GPS tracks to explore the linking of charts and maps. The application has a dark and light theme with custom map styles for each. The display can be exported to a an image by clicking in the upper right corner of the visualization.

Data-Driven Styling, 3D Polygons & Vector Tiles with Mapbox GL JS


Web Maps from Scratch

An Introduction to Leaflet, GitHub & Jekyll


What is a Map?

Marshall Univerity 2016 GIS Day Keynote


Beyond the Desktop

Open Source Experiments in Web Mapping


Jekyll, Leaflet and TurfJS

Open Source Tools for Web Mapping

This presentation was given at the Northeast Ohio GIS Sympoisum on August 25, 2016. The primary objective was to give an overview of using LeafletJS in the real world, using actual data. In addition, I show a quick example using ...

Leaflet & GeoJson Tiles

A County Parcel App: No GIS Server? No Problem!

Update 2017-08-01 This app has seen two more iterations. These each utilize an mbtiles-server to host the vector tiles, but still use client-side search for the data. The updated examples can be viewed here - a Leaf...

Shagbark Product Locator Map

A Locator Map with Search and Nearest Store Finder

Using the original Mapbox JS store locator example as a starting point, the Shagbark map adds a couple of unique features including store text search and a nearest store locator. The project pulls data from a Google Sheet in NodeJS while building. This allows the client to easily update store locations and available products. Custom icons with the client logo are used to mark store locations. An open source version of this store locator is available on GitHub.

CartoDB Visualizations

One Data Set Four Ways

The maps above use the same data set, visualized using four different map types in the CartoDB web interface. The torque map in the header uses the feature id for the time variable so it serves no analytic purpose, but it makes for a nice effect....

A Modern Leaflet Toolbar

Horizontal Toolbars in Leaflet

This is my take on a more modern looking leaflet toolbar/ui. With leaflet-search as the base, and a few short lines of css, I have customized the .leaflet-top.leaflet-left class so that it adds tools across the top of the screen, with ...

Conkle's Hollow Fall Hike

Mapping GPS Tracks with Leaflet

One of the benefits of using the open source Leaflet mapping library is the wide variety of available community supported plugins. This simple map uses two great plugins - Leaflet Elevation and ...

Intro to Leaflet

A Presentation for the 2015 Ohio GIS Conference


Leaflet Photo Map

A Trip Out West circa 1985

Update: This map originally used Google’s Picasa Web API, but this will soon be shut down. Instead of migrating to another Google service, I simply extracted the EXIF data from the photos (...

Google MyMaps, Leaflet and ArcGIS Online

This is a quick look at Leaflet, Google MyMaps and Esri’s ArcGIS Online....

Hosting a GeoJson on GitHub

GitHub will host and preview your geojson files! Geomusings gives a good explanation of some pros and cons. Here is an example of a geojson stored on GitHub, then shared. GitHub takes care of the rendering via ...

Google Drive Fusion Tables

Update: Google has deprecated Google Fusion Tables....

Raster Catalogs

Here I explain how to create a raster catalog in order to have a mosaic of a set of images. This way you can always add or change the images instead of just creating a static mosaic. I also find it much easier than dealing with the other ways of creating mosaic catalogs, etc....

Desktop to the Cloud: GIS Cloud and Rasters

One of the clients I work with utilizes unmanaged raster catalogs as part of their work flow. We manage over 20 raster catalogs with close to 4gb of imagery in both georeferenced jpgs and regular tifs. The imagery is black and white for the most part, some using the cg4 compression to get insanel...

Animating Urban Growth via the ArcMap Time Slider

One Hundred Years of Urban Growth in Ten Seconds

This video shows the growth of urban infrastructure from 1850 (blue) through to the present (red). I utilized the time/timeslider/export video feature of ArcMap to produce the video. I suffered numerous crashes while attempting to utilize the time slider in a meaningful way into my actual product...

Use Only Selected Features in Model Builder

This little trick came from GIS stack exchange. To run a model using only selected features, open your model and in the model builder window right click and select ‘Model Only Tools/Calculate Value’. In the ‘Expression’ box type:...