Thoughts on code, digital cartography, and technology.

Code Galleries Journal Tech Blog

Using GitHub Issues as a Simple Static CMS

· 5 min read

Why use a complex CMS when you can use GitHub Issues as a lightweight blogging engine!

Journal | Read More →

A Reflection on FOSS4G North America 2025

· 3 min read

A six-hour drive each way through the hills of West Virginia to our nation’s capital might not be on everyone's to do list, but for my visit to FOSS4GNA it was definitely worth it. The chance to meet and mingle with people who generously share their knowledge of coding, data, and theory in a niche field is something that's difficult to replicate via video meetups, forums or social media.

Journal | Read More →

Filtering Arrays in MapLibre

· 3 min read

Techniques for Substring Matching in MapLibre GL JS and Mapbox GL JS

Tech Blog | Read More →

Folly Beach 2025

Gallery | Folly Beach 2025

Get Audio Info using ffmpeg

ffprobe \
  -v error \
  -select_streams a:0 \
  -show_entries stream \
  -of default=noprint_wrappers=1 \
  "input.m4a" | sed 's/=/:/'
Code | Read More →

Batch Convert Audio with ffmpeg

for f in *.flac; do ffmpeg -v warning -i "$f" -map_metadata 0 -b:a 192k "${f%.flac}.mp3"; done
Code | Read More →

Update for May 2025

· 1 min read

A look back on what I've been up to over the past four months.

Updates | Update →

Update for January 2025

· 1 min read

A look back on what I've been up to since my last update.

Updates | Update →

ShpShifter

· 3 min read

Preview, Convert, and Filter SHP, GPKG, GeoJSON & GeoParquet in the Browser

Tech Blog | Read More →

Mapping Disasters

· 5 min read

Find Open Satellite Imagery from Maxar, Capella, Umbra, and Wyvern

Tech Blog | Read More →

Palisades Fire Before and After

· 5 min read

A Sample of Available Satellite Data for Post-Disaster Visual Assessment

Tech Blog | Read More →

Disposing an OpenLayers Map

  const layers = map.getLayers().getArray();
  layers.forEach((layer) => {
    const source = layer.getSource();
    if (source && source.dispose) {
      source.clear();
      source.dispose();
    }
    if (layer.disposeInternal) {
      layer.disposeInternal();
    } else if (layer.dispose) {
      layer.dispose();
    }
    map.removeLayer(layer);
  });
  const olCanvas = map.getViewport().querySelector("canvas");
  if (olCanvas) {
    const gl = olCanvas.getContext("webgl") || olCanvas.getContext("webgl2");
    if (gl) {
      const loseContext = gl.getExtension("WEBGL_lose_context");
      if (loseContext) {
        loseContext.loseContext();
      } 
    }
  }
  map.getInteractions().clear();
  map.getOverlays().clear();
  map.dispose();
  map.setTarget(null);
Code | Read More →

Refactor Web Journal

· 2 min read

I originally created this site to be a simple web 2.0 blog site with text entries for thoughts that did not fit into my work-related geospatial blog. However, as I found myself creating more bespoke sites, both for a specific hobby and also as an outlet for my web development curiosity, I realized I needed a landing page for all the feeds to come together. To date I have a photo site, a geospatial blog, this site, and a music site which is still in development. So I thought why not combine all these feeds into one place, and tag on my esoteric journal entries - and what better place than my personal domain name (how lucky is that!).

Journal | Read More →

Deck GL and 3D Tiles

· 3 min read

Generate Colorized 3D Tiles from LiDAR and Ortho Imagery

Tech Blog | Read More →

Introducing Ancestral Audio

· 3 min read

Using whisper and AI to transcribe audio and generate thematic clips

Journal | Read More →

Finding Perpendicular lines with TurfJS

· 6 min read

Bearing, LineIntersect & Destination

Tech Blog | Read More →

MapCompare

· 2 min read

Rendering Comparisons of Vector Tiles and COGs in Web Mapping Libraries

Tech Blog | Read More →

GeoJSON Network Trace Tool

· 4 min read

Trace a GeoJSON Linear Network in the Browser

Tech Blog | Read More →

H3 Grids Explorer

· 2 min read

A Web Tool for Exoploring H3 & Geohash Grids

Tech Blog | Read More →

Potocki Vodka Store Finder

· 3 min read

A Responsive Map-Focused Store Finder

