{-# LANGUAGE DeriveDataTypeable #-}
-- | Program to
module Main where
import Control.Monad (when)
import qualified Data.Map as M
import Gis.Saga.Cmd
import Gis.Saga.Data
import Gis.Saga.LUT
import Gis.Saga.Types
import Prelude hiding (min,max)
import System.Console.CmdArgs
import System.Environment (getArgs, withArgs)
_PROGRAM_NAME, _PROGRAM_VERSION, _PROGRAM_INFO, _PROGRAM_ABOUT, _COPYRIGHT :: String
_PROGRAM_NAME = "sagaTopo"
_PROGRAM_VERSION = "0.1.0.0"
_PROGRAM_INFO = _PROGRAM_NAME ++ " version " ++ _PROGRAM_VERSION
_COPYRIGHT = "GPL licensed; written by Michel Kuhlmann 2013"
_PROGRAM_ABOUT = "Create create topographic maps out of gridded data"
_COLOR_FILE :: FilePath
_COLOR_FILE = "relief-colors.txt"
main :: IO ()
main = do
cArgs <- getArgs
-- If the user did not specify any arguments, pretend as "--help" was given
opts <- (if null cArgs then withArgs ["--help"] else id) (cmdArgs defaultOpts)
when (output opts == "") (fail "Please specify an output-tif")
r <- case (hillshade opts, min opts, max opts) of
(True, 0.0, 0.0) -> sgrdToTopo (file opts) (output opts) Nothing Nothing
(False, 0.0, 0.0) -> sgrdToRelief (file opts) (output opts) Nothing Nothing
(True, _, _) -> sgrdToTopo (file opts) (output opts) (Just $ min opts) (Just $ max opts)
(False, _, _) -> sgrdToRelief (file opts) (output opts) (Just $ min opts) (Just $ max opts)
putStrLn ("Successfully created " ++ r)
-- | Convert a grid-file into a topo graphic map
sgrdToTopo :: FilePath -> FilePath -> Maybe Float -> Maybe Float -> IO FilePath
sgrdToTopo fIn fOut Nothing Nothing = do
let hsF = "temp_hillshade.sgrd"
doSaga $ gridHillShade hsF fIn
doSaga $ SagaCmd "libio_grid_image" "0" ("GRID", "FILE")
(M.fromList [
("a",("SHADE", hsF))
])
Nothing Nothing fOut fIn
sgrdToTopo fIn fOut (Just min') (Just max') = do
let hsF = "temp_hillshade.sgrd"
doSaga $ gridHillShade hsF fIn
writeFile _COLOR_FILE (bgrColTable min' max') -- color-lookup-table
doSaga $ SagaCmd "libio_grid_image" "0" ("GRID", "FILE")
(M.fromList [
("a",("SHADE", hsF))
,("b", ("LUT", _COLOR_FILE))
])
Nothing Nothing fOut fIn
sgrdToRelief :: FilePath -> FilePath -> Maybe Float -> Maybe Float -> IO FilePath
sgrdToRelief fIn fOut Nothing Nothing = do
doSaga $ SagaCmd "libio_grid_image" "0" ("GRID", "FILE")
(M.fromList [])
Nothing Nothing fOut fIn
sgrdToRelief fIn fOut (Just min') (Just max') = do
writeFile _COLOR_FILE (bgrColTable min' max') -- color-lookup-table
doSaga $ SagaCmd "libio_grid_image" "0" ("GRID", "FILE")
(M.fromList [
("b", ("LUT", _COLOR_FILE))
])
Nothing Nothing fOut fIn
-- | Data structure for command line options.
data Opt = Opt
{min :: Float
,max :: Float
,output :: FilePath
,hillshade :: Bool
,file :: FilePath
} deriving (Show, Data, Typeable)
-- | Defaults for command-line options.
defaultOpts :: Opt
defaultOpts = Opt
{output = def &= typ "TIF" &= help "output-tif"
,min = def &= help "minimum elevation-value (optional)"
,max = def &= help "maximum elevation-value (optional)"
,hillshade = def &= help "Should a hillshade be included"
,file = def &= args &= typ "DEM-file.sgrd"
} &=
program _PROGRAM_NAME &=
help _PROGRAM_ABOUT &=
summary (_PROGRAM_INFO ++ ", " ++ _COPYRIGHT)
gridHillShade :: SagaIoCmd
gridHillShade = fst $ lkpCmd "gridHillshade" sIoDB