Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
cls.test_cases = [
cls.OgcTestCase('generalWmsTest',
OgcRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.TIFF_d32f, bbox=wgs84_bbox,
layer='BANDS-S2-L1C', maxcc=0.5, size_x=img_width, size_y=img_height,
time=(datetime.date(year=2017, month=1, day=5),
datetime.date(year=2017, month=12, day=16)),
service_type=ServiceType.WMS, time_difference=datetime.timedelta(days=10)),
result_len=14, img_min=0.0, img_max=1.5964, img_mean=0.1810, img_median=0.1140, tile_num=29,
save_data=True, data_filter=[0, -2, 0]),
cls.OgcTestCase('generalWcsTest',
OgcRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.TIFF_d32f, bbox=wgs84_bbox,
layer='BANDS-S2-L1C', maxcc=0.6, size_x=resx, size_y=resy,
time=(datetime.datetime(year=2017, month=10, day=7, hour=1),
datetime.datetime(year=2017, month=12, day=11)),
service_type=ServiceType.WCS, time_difference=datetime.timedelta(hours=1)),
result_len=4, img_min=0.0002, img_max=0.5266, img_mean=0.1038, img_median=0.0948,
tile_num=6, date_check=expected_date, save_data=True, data_filter=[0, -1]),
# CustomUrlParam tests:
cls.OgcTestCase('customUrlAtmcorQualitySampling',
WmsRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.PNG,
layer='TRUE-COLOR-S2-L1C', width=img_width, bbox=wgs84_bbox,
time=('2017-10-01', '2017-10-02'),
custom_url_params={CustomUrlParam.SHOWLOGO: True,
CustomUrlParam.ATMFILTER: 'ATMCOR',
CustomUrlParam.QUALITY: 100,
CustomUrlParam.DOWNSAMPLING: 'BICUBIC',
CustomUrlParam.UPSAMPLING: 'BICUBIC'}),
result_len=1, img_min=12, img_max=255, img_mean=194.247556, img_median=206, tile_num=2,
data_filter=[0, -1]),
cls.OgcTestCase('customUrlPreview',
WmsRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.PNG,
geometry_wkt_pop_web = 'POLYGON((1292344.0 5205055.5, 1301479.5 5195920.0, 1310615.0 5205055.5, ' \
'1301479.5 5214191.0, 1292344.0 5205055.5))'
geometry_wkt_wgs84 = 'POLYGON((-5.13 48, -5.23 48.09, -5.13 48.17, -5.03 48.08, -5.13 48))'
img_width = 100
img_height = 100
resx = '53m'
resy = '78m'
expected_date = datetime.datetime.strptime('2017-10-07T11:20:58', '%Y-%m-%dT%H:%M:%S')
cls.test_cases = [
cls.OgcTestCase('generalWmsTest',
OgcRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.TIFF_d32f, bbox=wgs84_bbox,
layer='BANDS-S2-L1C', maxcc=0.5, size_x=img_width, size_y=img_height,
time=(datetime.date(year=2017, month=1, day=5),
datetime.date(year=2017, month=12, day=16)),
service_type=ServiceType.WMS, time_difference=datetime.timedelta(days=10)),
result_len=14, img_min=0.0, img_max=1.5964, img_mean=0.1810, img_median=0.1140, tile_num=29,
save_data=True, data_filter=[0, -2, 0]),
cls.OgcTestCase('generalWcsTest',
OgcRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.TIFF_d32f, bbox=wgs84_bbox,
layer='BANDS-S2-L1C', maxcc=0.6, size_x=resx, size_y=resy,
time=(datetime.datetime(year=2017, month=10, day=7, hour=1),
datetime.datetime(year=2017, month=12, day=11)),
service_type=ServiceType.WCS, time_difference=datetime.timedelta(hours=1)),
result_len=4, img_min=0.0002, img_max=0.5266, img_mean=0.1038, img_median=0.0948,
tile_num=6, date_check=expected_date, save_data=True, data_filter=[0, -1]),
# CustomUrlParam tests:
cls.OgcTestCase('customUrlAtmcorQualitySampling',
WmsRequest(data_folder=cls.OUTPUT_FOLDER, image_format=MimeType.PNG,
layer='TRUE-COLOR-S2-L1C', width=img_width, bbox=wgs84_bbox,
time=('2017-10-01', '2017-10-02'),
custom_url_params={CustomUrlParam.SHOWLOGO: True,
def _get_rescale_factors(self, reference_shape, meta_info):
""" Compute the resampling factor for height and width of the input array
:param reference_shape: Tuple specifying height and width in pixels of high-resolution array
:type reference_shape: tuple of ints
:param meta_info: Meta-info dictionary of input eopatch. Defines OGC request and parameters used to create the
eopatch
:return: Rescale factor for rows and columns
:rtype: tuple of floats
"""
# Figure out resampling size
height, width = reference_shape
service_type = ServiceType(meta_info['service_type'])
rescale = None
if service_type == ServiceType.WMS:
if (self.cm_size_x is None) and (self.cm_size_y is not None):
rescale = (self.cm_size_y / height, self.cm_size_y / height)
elif (self.cm_size_x is not None) and (self.cm_size_y is None):
rescale = (self.cm_size_x / width, self.cm_size_x / width)
else:
rescale = (self.cm_size_y / height, self.cm_size_x / width)
elif service_type == ServiceType.WCS:
# Case where only one resolution for cloud masks is specified in WCS
if self.cm_size_y is None:
self.cm_size_y = self.cm_size_x
elif self.cm_size_x is None:
self.cm_size_x = self.cm_size_y
def __init__(self, layer, width=None, height=None, **kwargs):
super().__init__(layer=layer, data_source=DataSource.SENTINEL2_L2A, service_type=ServiceType.WMS,
size_x=width, size_y=height, **kwargs)
def _prepare_request_data(self, eopatch, bbox, time_interval):
""" Collects all parameters used for DataRequest, each one is taken either from initialization parameters or
from EOPatch
"""
service_type = ServiceType(self._get_parameter('service_type', eopatch))
if time_interval is None:
time_interval = self._get_parameter('time_interval', eopatch)
if service_type is ServiceType.WMS:
size_x_name, size_y_name = 'width', 'height'
else:
size_x_name, size_y_name = 'resx', 'resy'
return {
'layer': self.layer,
'bbox': bbox if bbox is not None else self._get_parameter('bbox', eopatch),
'time': time_interval,
'time_difference': self._get_parameter('time_difference', eopatch),
'maxcc': self._get_parameter('maxcc', eopatch),
'image_format': self.image_format,
'custom_url_params': self.custom_url_params,
'data_source': self.data_source,
'instance_id': self.instance_id,
def execute(self, eopatch):
"""
Add requested feature to this existing EOPatch.
"""
size_x = eopatch.meta_info['size_x']
size_y = eopatch.meta_info['size_y']
maxcc = eopatch.meta_info['maxcc']
time_difference = eopatch.meta_info['time_difference']
service_type = eopatch.meta_info['service_type']
time_interval = (eopatch.timestamp[0].isoformat(), eopatch.timestamp[-1].isoformat())
request = {ServiceType.WMS: self._get_wms_request,
ServiceType.WCS: self._get_wcs_request}[service_type](eopatch.bbox, time_interval, size_x, size_y,
maxcc, time_difference)
# check timestamp consistency between request and this eopatch
request_dates = request.get_dates()
download_frames = get_common_timestamps(request_dates, eopatch.timestamp)
request_return = request.get_data(raise_download_errors=False, data_filter=download_frames)
bad_data = [idx for idx, value in enumerate(request_return) if value is None]
for idx in reversed(sorted(bad_data)):
LOGGER.warning('Data from %s could not be downloaded for %s!', str(request_dates[idx]), self.layer)
del request_return[idx]
del request_dates[idx]
request_data = np.asarray(request_return)