Tech Blog | Read More →

Serverless Web Maps

· 5 min read

Using SQLite in the Browser and Service Workers to Power Web Maps from Object Storage

Tech Blog | Read More →

City of Lancaster Public Transit

· 3 min read

A NodeJS GTFS Feed & Interactive Map Generator

Tech Blog | Read More →

Peaks 3D Visualization

· 2 min read

An Exporation of the Highest Mountain Peaks in the US

Tech Blog | Read More →

Export GeoJSON from PostgreSQL using Beekeeper Studio

· 5 min read

Query > Download > Copy > Paste!

Tech Blog | Read More →

FOSS4G Image Processing

· 5 min read

Creating Cloud Optimized GeoTIFFs and Raster Tiles using GDAL and QGIS

Tech Blog | Read More →

Generating Cloud Optimized GeoTIFFs and Raster Tiles with GDAL

· 5 min read

TL;DR gdalbuildvrt, gdal_translate, gdal_warp and gdaladdo

Tech Blog | Read More →

Wedding Website

· 5 min read

A Single-Page Wedding Wedsite with an Interactive Map

Tech Blog | Read More →

Pandemix Data Visualization

· 4 min read

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

Tech Blog | Read More →

Tilequery

· 2 min read

Query Remote Vector Tiles in Node JS and the Browser

Tech Blog | Read More →

From the Ashes of Shapefiles

· 6 min read

A Presentation for the 2020 Virtual Ohio GIS Conference

Tech Blog | Read More →

GIS and Remote Work

· 3 min read

An Exploration of a GIS Remote Work Toolkit

Tech Blog | Read More →

Exporting AGOL Feature Services to GeoJSON

· 3 min read

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

Tech Blog | Read More →

Ohio COVID-19 Dashboard

· 6 min read

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

Tech Blog | Read More →

RTK to WGS84

· 2 min read

Transforming Coordinates with JavaScript using proj4.js

Tech Blog | Read More →

Highlighting Features in Mapbox GL JS

· 6 min read

A Comparison of Filter and Feature-State

Tech Blog | Read More →

Network Tracing with Turf JS

· 6 min read

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

Tech Blog | Read More →

Progressive Web Apps

· 5 min read

Using PWA Components for Web Maps

Tech Blog | Read More →

Open Parcel Viewer

· 3 min read

A Client-Side Parcel Viewer built with Leaflet

Tech Blog | Read More →

Leaflet Store Locator

· 4 min read

A Leaflet Version of the Original Mapbox JS Store Locator Example

Tech Blog | Read More →

Intro to Turf JS

· 2 min read

Geospatial Analysis for the Browser, Desktop & Server

Tech Blog | Read More →

Mapping with Vector Tiles

· 3 min read

Query Features Outside the Viewport

Tech Blog | Read More →

GPX Visualize

· 3 min read

A Visualization for GPS Tracks

Tech Blog | Read More →

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

· 4 min read
Tech Blog | Read More →

Web Maps from Scratch

· 6 min read

An Introduction to Leaflet, GitHub & Jekyll

Tech Blog | Read More →

What is a Map?

· 2 min read

Marshall Univerity 2016 GIS Day Keynote

Tech Blog | Read More →

Beyond the Desktop

· 5 min read

Open Source Experiments in Web Mapping

Tech Blog | Read More →

Jekyll, Leaflet and TurfJS

· 2 min read

Open Source Tools for Web Mapping

Tech Blog | Read More →

Leaflet & GeoJson Tiles

· 5 min read

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

Tech Blog | Read More →

Shagbark Product Locator Map

· 3 min read

A Locator Map with Search and Nearest Store Finder

Tech Blog | Read More →

CartoDB Visualizations

· 5 min read

One Data Set Four Ways

Tech Blog | Read More →

A Modern Leaflet Toolbar

· 3 min read

Horizontal Toolbars in Leaflet

Tech Blog | Read More →

Conkle's Hollow Fall Hike

· 5 min read

Mapping GPS Tracks with Leaflet

Tech Blog | Read More →

Intro to Leaflet

· 5 min read

A Presentation for the 2015 Ohio GIS Conference

Tech Blog | Read More →

Leaflet Photo Map

· 4 min read

A Trip Out West circa 1985

Tech Blog | Read More →

Hosting a GeoJson on GitHub

· 6 min read
Tech Blog | Read More →