EqualEarthProjection.frink

Download or view EqualEarthProjection.frink in plain text format


/** This program demonstrates the use of the country polygons in
    Country.frink to draw a map of the world.  It can be readily altered to
    draw the map in your favorite projection.  This demonstrates the
    Equal Earth projection:

    https://en.wikipedia.org/wiki/Equal_Earth_projection
    https://www.equal-earth.com/equal-earth-projection.html

    Original paper:
    https://sci-hub.se/https://doi.org/10.1080/13658816.2018.1504949
*/


use Country.frink

g = new graphics
g.stroke[0.001]
g.font["SansSerif", "bold", 1 degree]

// Iterate through all countries.
for [code, country] = Country.getCountryList[]
{
   cc = new color[randomFloat[0,1], randomFloat[0,1], randomFloat[0,1], .8]
   first = true
   for poly = country.borders  // Iterate through polygons in a country.
   {
      p = new filledPolygon   // This polygon is the filled country
      po = new polygon        // This is the outline of the country
      for [long, lat] = poly  // Iterate through points in polygon
      {
         [x,y] = latLongToXYEqualEarth[lat degree, long degree, 0 degree]
         p.addPoint[x, -y]
         po.addPoint[x, -y]
      }

      // Draw filled countries
      g.color[cc]
      g.add[p]

      // The polygons in Country.frink are sorted so the first polygon is the
      // largest. Just label the largest.
      if first
      {
         [cx, cy] = p.getCentroid[]
         g.color[0,0,0]
         g.text[code, cx, cy]
      }

      // Draw country outlines
      g.color[0.2, 0.2, 0.2, 0.8]
      g.add[po]

      first = false
   }
}


g.invertGrays[].show[]
g.write["EqualEarth.svg", 2048, undef]
g.write["EqualEarth.png", 2048, undef]
g.write["EqualEarth.html", 1000, 500]


/** Convert a latitude, longitude, and optional center longitude (long0)
    into x,y coordinates.

    returns
     [x ,y]
*/

latLongToXYEqualEarth[lat, long, long0 = 0 degrees] :=
{
   // The EqualEarth projection uses an "auxiliary angle" theta where theta is
   // given by
   // sin[theta] = sqrt[3]/2 sin[lat]
   //   or, solving for theta:
   // theta = arcsin[1/2 3^(1/2) sin[lat]]
   theta = arcsin[1/2 3^(1/2) sin[lat]]

   A1 = 1.340264
   A2 = -0.081106
   A3 = 0.000893
   A4 = 0.003796

   long1 = (long - long0)

   x = (2 sqrt[3] long1 cos[theta]) / ( 3 (9 A4 theta^8 + 7 A3 theta^6 + 3 A2 theta^2 + A1))
   y = A4 theta^9 + A3 theta^7 + A2 theta^3 + A1 theta
   return [x,y]
}


Download or view EqualEarthProjection.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 20152 days, 21 hours, 49 minutes ago.