Skip to content

Commit

Permalink
Give heightsArrayFetchers responsibility to determine the needed tiles.
Browse files Browse the repository at this point in the history
  • Loading branch information
breki committed Jun 2, 2024
1 parent b7dd288 commit 0e2d954
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 63 deletions.
6 changes: 4 additions & 2 deletions Demeton.Console/Wiring.fs
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,7 @@ let fetchSrtmTile srtmDir localCacheDir : DemTileReader =
writeTileToCache
|> finalizeFetchSrtmTileProcessing

let fetchSrtmHeights srtmDir localCacheDir =
fetchDemHeights (fetchSrtmTile srtmDir localCacheDir)
let fetchSrtmHeights srtmDir localCacheDir srtmLevel lonLatBounds =
let tileReader = fetchSrtmTile srtmDir localCacheDir
let srtmTilesNeeded = boundsToTiles 3600 srtmLevel lonLatBounds
fetchDemHeights tileReader srtmTilesNeeded
2 changes: 1 addition & 1 deletion Demeton.Tests/Aw3d/AW3D experiments.fs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ let options: ShadeCommand.Options =


// todo 10: move this to the command module?
let fetchAw3dHeightsArray _ =
let fetchAw3dHeightsArray _ _ =
let tileDownloadingResult = ensureAw3dTiles CacheDir area

match tileDownloadingResult with
Expand Down
29 changes: 16 additions & 13 deletions Demeton.Tests/Commands tests/ShadeCommand/Generating shaded tile.fs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
module Tests.``Commands tests``.ShadeCommand.``Generating shaded tile``

open Demeton.Dem.Types
open Demeton.Dem.Funcs
open Demeton.Geometry.Common
open Raster
open Demeton.Commands
open Demeton.Shaders
Expand All @@ -27,23 +26,27 @@ let mockRasterShader _ _ _ _ _ _ = ()
let rootShadingStep = Pipeline.Common.CustomShading "some shader"

[<Fact>]
let ``Tile generator correctly calculates which SRTM tiles it needs`` () =
let ``Tile generator correctly specifies DEM level and bounds for tile downloaders``
()
=

let correctSrtmTilesWereRequested (tiles: DemTileId seq) =
let tilesArray = tiles |> Seq.toArray
let correctLevelAndAreaWereProvided level area =
test <@ level = srtmLevel @>

test
<@
tilesArray = [| demTileId 4 0 -4
demTileId 4 1 -4
demTileId 4 0 -3
demTileId 4 1 -3 |]
// todo 0: update the expectation
area = { MinLon = 0
MinLat = 0
MaxLon = 20
MaxLat = 30 }
@>

heights |> Some |> Ok

// todo 0: looks like the correctLevelAndAreaWereProvided is never called
ShadeCommand.generateShadedRasterTile
[| correctSrtmTilesWereRequested |]
[| correctLevelAndAreaWereProvided |]
(fun _ -> mockRasterShader)
srtmLevel
tileRect
Expand All @@ -57,7 +60,7 @@ let ``When heights array fetcher returns None, tile generator does nothing and r
()
=

let returnNoneForHeightsArray _ = Ok None
let returnNoneForHeightsArray _ _ = Ok None

let shadeTileResult =
ShadeCommand.generateShadedRasterTile
Expand All @@ -76,7 +79,7 @@ let ``When heights array fetcher returns an error, tile generator returns an err
()
=

let returnErrorInsteadOfHeightsArray _ = Error "something is wrong"
let returnErrorInsteadOfHeightsArray _ _ = Error "something is wrong"

let shadeTileResult =
ShadeCommand.generateShadedRasterTile
Expand All @@ -91,7 +94,7 @@ let ``When heights array fetcher returns an error, tile generator returns an err

[<Fact>]
let ``Tile generator prepares the tile image data and returns it`` () =
let fetchSomeHeights _ = heights |> Some |> Ok
let fetchSomeHeights _ _ = heights |> Some |> Ok

let mutable imageDataReceived = None

Expand Down
6 changes: 4 additions & 2 deletions Demeton.Tests/WorldCover/WorldCover experiments.fs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ let ``Render hillshading with WorldCover water bodies`` () =
// raster available (it's too big to be added to git repo)
()
else
let worldCoverTileId = demTileXYId -6 -45
let worldCoverTilesNeeded = boundsToWorldCoverTiles area

let worldCoverTileId = demTileXYId 6 -45

let cacheDir = "cache"

Expand All @@ -112,7 +114,7 @@ let ``Render hillshading with WorldCover water bodies`` () =
|> outlineWaterBodies waterBodiesHeightsArray
|> Seq.toList

let fetchWorldCoverHeightsArray tileIds =
let fetchWorldCoverHeightsArray level area =
waterBodiesHeightsArray |> Some |> Result.Ok

