content: {-# LANGUAGE OverloadedStrings #-}
  
  --
  -- Based on the Elm VegaLite GalleryGeo.elm (from development of version
  -- 1.13.0)
  --
  module Gallery.Geo (testSpecs) where
  
  import Graphics.Vega.VegaLite
  
  -- import qualified Data.Text as T
  
  import Prelude hiding (filter, lookup, repeat)
  
  testSpecs :: [(String, VegaLite)]
  testSpecs = [ ("geo1", geo1)
              , ("geo2", geo2)
              , ("geo3", geo3)
              , ("geo4", geo4)
              , ("geo5", geo5)
              , ("geo6", geo6)
              , ("geo7", geo7)
              , ("geo8", geo8)
              , ("geo9", geo9)
              ]
  
  
  {-| No borders around maps
  -}
  cfg :: [ConfigureSpec] -> PropertySpec
  cfg =
      configure
          . configuration (ViewStyle [ ViewNoStroke ])
  
  
  geo1 :: VegaLite
  geo1 =
    let countyData =
          dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json"
          [ TopojsonFeature "counties" ]
  
        unemploymentData =
          dataFromUrl "https://vega.github.io/vega-lite/data/unemployment.tsv" []
  
        trans =
          transform
          . lookup "id" unemploymentData "id" (LuFields [ "rate" ])
  
        proj = projection [ PrType AlbersUsa ]
  
        enc = encoding
              . color [ MName "rate", MmType Quantitative, MSort [ Descending ] ]
  
    in toVegaLite [ cfg [], width 500, height 300, countyData
                  , proj, trans [], enc [], mark Geoshape [] ]
  
  
  geo2 :: VegaLite
  geo2 =
      let
          enc =
              encoding
                  . position Longitude [ PName "longitude", PmType Quantitative ]
                  . position Latitude [ PName "latitude", PmType Quantitative ]
                  . size [ MNumber 1 ]
                  . color [ MName "digit", MmType Nominal ]
      in
      toVegaLite
          [ cfg []
          , description "US zip codes: One dot per zipcode colored by first digit"
          , width 500
          , height 300
          , projection [ PrType AlbersUsa ]
          , dataFromUrl "https://vega.github.io/vega-lite/data/zipcodes.csv" []
          , transform (calculateAs "substring(datum.zip_code, 0, 1)" "digit" [])
          , mark Circle []
          , enc []
          ]
  
  
  geo3 :: VegaLite
  geo3 =
      let
          des =
              description "One dot per airport in the US overlayed on geoshape"
  
          backdropSpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json" [ TopojsonFeature "states" ]
                  , mark Geoshape []
                  , encoding (color [ MString "#eee" ] [])
                  ]
  
          overlayEnc =
              encoding
                  . position Longitude [ PName "longitude", PmType Quantitative ]
                  . position Latitude [ PName "latitude", PmType Quantitative ]
                  . size [ MNumber 5 ]
                  . color [ MString "steelblue" ]
  
          overlaySpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/airports.csv" []
                  , mark Circle []
                  , overlayEnc []
                  ]
      in
      toVegaLite
          [ cfg []
          , des
          , width 500
          , height 300
          , projection [ PrType AlbersUsa ]
          , layer [ backdropSpec, overlaySpec ]
          ]
  
  
  geo4 :: VegaLite
  geo4 =
    let backdropSpec =
          asSpec
          [ dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json" [ TopojsonFeature "states" ]
          , mark Geoshape []
          , encoding (color [ MString "#eee" ] [])
          ]
  
        airportsEnc =
          encoding
          . position Longitude [ PName "longitude", PmType Quantitative ]
          . position Latitude [ PName "latitude", PmType Quantitative ]
          . size [ MNumber 5 ]
          . color [ MString "gray" ]
  
        airportData =
          dataFromUrl "https://vega.github.io/vega-lite/data/airports.csv" []
          
        airportsSpec =
          asSpec
          [ airportData
          , mark Circle []
          , airportsEnc []
          ]
  
        trans =
          transform
          . filter (FEqual "origin" (Str "SEA"))
          . lookup "origin" airportData "iata" (LuAs "o")
          . lookup "destination" airportData "iata" (LuAs "d")
  
        flightsEnc = 
          encoding
          . position Longitude [ PName "o.longitude", PmType Quantitative ]
          . position Latitude [ PName "o.latitude", PmType Quantitative ]
          . position Longitude2 [ PName "d.longitude" ]
          . position Latitude2 [ PName "d.latitude" ]
  
        flightsSpec =
          asSpec
          [ dataFromUrl "https://vega.github.io/vega-lite/data/flights-airport.csv" []
          , trans []
          , mark Rule []
          , flightsEnc []
          ]
  
    in toVegaLite
          [ cfg []
          , description "Rules (line segments) connecting SEA to every airport reachable via direct flight"
          , width 800
          , height 500
          , projection [ PrType AlbersUsa ]
          , layer [ backdropSpec, airportsSpec, flightsSpec ]
          ]
  
  
  geo5 :: VegaLite
  geo5 =
      let
          enc =
              encoding
                  . shape [ MName "geo", MmType GeoFeature ]
                  . color [ MRepeat Row, MmType Quantitative, MSort [ Descending ] ]
  
          statesData =
            dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json"
                        [ TopojsonFeature "states" ]
  
          spec =
              asSpec
                  [ width 500
                  , height 300
                  , dataFromUrl "https://vega.github.io/vega-lite/data/population_engineers_hurricanes.csv" []
                  , transform (lookup "id" statesData "id" (LuAs "geo") [])
                  , projection [ PrType AlbersUsa ]
                  , mark Geoshape []
                  , enc []
                  ]
      in
      toVegaLite
          [ cfg []
          , description "Population per state, engineers per state, and hurricanes per state"
          , repeat [ RowFields [ "population", "engineers", "hurricanes" ] ]
          , resolve (resolution (RScale [ ( ChColor, Independent ) ]) [])
          , specification spec
          ]
  
  
  geo6 :: VegaLite
  geo6 =
      let
          des =
              description "US state capitals overlayed on map of the US"
  
          backdropSpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json" [ TopojsonFeature "states" ]
                  , mark Geoshape []
                  , encoding (color [ MString "#ccc" ] [])
                  ]
  
          overlayEnc =
              encoding
                  . position Longitude [ PName "lon", PmType Quantitative ]
                  . position Latitude [ PName "lat", PmType Quantitative ]
                  . text [ TName "city", TmType Nominal ]
  
          overlaySpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/us-state-capitals.json" []
                  , mark Text []
                  , overlayEnc []
                  ]
      in
      toVegaLite
          [ cfg []
          , des
          , width 800
          , height 500
          , projection [ PrType AlbersUsa ]
          , layer [ backdropSpec, overlaySpec ]
          ]
  
  
  geo7 :: VegaLite
  geo7 =
    let backdropSpec =
          asSpec
          [ dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json" [ TopojsonFeature "states" ]
          , mark Geoshape []
          , encoding (color [ MString "#eee" ] [])
          ]
  
        airportsEnc =
          encoding
          . position Longitude [ PName "longitude", PmType Quantitative ]
          . position Latitude [ PName "latitude", PmType Quantitative ]
          . size [ MNumber 5 ]
          . color [ MString "gray" ]
  
        airportData =
          dataFromUrl "https://vega.github.io/vega-lite/data/airports.csv" []
  
        airportsSpec =
          asSpec
          [ airportData
          , mark Circle []
          , airportsEnc []
          ]
  
        itinerary =
          dataFromColumns []
          . dataColumn "airport" (Strings [ "SEA", "SFO", "LAX", "LAS", "DFW", "DEN", "ORD", "JFK", "ATL" ])
          . dataColumn "order" (Numbers [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ])
  
        trans =
          transform
          . lookup "airport" airportData "iata"
              (LuFields [ "latitude", "longitude" ])
  
        flightsEnc =
          encoding
          . position Longitude [ PName "longitude", PmType Quantitative ]
          . position Latitude [ PName "latitude", PmType Quantitative ]
          . order [ OName "order" ]
  
        flightsSpec =
          asSpec
          [ itinerary []
          , trans []
          , mark Line []
          , flightsEnc []
          ]
  
    in toVegaLite
          [ cfg []
          , description "Line drawn between airports in the U.S. simulating a flight itinerary"
          , width 800
          , height 500
          , projection [ PrType AlbersUsa ]
          , layer [ backdropSpec, airportsSpec, flightsSpec ]
          ]
  
  
  geo8 :: VegaLite
  geo8 =
      let geoData =
            dataFromUrl "https://vega.github.io/vega-lite/data/us-10m.json" [ TopojsonFeature "states" ]
  
          enc =
              encoding
                  . shape [ MName "geo", MmType GeoFeature ]
                  . color [ MName "pct", MmType Quantitative, MSort [ Descending ] ]
                  . row [ FName "group", FmType Nominal ]
      in
      toVegaLite
          [ cfg []
          , description "Income in the U.S. by state, faceted over income brackets"
          , width 500
          , height 300
          , dataFromUrl "https://vega.github.io/vega-lite/data/income.json" []
          , transform (lookup "id" geoData "id" (LuAs "geo") [])
          , projection [ PrType AlbersUsa ]
          , mark Geoshape []
          , enc []
          ]
  
  
  geo9 :: VegaLite
  geo9 =
      let
          tubeLineColors =
              categoricalDomainMap
                  [ ( "Bakerloo", "rgb(137,78,36)" )
                  , ( "Central", "rgb(220,36,30)" )
                  , ( "Circle", "rgb(255,206,0)" )
                  , ( "District", "rgb(1,114,41)" )
                  , ( "DLR", "rgb(0,175,173)" )
                  , ( "Hammersmith & City", "rgb(215,153,175)" )
                  , ( "Jubilee", "rgb(106,114,120)" )
                  , ( "Metropolitan", "rgb(114,17,84)" )
                  , ( "Northern", "rgb(0,0,0)" )
                  , ( "Piccadilly", "rgb(0,24,168)" )
                  , ( "Victoria", "rgb(0,160,226)" )
                  , ( "Waterloo & City", "rgb(106,187,170)" )
                  ]
  
          polySpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/londonBoroughs.json" [ TopojsonFeature "boroughs" ]
                  , mark Geoshape [ MStroke "rgb(251,247,238)", MStrokeWidth 2 ]
                  , encoding (color [ MString "#ddc" ] [])
                  ]
  
          labelEnc =
              encoding
                  . position Longitude [ PName "cx", PmType Quantitative ]
                  . position Latitude [ PName "cy", PmType Quantitative ]
                  . text [ TName "bLabel", TmType Nominal ]
                  . size [ MNumber 8 ]
                  . opacity [ MNumber 0.6 ]
  
          trans =
              transform
                  . calculateAs "indexof (datum.name,' ') > 0  ? substring(datum.name,0,indexof(datum.name, ' ')) : datum.name" "bLabel"
  
          labelSpec =
              asSpec [ dataFromUrl "https://vega.github.io/vega-lite/data/londonCentroids.json" [], trans [], mark Text [], labelEnc [] ]
  
          tubeEnc =
              encoding
                  . color
                      [ MName "id"
                      , MmType Nominal
                      , MLegend [ LNoTitle, LOrient LOBottomRight, LOffset 0 ]
                      , MScale tubeLineColors
                      ]
  
          routeSpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/londonTubeLines.json" [ TopojsonFeature "line" ]
                  , mark Geoshape [ MFilled False, MStrokeWidth 2 ]
                  , tubeEnc []
                  ]
      in
      toVegaLite
          [ cfg []
          , description "Geographic position of London underground lines"
          , width 700
          , height 500
          , layer [ polySpec, labelSpec, routeSpec ]
          ]
  