Skip to content

Commit

Permalink
Various fixes, got response both with and without tcd filter.
Browse files Browse the repository at this point in the history
Adapted reader.py to allow different name for default band.
  • Loading branch information
danscales committed Mar 6, 2025
1 parent 090b6a5 commit d375b67
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 15 deletions.
2 changes: 2 additions & 0 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
from .routes.titiler import routes as titiler_routes
from .routes.titiler.gfw_integrated_alerts import router as integrated_alerts_router
from .routes.titiler.umd_glad_dist_alerts import router as dist_alerts_router
from .routes.titiler.gfw_forest_carbon_gross_emissions import router as emissions_router

gunicorn_logger = logging.getLogger("gunicorn.error")
logger.handlers = gunicorn_logger.handlers
Expand All @@ -59,6 +60,7 @@
vector_tiles.router,
integrated_alerts_router,
dist_alerts_router,
emissions_router,
umd_tree_cover_loss_raster_tiles.router,
umd_glad_landsat_alerts_raster_tiles.router,
umd_glad_sentinel2_alerts_raster_tiles.router,
Expand Down
21 changes: 14 additions & 7 deletions app/routes/titiler/algorithms/carbon_gross_emissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import Optional

import numpy as np
from pydantic import ConfigDict
from rio_tiler.models import ImageData
from titiler.core.algorithm import BaseAlgorithm

Expand All @@ -16,6 +17,7 @@ class CarbonGrossEmissions(BaseAlgorithm):
title: str = "Carbon gross emissions"
description: str = "Visualize carbon gross emissions"

model_config = ConfigDict(arbitrary_types_allowed=True)
conf_colors: OrderedDict[float, tuple] = OrderedDict(
{
0.0: Colors(254, 246, 249),
Expand Down Expand Up @@ -55,7 +57,7 @@ class CarbonGrossEmissions(BaseAlgorithm):

tree_cover_density_mask: Optional[int] = None
tree_cover_density_data: Optional[ImageData] = None
render_type: RenderType = RenderType.encoded
render_type: RenderType = RenderType.true_color

# metadata
input_nbands: int = 2
Expand Down Expand Up @@ -99,12 +101,10 @@ def create_mask(self):
def create_true_color_rgb(self):
r, g, b = self._rgb_zeros_array()

for k, v in reversed(self.conf_colors.items()):
if self.emissions >= k:
r = v.red
g = v.green
b = v.blue
break
for k, colors in self.conf_colors.items():
r[self.emissions >= k] = colors.red
g[self.emissions >= k] = colors.green
b[self.emissions >= k] = colors.blue

return np.stack([r, g, b], axis=0)

Expand All @@ -120,3 +120,10 @@ def create_true_color_alpha(self):
"""
alpha = np.where(self.mask, self.intensity * 150, 0)
return np.minimum(255, alpha)

def _rgb_zeros_array(self):
r = np.zeros_like(self.emissions, dtype=np.uint8)
g = np.zeros_like(self.emissions, dtype=np.uint8)
b = np.zeros_like(self.emissions, dtype=np.uint8)

return r, g, b
16 changes: 9 additions & 7 deletions app/routes/titiler/gfw_forest_carbon_gross_emissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

router = APIRouter()

dataset = "gfw_forest_carbon_gross_emissions"
DATASET = "gfw_forest_carbon_gross_emissions"


class GfwForestCarbonGrossEmissions(str, Enum):
latest = "v20240402"


_versions = get_versions(dataset, TileCacheType.cog)
_versions = get_versions(DATASET, TileCacheType.cog)
for _version in _versions:
extend_enum(GfwForestCarbonGrossEmissions, _version, _version)

Expand All @@ -47,22 +47,22 @@ async def global_forest_carbon_gross_emissions_raster_tile(
le=100,
description="Show alerts in pixels with tree cover density (in percent) greater than or equal to this threshold. `umd_tree_cover_density_2010` is used for this masking.",
),
render_type: RenderType = Query(RenderType.encoded, description="Render true color or encoded tiles")
render_type: RenderType = Query(RenderType.true_color, description="Render true color or encoded tiles")
) -> Response:
"""Forest Carbon Gross Emissions raster tiles."""

tile_x, tile_y, zoom = xyz
bands = ["default", "intensity"]
bands = ["tcd_30", "intensity"]
folder: str = f"s3://{DATA_LAKE_BUCKET}/{dataset}/{version}/raster/epsg-4326/cog"
with AlertsReader(input=folder) as reader:
with AlertsReader(input=folder, default_band="tcd_30") as reader:
# NOTE: the bands in the output `image_data` array will be in the order of
# the input `bands` list
image_data = reader.tile(tile_x, tile_y, zoom, bands=bands)

carbon_gross_emissions = CarbonGrossEmissions(
tree_cover_density_mask=tree_cover_density_threshold,
render_type=render_type,
)(image_data)
)

filter_datasets = GLOBALS.carbon_gross_emissions_filters
if tree_cover_density_threshold:
Expand All @@ -72,8 +72,10 @@ async def global_forest_carbon_gross_emissions_raster_tile(
) as reader:
carbon_gross_emissions.tree_cover_density_data = reader.tile(tile_x, tile_y, zoom)

processed_image = carbon_gross_emissions(image_data)

content, media_type = render_image(
carbon_gross_emissions,
processed_image,
output_format=ImageType("png"),
add_mask=False,
)
Expand Down
3 changes: 2 additions & 1 deletion app/routes/titiler/readers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
class AlertsReader(MultiBandReader):

input: str = attr.ib()
default_band: str = attr.ib(default="default")
tms: morecantile.TileMatrixSet = attr.ib(
default=morecantile.tms.get("WebMercatorQuad")
)
Expand All @@ -29,7 +30,7 @@ def _maxzoom(self):

def __attrs_post_init__(self):
"""Get grid bounds."""
band_url: str = self._get_band_url("default")
band_url: str = self._get_band_url(self.default_band)
with self.reader(band_url) as cog:
self.bounds = cog.bounds
self.crs = cog.crs
Expand Down

0 comments on commit d375b67

Please sign in to comment.