Strip map
Version with labels
Creating an automatic strip map based on some geographic features and a chosen "spine." The approximate steps:
- Pick a LineString (e.g. the California coast) to straighten out.
- Simplify that LineString.
- Turn that simplified LineString into a set of zones, one per segment.
- Rotate/translate each zone to its destination position, anchoring it to the end of the previous segment and rotating it to match the desired angle (e.g. horizontal).
- Warp the contents of each zone to the resulting rectangle with a bilinear warp.
Steps 4 & 5 are separate for this demo but they could be calculated in a single step in real life.
Some issues:
- There are some faint seams between zones, maybe some sort of clipping / subpixel artifact.
- This requires making a separate copy of all the features for each zone, which is not super-efficient. Instead you could probably use some sort of point-in-polygon test and put the warping functions from each zone together into some compound projection function.
- Depending on the rotation angle of the final map, the features involved, and the shape of the zones, a feature that extends way past the zone can sort of "curl" over itself when it gets warped, which flips the content of a zone to the wrong side. This could probably be avoided by actually geographically clipping everything ahead of time so that it doesn't extend way beyond the area of interest for the final map.
- A tiny difference in float precision can make a big difference in the warping math, so for now it truncates everything to six decimal places.
See also:
Line simplification
Ribbon Map of the Father of Waters
Lake Michigan Unfurled
Unrolling Maryland
Warp-off
John Ogilby's Britannia Atlas
California Coastline Ring
A Linear View of the World: Strip Maps as a Unique Form of Cartographic Representation