Skip to content

Commit

Permalink
Add --output-file CLI option.
Browse files Browse the repository at this point in the history
  • Loading branch information
breki committed May 26, 2024
1 parent a7a828b commit 83d3d07
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ let ``Geo area needed is calculated correctly`` () =
SunAzimuth = IgorHillshader.DefaultSunAzimuth
WaterBodiesColor = "#49C8FF" |> Png.Rgba8Bit.parseColorHexValue
LocalCacheDir = TileShadeCommand.DefaultLocalCacheDir
OutputDir = TileShadeCommand.DefaultOutputDir }
OutputDir = TileShadeCommand.DefaultOutputDir
OutputFileName = TileShadeCommand.DefaultOutputFileName
}

match
TileShadeCommand.createProjection options
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ let ``Projection is created`` () =
SunAzimuth = IgorHillshader.DefaultSunAzimuth
WaterBodiesColor = "#49C8FF" |> Png.Rgba8Bit.parseColorHexValue
LocalCacheDir = TileShadeCommand.DefaultLocalCacheDir
OutputDir = TileShadeCommand.DefaultOutputDir }
OutputDir = TileShadeCommand.DefaultOutputDir
OutputFileName = TileShadeCommand.DefaultOutputFileName }

let projection = TileShadeCommand.createProjection options

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ let ``run command`` () =
SunAzimuth = IgorHillshader.DefaultSunAzimuth
WaterBodiesColor = "#49C8FF" |> Png.Rgba8Bit.parseColorHexValue
LocalCacheDir = TileShadeCommand.DefaultLocalCacheDir
OutputDir = TileShadeCommand.DefaultOutputDir }
OutputDir = TileShadeCommand.DefaultOutputDir
OutputFileName = TileShadeCommand.DefaultOutputFileName }

TileShadeCommand.run options
4 changes: 0 additions & 4 deletions Demeton.Tests/todo.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@

module Demeton.Tests.todo

// todo 0: option to name the output file

// todo 6: limit the command to stick to the SRTM level 0

// todo 100: update shading docs now that we have added an array of fetchers

// todo 100: implement support for variable-resolution height arrays, not just
Expand Down
52 changes: 37 additions & 15 deletions Demeton/Commands/TileShadeCommand.fs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,13 @@ type Options =
PixelSize: float option
MapScale: float option
Dpi: float
LocalCacheDir: string
OutputDir: string
IgorHillshadingIntensity: float
SlopeShadingIntensity: float
SunAzimuth: float
WaterBodiesColor: Rgba8Bit.ArgbColor }
WaterBodiesColor: Rgba8Bit.ArgbColor
LocalCacheDir: string
OutputDir: string
OutputFileName: string }

[<Literal>]
let TileWidthParameter = "tile-width"
Expand All @@ -55,29 +56,36 @@ let MapScaleParameter = "map-scale"
let DpiParameter = "dpi"

[<Literal>]
let LocalCacheDirParameter = "local-cache-dir"
let IgorHillshadingIntensityParameter = "igor-hillshading-intensity"

[<Literal>]
let OutputDirParameter = "output-dir"
let SlopeShadingIntensityParameter = "slope-shading-intensity"

[<Literal>]
let IgorHillshadingIntensityParameter = "igor-hillshading-intensity"
let SunAzimuthParameter = "sun-azimuth"

[<Literal>]
let SlopeShadingIntensityParameter = "slope-shading-intensity"
let WaterBodiesColorParameter = "water-color"

[<Literal>]
let LocalCacheDirParameter = "local-cache-dir"

[<Literal>]
let SunAzimuth = "sun-azimuth"
let OutputDirParameter = "output-dir"

[<Literal>]
let WaterBodiesColor = "water-color"
let OutputFileNameParameter = "output-file"

[<Literal>]
let DefaultLocalCacheDir = "cache"

[<Literal>]
let DefaultOutputDir = "output"

[<Literal>]
let DefaultOutputFileName = "tile.png"


let defaultWaterBodiesColor = "#49C8FF" |> Rgba8Bit.parseColorHexValue

let parseColorParameter value =
Expand Down Expand Up @@ -137,14 +145,14 @@ let supportedParameters: CommandParameter[] =
|> Option.defaultValue 1.
|> Option.toPar

Option.build SunAzimuth
Option.build SunAzimuthParameter
|> Option.desc
"The azimuth of the sun in degrees, 0° representing north (default is 315°, northwest)."
|> Option.defaultValue IgorHillshader.DefaultSunAzimuth
|> Option.asFloat
|> Option.toPar

Option.build WaterBodiesColor
Option.build WaterBodiesColorParameter
|> Option.desc "The color of the water bodies."
|> Option.example "#49C8FF" "uses a light blue color for water bodies"
|> Option.parser parseColorParameter
Expand All @@ -163,6 +171,12 @@ let supportedParameters: CommandParameter[] =
"The path to the directory where the raster files will be generated. The directory will be created if it does not exist yet."
|> Option.asDirectory
|> Option.defaultValue DefaultOutputDir
|> Option.toPar

Option.build OutputFileNameParameter
|> Option.desc "The name of the output file (default it 'tile.png')."
|> Option.asFileName
|> Option.defaultValue DefaultOutputFileName
|> Option.toPar |]

let fillOptions parsedParameters =
Expand All @@ -178,7 +192,8 @@ let fillOptions parsedParameters =
SunAzimuth = IgorHillshader.DefaultSunAzimuth
WaterBodiesColor = defaultWaterBodiesColor
LocalCacheDir = DefaultLocalCacheDir
OutputDir = DefaultOutputDir }
OutputDir = DefaultOutputDir
OutputFileName = DefaultOutputFileName }

let processParameter options parameter =
match parameter with
Expand Down Expand Up @@ -220,10 +235,11 @@ let fillOptions parsedParameters =
Value = value } ->
{ options with
SlopeShadingIntensity = value :?> float }
| ParsedOption { Name = SunAzimuth; Value = value } ->
| ParsedOption { Name = SunAzimuthParameter
Value = value } ->
{ options with
SunAzimuth = value :?> float |> degToRad }
| ParsedOption { Name = WaterBodiesColor
| ParsedOption { Name = WaterBodiesColorParameter
Value = value } ->
{ options with
WaterBodiesColor = value :?> Rgba8Bit.ArgbColor }
Expand All @@ -235,6 +251,10 @@ let fillOptions parsedParameters =
Value = value } ->
{ options with
OutputDir = value :?> string }
| ParsedOption { Name = OutputFileNameParameter
Value = value } ->
{ options with
OutputFileName = value :?> string }
| _ -> invalidOp "Unrecognized parameter."

let filledOptions =
Expand Down Expand Up @@ -378,11 +398,12 @@ let saveTileFile
(writePngToStream: File.PngStreamWriter)
(tileRect: Rect)
outputDir
outputFileName
imageData
=
ensureDirectoryExists outputDir |> ignore

let tilePngFileName = outputDir |> Pth.combine "tile.png"
let tilePngFileName = outputDir |> Pth.combine outputFileName

openFileToWrite tilePngFileName
|> Result.map (fun stream ->
Expand Down Expand Up @@ -465,6 +486,7 @@ let run (options: Options) : Result<unit, string> =
File.savePngToStream
tileRect
options.OutputDir
options.OutputFileName
imageData
|> ignore

Expand Down

0 comments on commit 83d3d07

Please sign in to comment.