hgis-0.1.3.8: src/GIS/Graphics/PlotPNG.hs
{-# LANGUAGE RankNTypes #-}
-- | Module to generate PNGs from shapefiles
module GIS.Graphics.PlotPNG where
import Control.Lens hiding (lens)
import Data.Semigroup
import GIS.Graphics.Plot
import GIS.Graphics.PlotSVG hiding (fileOptions)
import GIS.Graphics.Types hiding (title)
import GIS.Types
import GIS.Utils
import Graphics.Rendering.Chart.Backend.Cairo
import Graphics.Rendering.Chart.Easy hiding (lens)
-- | Default file options: PNG output and 1920x1080. To change the file size,
-- you can do e.g.
-- > fo_size .~ (640,480) $ fileOptions
fileOptions :: FileOptions
fileOptions = def { _fo_size = (1920, 1080) , _fo_format = PNG }
-- | Given a `Map` write it to file, where the format is determined by the
-- extension.
mkMap :: FilePath -> Map -> IO ()
mkMap filepath map' = case getExt filepath of
"png" -> mkMapPng filepath map'
"svg" -> mkMapSVG filepath map'
_ -> error "file extension must be one of: .svg, .png"
-- | Given a `Map` write it to file, where the format is determined by the
-- extension.
mkLensMap :: (Show a) => String -> FilePath -> Lens' District a -> [District] -> IO ()
mkLensMap title filepath lens districts = case getExt filepath of
"png" -> makeLensMapPng title filepath lens districts
"svg" -> makeLensMapSVG title filepath lens districts
_ -> error "file extension must be one of: .svg, .png"
-- | Given a `Map`, write it to file.
mkMapPng :: FilePath -> Map -> IO ()
mkMapPng path map' =
renderableToFile fileOptions path (mkMapR map') >>
putStrLn ("...output written to " <> path)
makeLensMapPng :: (Show a) => String -> FilePath -> Lens' District a -> [District] -> IO ()
makeLensMapPng title filepath lens districts =
renderableToFile fileOptions filepath (mkRenderableLens lens districts title) >>
putStrLn ("...output written to " <> filepath)