Geographic Distortions​
​George Varnavides, 01/29/2021
◼
  • I’ve long been fascinated with transportation maps, and in particular the revolutionary re-design of the london-underground map by Harry Beck in 1933.
  • ◼
  • In his iconic design, which has since been adopted by most transportation maps, Harry Beck deliberately sacrifices geographic accuracy for visual clarity of information - by using equally-spaced stations on straight lines with only 45/90 degree bends
  • ◼
  • Here, we show how the local coordinate system is distorted through the years as more stations get added to display the information clearly
  • ◼
  • A note on the old transportation map figures:
  • ◼
  • I’ve had these on my machine from an old visual information project
  • ◼
  • I don’t believe these are publicly available on the web, so I’ll refrain from attaching these on the post
  • ◼
  • Contact me if you’re interested, and I can point you to where I got them from
  • ◼
  • References:
  • ◼
  • Beineke D. Verfahren zur Genauigkeitsanalyse fur Altkarten. Munchen: Universitat der Bundeswehr; 2001.
  • ◼
  • Jenny, Bernhard, and Lorenz Hurni. “Studying cartographic heritage: Analysis and visualization of geometric distortions.” Computers & Graphics 35.2 (2011): 402-411.
  • London Underground Maps

    ◼
  • First, we start by importing a number of these old transportation maps
  • In[]:=
    SetDirectory[NotebookDirectory[]];​​londonUndergroundMapFiles=FileNames["london_underground_map_*.png","maps"];​​years=ToExpression[StringSplit[#,{"_","."}][[-2]]]&/@londonUndergroundMapFiles​​Do[​​distortedMap[year]=Import[StringTemplate["maps/london_underground_map_`1`.png"][year]],{year,years}]
    Out[]=
    {1933,1938,1940,1944,1945,1946,1948,1949,1951,1958,1960,1964,1968,1970,1972,1973,1977,1985,1987,1990,1994,1999,2009,2011,2016,2020}
    ◼
  • The original Harry Beck 1933 map
  • In[]:=
    Rasterize[distortedMap[1933],RasterSize600]
    Out[]=
    ◼
  • The current (May 2020) London underground map
  • ◼
  • While a great many new stops have been added, the map is still faithful to the original style
  • In[]:=
    Rasterize[distortedMap[2020],RasterSize600]
    Out[]=
    ◼
  • This can be compared to a geographically-accurate map of the London Underground (from 2014)
  • In[]:=
    geographicallyAccurateMap[2014]=Import["maps/geographically_accurate_map_2014.png"];​​Rasterize[geographicallyAccurateMap[2014],RasterSize600]
    Out[]=

    Reference Points

    ◼
  • In order to compare the transportation maps to the geographically accurate one, we require a set of reference points in the respective coordinate systems
  • ◼
  • The obvious choice is to use the stations available at that point in time
  • In[]:=
    referencePointFiles=FileNames["image_dims_reference_points_*.txt","reference_points"];​​referenceYears=ToExpression[StringSplit[#,{"_","."}][[-2]]]&/@referencePointFiles​​Do[​​referencePoints[year]=Import[StringTemplate["reference_points/image_dims_reference_points_`1`.txt"][year],"Data"],{year,referenceYears}]
    Out[]=
    {1933,1938,1940,1945,1946,1948}
    ◼
  • These were tediously collected in image dimension units, using `Get Coordinates`
  • ◼
  • I tried automating this briefly using Image Processing, but couldn’t get satisfactory results
  • ◼
  • Any advice on this would be greatly appreciated!
  • Global Transformations

    ◼
  • First, the maps have different coordinate systems (and often image dimensions/aspect ratios)
  • ◼
  • So we find the best global transformation to align the ‘geographically accurate’ locations to the transportation map’s coordinate system
  • In[]:=
    undergroundMapPoints[year_]:=referencePoints[year][[All,2;;3]]​​geographicallyAccuratePoints[year_]:=referencePoints[year][[All,4;;5]]
    In[]:=
    globalTransformation[year_]:=Block[{error,tf},​​{error,tf}=FindGeometricTransform[undergroundMapPoints[year],geographicallyAccuratePoints[year],Method"Linear",TransformationClass"Similarity"];​​tf]
    ◼
  • Superimposing the two we get
  • In[]:=
    {undergroundMapPoints[1933]//Point,Red,globalTransformation[1933][geographicallyAccuratePoints[1933]]//Point}//Graphics
    Out[]=

    Displacement Vectors

    ◼
  • A simple way of visualizing the distortion, is simply to associate each reference point to where it would like had the map been ‘as accurate’ as the geographically accurate locations
  • ◼
  • Meaning we’ll draw displacement vectors from the transportation map stations to the respective locations following our global transformation
  • Distortion Grids

    ◼
  • To go further, we wish to setup a local grid and see how it transforms to accommodate the displacement vectors
  • ◼
  • We start with a regularly spaced grid spanning the geographically accurate map’s coordinate system
  • ◼
  • and distort it (rotate, scale, translate) according to the global transformation above
  • ◼
  • A (hacky) way of joining nearest points to display a grid
  • ◼
  • We can the use a multi-quadratic interpolation to extract the local grid displacements to match the displacement vectors
  • ◼
  • where U, V are vectors of horizontal and vertical displacement vectors respectively,
  • ◼
  • and a,b are the vectors of local transformation parameters we’re trying to fit
  • ◼
  • The distorted grid’s displacement vectors are then given by the weighted sum:
  • ◼
  • Putting everything together to construct our displacement grid:
  • ◼
  • And overlay the distortion grid on our transportation map
  • ◼
  • And a look at the first six London underground distorted grid maps