If you've read this blog before, you've probably heard us talk about our core mission at ZacTax: to provide tools to help cities make better decisions. This mission drives so many of the decisions we make about ZacTax, and it's taken us to places we never expected to go when we started. We want you to be able to get the answers you need, quickly, so you can get on to the business of running your town. Whether that's finding ways to surface important information, connecting dots, or making it easier for you to map your data, it all boils down to helping you make better decisions.
When we started incorporating property tax data, we quickly identified a challenge that would need to be solved at some point. Mapping is important with sales tax analysis, but it's integral for good property tax analysis. Throwing a few thousand parcel polygons on a map is one thing, but when you start increasing that by orders of magnitude, things quickly start to fall apart.
Not only does it take forever to load that much data, the map quickly becomes sluggish. It's very difficult to get quick answers when you can't pan or zoom your map.
We tried a lot of different, often hacky, approaches to solve this problem: asynchronously loading data; incrementally loading data; incrementally loading data coupled with a local cache; fetching data sequentially... At the end of the day, nothing worked well enough to serve our mission.
There has to be a solution, right?
You don't always start working on a problem knowing that a solution exists. Many issues that local governments deal with on a day-to-day basis don't necessarily have "answers", just different ways of approaching them, each with their own sets of pros and cons.
But with mapping, we knew that a solution existed. After all, Google, Apple, Microsoft, ESRI, and the hordes of mapping providers manage to do this. What can we learn from them?
If you've never paid attention to how these systems work, it's actually quite clever. They use a grid-based system that divides the world into rows and columns of tiles that vary in size depending on the zoom level. As you pan and zoom, the map fetches the visible tiles and displays them. Tiles can be rasterized images or resolution-independent vector data, and once they're downloaded, they're displayed on the map. Maybe we can do the same thing?
Fortunately, the world of open source software came to the rescue. Mapbox has built and open sourced a command-line tool called Tippecanoe, which enables you to build tilesets from raw geographic data with fine-grained control over zoom levels, feature density, and more. Armed with this new superpower to build our own vector tilesets, we just needed to build a system to serve them to our mapping interface. A little more help from the open source community provided a crude implementation of a tileserver, which we were able to learn from in order to create our own (which is also open source, so you can use it if you'd like).
Toward blazingly fast map rendering
With these tools in hand, we were able to build an automated system that allows us to dynamically create and serve our own tilesets at will. Each tileset is optimized for the city using it. Smaller cities with less data will see parcel polygons at all zoom levels, while larger cities will switch from parcels to points when zooming far enough out. We can send custom metadata for each map feature to the browser, allowing for seamless and dynamic styling as well as real-time analytics operations. And all of this is as smooth and performant as if you were just looking at the base map layer.
Optimization is a funny thing at times. It often forces you to choose between competing values, and that means you have to think about your priorities ahead of time in order to make the right choices. If you try to optimize too soon, you often end up doing a lot of work that ends up being unnecessary; if you wait too long, you may have built up a lot of baggage that can be difficult to overcome. But if you keep your core principles in mind and stay open to changing how you do things, you can often come up with a solution that ticks all of the necessary boxes.
If our core value was anything other than "helping you make better decisions," we might have been satisfied with a lesser result. But we weren't willing to sacrifice on that mission. We're extremely excited to be able to offer something we felt was a core feature for property tax analysis in a way that's every bit as performant and powerful as what our clients have come to expect from our sales tax analysis platform.