let heightsArraysFetchers =
Expand Down
8 changes: 1 addition & 7 deletions Demeton/Commands/ShadeCommand.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ module Demeton.Commands.ShadeCommand
open CommandLine
open CommandLine.Common
open Demeton.Dem.Types
open Demeton.Dem.Funcs
open Raster
open Demeton.Geometry
open Demeton.Geometry.Common
Expand Down Expand Up @@ -467,14 +466,9 @@ let generateShadedRasterTile
MaxLon = radToDeg (max lon1Rad lon2Rad)
MaxLat = radToDeg (max lat1Rad lat2Rad) }

// todo 15: the needed tiles calculation has to be generalized so we
// could also load non-SRTM tiles. We should probably move the
// responsibility to the tile downloader itself, giving it lonLatBounds.
let srtmTilesNeeded = boundsToTiles 3600 srtmLevel lonLatBounds

let fetchingResults =
heightsArrayFetchers
|> Array.map (fun fetcher -> fetcher srtmTilesNeeded)
|> Array.map (fun fetcher -> fetcher srtmLevel lonLatBounds)

let firstErrorMaybe = fetchingResults |> Array.tryFind Result.isError

Expand Down
9 changes: 2 additions & 7 deletions Demeton/Commands/TileShadeCommand.fs
Original file line number Diff line number Diff line change
Expand Up @@ -356,12 +356,7 @@ let calculateGeoAreaMbr options projection =
Result.Error "Some of the tile bounding points could not be projected."


let fetchAw3dHeightsArray
mapProjection
cacheDir
coverageArea
(tilesIds: DemTileId seq)
=
let fetchAw3dHeightsArray mapProjection cacheDir demLevel coverageArea =
let coveragePoints =
[ (coverageArea.MinLon, coverageArea.MinLat)
(coverageArea.MaxLon, coverageArea.MaxLat) ]
Expand Down Expand Up @@ -497,7 +492,7 @@ let run (options: Options) : Result<unit, string> =
match calculateGeoAreaMbr options mapProjection with
| Ok coverageArea ->
ShadeCommand.generateShadedRasterTile
[| fetchAw3dHeightsArray mapProjection cacheDir coverageArea |]
[| fetchAw3dHeightsArray mapProjection cacheDir |]
createShadingFuncById
srtmLevel
tileRect
Expand Down
59 changes: 30 additions & 29 deletions Demeton/Dem/Funcs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -412,36 +412,37 @@ let extract
/// Provides a function to fetch a heights array from a sequence of DEM tiles,
/// using a specified DEM tile reader.
/// </summary>
let fetchDemHeights (readDemTile: DemTileReader) : DemHeightsArrayFetcher =
fun tilesToUse ->

let mutable errorMessage = None
let mutable i = 0

let tilesArray = tilesToUse |> Seq.toArray
let mutable heightsArraysToMerge = []

while i < tilesArray.Length && Option.isNone errorMessage do
let tileCoords = tilesArray.[i]
let tileLoadResult = readDemTile tileCoords

match tileLoadResult with
| Ok(Some heightsArray) ->
heightsArraysToMerge <- heightsArray :: heightsArraysToMerge
()
| Error message ->
errorMessage <- Some message
()
| _ -> ()

i <- i + 1

match errorMessage with
| Some error -> Error error
| _ ->
let mergedRect = heightsArraysToMerge |> mbrOfHeightsArrays
let fetchDemHeights
(readDemTile: DemTileReader)
(tilesToUse: DemTileId seq)
: HeightsArrayMaybeResult =
let mutable errorMessage = None
let mutable i = 0

let tilesArray = tilesToUse |> Seq.toArray
let mutable heightsArraysToMerge = []

while i < tilesArray.Length && Option.isNone errorMessage do
let tileCoords = tilesArray.[i]
let tileLoadResult = readDemTile tileCoords

match tileLoadResult with
| Ok(Some heightsArray) ->
heightsArraysToMerge <- heightsArray :: heightsArraysToMerge
()
| Error message ->
errorMessage <- Some message
()
| _ -> ()

i <- i + 1

match errorMessage with
| Some error -> Error error
| _ ->
let mergedRect = heightsArraysToMerge |> mbrOfHeightsArrays

Ok(merge mergedRect heightsArraysToMerge)
Ok(merge mergedRect heightsArraysToMerge)



Expand Down
7 changes: 5 additions & 2 deletions Demeton/Dem/Types.fs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Demeton.Dem.Types

open System
open Demeton.Geometry.Common
open Raster

type DemHeight = int16
Expand Down Expand Up @@ -290,6 +291,8 @@ type DemTileName = string


/// <summary>
/// A function that fetches a heights array from a sequence of DEM tiles.
/// A function that fetches a heights array from a sequence of DEM tiles
/// needed to cover the specified area using DEM tiles of the specified level.
/// </summary>
type DemHeightsArrayFetcher = DemTileId seq -> HeightsArrayMaybeResult
type DemHeightsArrayFetcher =
DemLevel -> LonLatBounds -> HeightsArrayMaybeResult

0 comments on commit 0e2d954

Please sign in to comment.