## Experiments & Toys Here you'll find a collection of prototypes, experiments &amp; pet projects I'm working on. ### <a name="webmapping"><span class="catTitle">Web Mapping</span></a> I used to do &amp; program [GIS](http://www.esri.com), make maps, and generally geek out about cartography and am having a lot of fun right now playing with what's possible with modern web mapping frameworks. - [Watch the Buses and Trains](https://apps.quarkspring.com/bus/): A simple web app that shows the real-time locations of Portland [Trimet](http://www.trimet.org) buses and trains. > + On the back-end, I'm using [Python](http://www.python.org) with my favorite web framework [Flask](http://flask.pocoo.org/). > An [Esri Shapefile](https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf) > of [Trimet route stop data](http://developer.trimet.org/gis/) was unprojected from State Plane ft to geographic > using [QGIS](http://www.qgis.org) and then loaded into a [SQLite](https://www.sqlite.org) table with a custom schema. > + On the front-end, I'm using the beautiful [Semantic UI](http://semantic-ui.com/) CSS framework into which I load a [Leaflet](http://www.leafletjs.com) > map control. The map control is loaded with a base layer from [OpenStreetMap](http://www.openstreetmap.org/) centered > on Portland, OR. > + When a user zooms in on an area and clicks the 'Go' button, the app makes an ajax call to fetch the Trimet stops > inside the current map viewport and draws them on the map. Then a JavaScript timer is set to make periodic ajax calls to > fetch the current location of buses and trains in that viewport using the [Trimet location API](http://developer.trimet.org/ws_docs/vehicle_locations_ws.shtml). > When that callback returns, the location of the vehicles is updated on the map using a custom Leaflet marker > with a [label](https://github.com/Leaflet/Leaflet.label) indicating the vehicle's destination. > The next improvement I'll make will be to cache vehicle locations in [Redis](http://www.redis.io) so that I'm not > making redundant calls to the Trimet location API. ---