Thoughts
I write mostly about tools I like, projects I'm working on, and things that are puzzling me. Here are some of my recent pieces.
Choropleths, Four Ways
Ah, the humble choropleth. Given that its name is almost universally mispronounced outside of cartography circles (looking at you "chloropleth" 👀), it's somewhat funny that this is one of the most recognizable map styles out there.
Nov. 10, 2022
On Being a Student Again
I head back to classes again this week as part of my Ph.D. at Berkeley and, before I do, I wanted to take a moment to reflect on and share my experience returning to school after 5 and a half years. While in industry, I didn’t make time for a regular reflection practice — I always figured my annual reviews were supposed to help me do that. Looking back, I see that a workplace annual review is not especially well-suited to meaningful self-reflection. Your focus is on considering the value you bring to the company you’re working for, not evaluating whether or not the work is still meaningful to you. You reflect on your year in highlights, but you don’t, as Mike Bostock advises , think critically about if you’re still enjoying the day-to-day.
Jan. 18, 2022
The State of Reason in 2021
If you, like me, find a bizarre pleasure in the relentless churn of the JavaScript ecosystem, you may remember a period just a few years ago when some members of the community began toying with an interesting idea: What if we stopped using JavaScript as our main programming language for writing web applications?
Feb. 25, 2021
Playing with the Collatz Conjecture
It was a cold New Year's Eve and I was sitting at my friend Louis' dining room table in my hometown of Northampton, MA. We were both back in town for a bit from our respective locales — me from Seattle and him on a break from his Math Ph.D. at Rutgers University. Louis is one of those friends whose love for the quirky, bizarre world of mathematics has brought so much color to my life. He has a knack for making complex things simple, a trait I deeply admire. On this particular night, a few hours after the 🍾 had been popped and most folks had gone to bed, he introduced me to a tricky problem he'd been researching called the Collatz conjecture .
Jan. 8, 2021
Animating Maps by Centroid Sorting
One of my favorite flourishes when creating new maps is to animate in the individual SVG paths for the areal unit I'm using, be that a state, province, county, or U.S. House District. It gives a pleasant unfolding effect to the experience, a way to settle a map reader into the story you're trying to tell.
Nov. 2, 2020
Reflections on Renature
The end of January brought with it the conclusion of Formidable's first open source Fellowship. In just six weeks' time, Parker Ziegler brought our new physics-based animation library, , to life. To read more about the project, check out the introductory post , the technical deep dive , and our new docs site . You can also install v0.1.0 of renature from NPM today, and check out the source on GitHub.
Feb. 6, 2020
Building Physics-Based Animations with Renature
Three weeks ago , we at Formidable unveiled an exciting open source project we've been working on as part of our OSS Fellowship Program – Renature . is a physics-based animation library for React focused on building delightful UI animations using natural world forces like gravity, friction, and fluid resistance.
Jan. 20, 2020
Introducing Renature: Experimenting with Physics for UI Animation
At the beginning of December Formidable kicked off its inaugural open source fellowship . The Fellowship Program gives one employee per quarter the opportunity to pursue a novel technical idea, full-time, over the course of six weeks. The shape this idea takes is left up to the selected applicant; it can be a new open source library, a design tool like our stunning UX Deck , or technical writing that explores new practices in our ever-evolving field.
Dec. 18, 2019
End to End Testing React Applications with Cypress
Cypress has been creating a lot of buzz in the JavaScript ecosystem recently, promising a simple yet powerful API for writing integration and end-to-end tests. With an open source core written in JavaScript, you can test anything that runs in a browser, regardless of language or framework (think Reason, WASM, or Svelte). Cypress is unique in that it operates in the same run-loop as your application—client code and test code are embedded in separate iframes right next to each other and communicate over websockets. Pretty clever!
May 20, 2019
Mapping in React and D3
A lot of folks today are talking about React , the Javascript framework that lets you build performant apps and UIs quickly and efficiently. I use React almost everyday at my job and in my own open source projects, often pairing it with Redux for state management.
Aug. 29, 2017
Building Interactive D3 Dashboards with Carto Web Maps
Dashboards are all the rage these days. The talented folks at Stamen and Tableau have shown just how powerful a well-designed dashboard can be for integrating statistical and geospatial stories on a single web page. I wanted to see if I could emulate their work in an interactive web application I’ve been developing for Transportation Alternatives that explores correlations between traffic crashes and poverty in New York City. But rather than using ready-made software like Tableau, I wanted to build and design the application through code using two powerful open-source tools – CARTO and D3 . This post will go through the design process I used for building my dashboard, highlighting some of the key pieces of code needed to get CARTO and D3 talking to one another.
Sept. 26, 2016
Using NAIP Imagery and a Texture Raster to Model the Urban Forest
As high-resolution satellite imagery becomes more accessible by the day, geographers, urban planners, and ecologists have begun to explore its potential for modeling the urban forest . However, attempts at precise urban canopy classifications often run into a few predictable problems. 30m or even 15m resolution still cannot model individual street trees or isolated stands. Classification algorithms confuse grass and other scrubby vegetation for the canopy. Shadows cast by adjacent trees affect spectral returns, leading to further misclassification. In short, mapping the urban forest in an accurate, detailed, and inexpensive way remains a challenge.
Sept. 14, 2016
Building a Map of Eviction in San Francisco with CartoDB.js
Throughout this semester, through all of the small victories and the frustrations and the beautiful journey of self-directed learning, I've always had one key goal at the front of my mind – make a map, exclusively through code, that I believe in. This has become a more and more difficult challenge for me as I've expanded my cartographic skills and interests into different realms and more complex politics. I have come to expect more of myself, both in terms of the design and the aesthetics of my maps as well as the epistemologies and methodologies that underlie them. I don't know if I would necessarily go so far as to call all of my maps "lies" (as Monmonier might), but, in practicing self-reflexivity in my cartographic design process, I have learned that they are certainly far from being objective "truth". Maps reflect their creators' perspectives and views of the world; not only that, they channel particular ways of viewing, seeing, engaging with, and understanding the world that are dependent on the tools used to make them. That will always be the map's limitation. But rather than seeing maps only for their limitations, for their role as imperfect representations of a world that is inherently messy and complex, perhaps we can think of them differently – as individual experiences and expressions that can have meaning for others beyond the cartographer. Pieces of art that can inspire. Beautiful data that can inform. Little worlds unto themselves.
May 20, 2016
Help Professor Holler Build an Interactive Map for the Zuni Youth Enrichment Project (ZYEP)
Anyone familiar with the contemporary cartographic landscape knows that the climate is shifting swiftly away from the static and towards the interactive. People want maps they can play with, maps that are responsive to user needs, and maps that can be accessed with nothing more than an internet connection and a few directed search terms. Particularly for those seeking to create a community resource (or just something that folks can access on the go) a web map is a good design choice.
May 4, 2016
Presenting at the Middlebury Spring Symposium
After the high of AAG, I came back to Middlebury reinvigorated and excited to get back to work with coding. Learning Python scripting in a matter of five weeks, producing a hard coded script to solve a real-world problem, creating an abstracted geoprocessing tool for broader application, and writing my first piece of documentation all felt like significant achievements in such a short amount of time. I wanted to keep the rhythm going, to dive further into PostgreSQL and PostGIS, Javascript, interactive cartography, spatial databases, and the whole slew of crazy plans I dreamt up for myself for the rest of my semester. But before I did that, I felt it was important to share the experiences of this first half with my peers.
Apr. 18, 2016
Presenting at the American Association of Geographers (AAG) Annual Conference
The research process can so often feel like a solitary experience. Particularly working in the realm of technical geospatial applications and assorted programming languages, I often find myself deep down the rabbit hole, following links on endless Stack Exchange and Github pages to their very ends. And while I enjoy this process – the careful search for a technique or a block of code or an idea that will help me solve my problems – I have also noticed how it has brought me further from the original purpose of my research. From the beginning, I have wanted my work to serve as a pedagogical tool, a framework for how we might go about teaching GIS and cartography with a keener eye to the role of both code and critical feminist theory in this learning process. And in order to do that, I needed to take an important step during this, the middle of my semester – presenting my work.
Apr. 4, 2016
Writing Documentation for the AWR Custom Tool
Having created a custom Python geoprocessing tool to automate the process of areal-weighted reaggregation (AWR), my next task was to write documentation articulating how the tool actually works. Documentation is obviously a critical part of development – without it, the tools we create can't readily be accessed by others. These things we've poured our heart and soul into have no broader application in the world.
Mar. 24, 2016
Creating Custom Geoprocessing Tools with Python Scripts
While I think many GIS analysts cherish Python for its ability to automate large-scale geoprocessing tasks and do a lot of the heavy lifting when it comes to data management, I find that its true creative power lies in creating custom geoprocessing scripts. So just to back up for a moment, we know that all GIS applications are based on the idea of passing spatial files (i.e. shapefiles, rasters, feature classes) through script tools that do something to these files. These scripts, nowadays, are often written in Python, especially after Esri began writing all of their tools in this language. For most GIS users, however, script tools operate almost like a black box – files are passed into them and new files pop out. While we all have an understanding of what the input needs to look like and what the output should look like, what happens in the middle actually remains fairly opaque. This obscurity was something that initially frustrated me when I first began using GIS. I wanted to know more about what was actually going on "under the hood" and to be able to manipulate that process to make different things happen.
Mar. 16, 2016
Python Scripting for Automated Geoprocessing
When I first developed the syllabus for my senior research, I spent a lot of time asking fellow GIS students, professors, and analysts where they thought I should begin my study. And nearly everyone gave me the same answer – Python scripting.
Feb. 26, 2016