From d9f7804f22c058399177ca311731bda0c3e42446 Mon Sep 17 00:00:00 2001 From: vincentsarago Date: Thu, 19 Sep 2024 12:29:33 +0200 Subject: [PATCH] fix hillsahde algorithm --- CHANGES.md | 4 ++++ src/titiler/core/tests/test_dependencies.py | 2 +- src/titiler/core/titiler/core/algorithm/dem.py | 8 +++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4bf69da4..0fff82cd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -34,6 +34,10 @@ >> {'value': 1} ``` +* fix Hillshade algorithm (bad `azimuth` angle) + +* set default `azimuth` and `altitude` angles to 45ยบ for the Hillshade algorithm **breaking change** + * Use `.as_dict()` method when passing option to rio-tiler Reader's methods to avoid parameter conflicts when using custom Readers. ## 0.18.6 (2024-08-27) diff --git a/src/titiler/core/tests/test_dependencies.py b/src/titiler/core/tests/test_dependencies.py index 02cc9903..bfcd9069 100644 --- a/src/titiler/core/tests/test_dependencies.py +++ b/src/titiler/core/tests/test_dependencies.py @@ -480,7 +480,7 @@ def _endpoint(algorithm=Depends(PostProcessParams)): assert response.status_code == 422 response = client.get("/?algorithm=hillshade") - assert response.json()["azimuth"] == 90 + assert response.json()["azimuth"] == 45 assert response.json()["buffer"] == 3 assert response.json()["input_nbands"] == 1 diff --git a/src/titiler/core/titiler/core/algorithm/dem.py b/src/titiler/core/titiler/core/algorithm/dem.py index 969981db..9aff42ac 100644 --- a/src/titiler/core/titiler/core/algorithm/dem.py +++ b/src/titiler/core/titiler/core/algorithm/dem.py @@ -17,8 +17,8 @@ class HillShade(BaseAlgorithm): description: str = "Create hillshade from DEM dataset." # parameters - azimuth: int = Field(90, ge=0, le=360) - angle_altitude: float = Field(90.0, ge=-90.0, le=90.0) + azimuth: int = Field(45, ge=0, le=360) + angle_altitude: float = Field(45.0, ge=-90.0, le=90.0) buffer: int = Field(3, ge=0, le=99) # metadata @@ -31,12 +31,14 @@ def __call__(self, img: ImageData) -> ImageData: x, y = numpy.gradient(img.array[0]) slope = numpy.pi / 2.0 - numpy.arctan(numpy.sqrt(x * x + y * y)) aspect = numpy.arctan2(-x, y) - azimuthrad = self.azimuth * numpy.pi / 180.0 + azimuth = 360.0 - self.azimuth + azimuthrad = azimuth * numpy.pi / 180.0 altituderad = self.angle_altitude * numpy.pi / 180.0 shaded = numpy.sin(altituderad) * numpy.sin(slope) + numpy.cos( altituderad ) * numpy.cos(slope) * numpy.cos(azimuthrad - aspect) data = 255 * (shaded + 1) / 2 + data[data < 0] = 0 # set hillshade values to min of 0. bounds = img.bounds if self.buffer: