Skip to content

Commit

Permalink
Merge pull request #546 from EOxServer/transparency-issue
Browse files Browse the repository at this point in the history
Transparency issue
  • Loading branch information
constantinius committed Dec 6, 2022
2 parents bade532 + 19a1ed0 commit 2f6c56e
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 12 deletions.
21 changes: 17 additions & 4 deletions eoxserver/render/browse/objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
# THE SOFTWARE.
# ------------------------------------------------------------------------------

from typing import List, Tuple, Optional, Union

from django.contrib.gis.geos import Polygon
from django.contrib.gis.gdal import SpatialReference, CoordTransform, DataSource

Expand All @@ -38,6 +40,9 @@
BROWSE_MODE_GRAYSCALE = "grayscale"


OptionalNumeric = Optional[Union[float, int]]


class Browse(object):
def __init__(self, name, filename, env, size, extent, crs, mode, footprint):
self._name = name
Expand Down Expand Up @@ -136,7 +141,9 @@ def from_file(cls, filename, env=None):

class GeneratedBrowse(Browse):
def __init__(self, name, band_expressions, ranges, nodata_values,
fields_and_coverages, field_list, footprint, variables):
fields_and_coverages, field_list, footprint, variables,
show_out_of_bounds_data=False,
):
self._name = name
self._band_expressions = band_expressions
self._ranges = ranges
Expand All @@ -145,6 +152,7 @@ def __init__(self, name, band_expressions, ranges, nodata_values,
self._field_list = field_list
self._footprint = footprint
self._variables = variables
self._show_out_of_bounds_data = show_out_of_bounds_data

@property
def name(self):
Expand Down Expand Up @@ -185,11 +193,11 @@ def band_expressions(self):
return self._band_expressions

@property
def ranges(self):
def ranges(self) -> List[Tuple[OptionalNumeric, OptionalNumeric]]:
return self._ranges

@property
def nodata_values(self):
def nodata_values(self) -> List[OptionalNumeric]:
return self._nodata_values

@property
Expand All @@ -204,10 +212,14 @@ def field_list(self):
def variables(self):
return self._variables

@property
def show_out_of_bounds_data(self) -> bool:
return self._show_out_of_bounds_data

@classmethod
def from_coverage_models(cls, band_expressions, ranges, nodata_values,
fields_and_coverage_models,
product_model, variables):
product_model, variables, show_out_of_bounds_data):

fields_and_coverages = {
field_name: [
Expand All @@ -230,6 +242,7 @@ def from_coverage_models(cls, band_expressions, ranges, nodata_values,
],
product_model.footprint,
variables,
show_out_of_bounds_data,
)


Expand Down
26 changes: 20 additions & 6 deletions eoxserver/render/mapserver/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -400,9 +400,9 @@ def make_browse_layer_generator(self, map_obj, browses, map_,

else:
browse_iter = enumerate(
zip(browse.field_list, browse.ranges), start=1
zip(browse.field_list, browse.ranges, browse.nodata_values), start=1
)
for i, (field, field_range) in browse_iter:
for i, (field, field_range, nodata_value) in browse_iter:
if ranges:
if len(ranges) == 1:
range_ = ranges[0]
Expand All @@ -414,10 +414,24 @@ def make_browse_layer_generator(self, map_obj, browses, map_,
range_ = _get_range(field)

for layer_obj in layer_objs:
layer_obj.setProcessingKey(
"SCALE_%d" % i,
"%s,%s" % tuple(range_)
)
if browse.show_out_of_bounds_data and nodata_value == 0 and range_[0] >= 1:
# NOTE: this trick only works with 0 as nodata value
# and if there actually is data below the min range

# TODO: currently we only have data with exactly this case (integer values,
# 0 as no data value). We can generalize this to float and for coverages
# as necessary.

# only need 1:1 mapping if that's not the min
lut_start= ("1:1," if range_[0] > 1 else "")
lut = f"{lut_start}%d:1,%d:255" % tuple(range_)

layer_obj.setProcessingKey("LUT_%d" % i, lut)
else:
layer_obj.setProcessingKey(
"SCALE_%d" % i,
"%s,%s" % tuple(range_)
)

elif isinstance(browse, Browse):
layer_objs = _create_raster_layer_objs(
Expand Down
6 changes: 5 additions & 1 deletion eoxserver/resources/coverages/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,11 @@ class BrowseTypeInline(admin.StackedInline):
'alpha_expression', 'alpha_nodata_value',
('alpha_range_min', 'alpha_range_max'),
)
})
}),
("Show out of bounds data", {
'classes': ('collapse', 'collapsed'),
'fields': ('show_out_of_bounds_data',),
}),
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ def add_arguments(self, parser):
'--alpha-nodata', type=float,
dest='alpha_nodata', default=None,
)
create_parser.add_argument(
'--show-out-of-bounds-data',
action="store_true",
default=False,
)


list_parser.add_argument(
'product_type_name', nargs=1,
Expand Down Expand Up @@ -134,6 +140,7 @@ def handle_create(self, product_type_name, browse_type_name,
blue_range=(None, None), alpha_range=(None, None),
red_or_grey_nodata=None, green_nodata=None,
blue_nodata=None, alpha_nodata=None,
show_out_of_bounds_data=False,
*args, **kwargs):
""" Handle the creation of a new browse type.
"""
Expand Down Expand Up @@ -171,6 +178,7 @@ def handle_create(self, product_type_name, browse_type_name,
green_nodata_value=green_nodata,
blue_nodata_value=blue_nodata,
alpha_nodata_value=alpha_nodata,
show_out_of_bounds_data=show_out_of_bounds_data,
)

if not browse_type_name:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-11-29 15:10

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('coverages', '0011_bandstatistics'),
]

operations = [
migrations.AddField(
model_name='browsetype',
name='show_out_of_bounds_data',
field=models.BooleanField(default=False),
),
]
2 changes: 2 additions & 0 deletions eoxserver/resources/coverages/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ class BrowseType(models.Model):
blue_range_max = models.FloatField(**optional)
alpha_range_max = models.FloatField(**optional)

show_out_of_bounds_data = models.BooleanField(default=False, **mandatory)

def __str__(self):
if self.name:
return self.name
Expand Down
3 changes: 2 additions & 1 deletion eoxserver/services/ows/wms/layermapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,7 @@ class LayerMapperConfigReader(config.Reader):
color = config.Option(type=str, default='grey')


def _generate_browse_from_browse_type(product, browse_type, variables):
def _generate_browse_from_browse_type(product: models.Product, browse_type: models.BrowseType, variables):
if not browse_type.red_or_grey_expression:
return None

Expand Down Expand Up @@ -666,6 +666,7 @@ def _generate_browse_from_browse_type(product, browse_type, variables):
fields_and_coverages,
product,
variables,
show_out_of_bounds_data=browse_type.show_out_of_bounds_data,
)
return None

Expand Down

0 comments on commit 2f6c56e

Please sign in to comment.