Proof of concept for a technique for visualizing Census
Tract level data on a map. The goal of this technique is to
provide a performant map where you can pan and zooom,
approximating a choropleth map. The problem with rendering
all census tracts as a choropleth map is that there are just
too many, and even WebGL struggles to render so many
geometries.
Elements of this technique:
- Index census tracts in an
R-tree
- Sample census tract data values over a uniform grid (which
corresponds to the leaf nodes of a quadtree) using the
R-Tree
- Index the uniform grid in a
Quadtree
- Aggregate data values up the quadtree using averaging
- Query the quadtree based on the map viewport and a size
threshold
- Adjust the color scale based on the extend of those values
- Render the values as colored rectangles using Canvas
The idea is that this is a precursor to computing a dynamic
contour map.
Limitations of this Technique
- We reach a resolution limit on the grid. Anything beyond
11 levels of quadtree subdivision takes more than 5
seconds to compute.
Future directions
- Sample data based on rectangles - Since we are
sampling data from census tracts, the most accurate way to
do this would be to consider all census tracts that
intersect or are contained within a grid rectangle,
compute the geometry of their intersection with the grid
rectangle, and then compute a weighted average of their
data values using the area of the intersecting geometries
as the weight.
- Sample Dynamically - Ideally when you zoom in beyond
the precomputed level of detail, an additional level of
detail would be computed, but just for the visible area.
This could be done by keeping track of when we request to
view nonexistent quadtree nodes, and for each of those we
compute a new sample from the census tracts data, and add
those as new entries to the quadtree. This one improvement
would make this technique dramatically more scalable - to
the entire US at all zoom levels, including zoomed into
dense urban areas (which currently are out of reach due to
the resolution limitation of the grid).