LivingstoneJS
Since childhood, I have loved maps. My bedroom was decorated with wall maps of the US and world, and I was the only kid I knew who had his own globe. Later, when I left college, I was asked to build a website for our church’s district. Because one of the district’s priorities was to plant new churches, I started working on tools to help prospective church planters see potential communities. This led me to begin tinkering with interactive maps APIs. As I studied how they worked, my knowledge of coding exploded, and I began pushing myself to build increasingly challenging things.
Eventually, these APIs began to change. Syntax changes were annoying but manageable. More problematic was when features and functionality were suddenly discontinued. Then it happened: the service I was using started demanding money if you used it more than a given rate. This was like a shot across the bow, and I decided I needed to have a viable, free alternative for clients.
At the same time, I was still learning a lot about drawing using JavaScript and <canvas> elements, and I had just begun reading about WebGL. Therefore, I decided to build an open-source Maps API using Open Street Maps mapping imagery and canvas, with the ultimate goal of incorporating WebGL if it made sense. The result was LivingstoneJS.

LivingstoneJS was intended to be simple to implement and familiar for coders accustomed to creating apps using Google, Bing, and/or Yahoo! Maps APIs. It was also designed to allow the placement of markers and shapes, custom map types, and more. I also wanted to incorporate support for scrollwheel and touch interfaces, including pinch-to-zoom.
I never did get around to adding WebGL because it did not seem there was a need, but LivingstoneJS did reach the point where I was able to deploy it in a couple of projects.
Try it right now! https://jgeerdes.com/LivingstoneJS
LivingstoneJS could definitely stand to be updated. Refactoring the code to utilize let and other, more modern conventions would be a worthwhile endeavor.
-Jeremy
