Example #1
0
    def test_export2tiff_mask_tuple_string(self):
        eop = EOPatch.load(self.PATCH_FILENAME)
        dates = np.array(eop.timestamp)

        mask = np.arange(len(dates) * 3 * 2 * 1).reshape(len(dates), 3, 2, 1)
        eop.mask['mask'] = mask

        indices = [2, 4]

        # day time gets floored
        times = (datetime_to_iso(dates[indices[0]]),
                 datetime_to_iso(dates[indices[1]]))

        selection = np.nonzero(
            np.where((dates >= iso_to_datetime(times[0])) &
                     (dates <= iso_to_datetime(times[1])), dates, 0))

        subset = mask[selection].squeeze()

        with tempfile.TemporaryDirectory() as tmp_dir_name:
            tmp_file_name = 'temp_file.tiff'
            task = ExportToTiff((FeatureType.MASK, 'mask'),
                                folder=tmp_dir_name,
                                date_indices=times)
            task.execute(eop, filename=tmp_file_name)

            # rasterio saves `bands` to the last dimension, move it up front
            raster = read_data(os.path.join(tmp_dir_name, tmp_file_name))
            raster = np.moveaxis(raster, -1, 0)

            self.assertTrue(np.all(subset == raster))
Example #2
0
    def _build_payloads(self, bbox, size_x, size_y, timestamp, time_interval):
        """ Build payloads for the requests to the service
        """
        if self.single_scene:
            dates = [(iso_to_datetime(time_interval[0]), iso_to_datetime(time_interval[1]))]
        else:
            dates = [(date - self.time_difference, date + self.time_difference) for date in timestamp]

        return [self._request_payload(date1, date2, bbox, size_x, size_y) for date1, date2 in dates]
Example #3
0
    def _build_requests(self, bbox, size_x, size_y, timestamp, time_interval):
        """ Build requests
        """
        if self.single_scene:
            dates = [(iso_to_datetime(time_interval[0]),
                      iso_to_datetime(time_interval[1]))]
        else:
            dates = [(date - self.time_difference, date + self.time_difference)
                     for date in timestamp]

        return [
            self._create_sh_request(date1, date2, bbox, size_x, size_y)
            for date1, date2 in dates
        ]
Example #4
0
    def _add_meta_info(self, eopatch, request_params, service_type):
        """ Adds any missing metadata info to EOPatch """

        for param, eoparam in zip(
            ['time', 'time_difference', 'maxcc'],
            ['time_interval', 'time_difference', 'maxcc']):
            if eoparam not in eopatch.meta_info:
                if param == 'time':
                    value = request_params[param]
                    eopatch.meta_info[eoparam] = value if isinstance(
                        value, str) else [
                            iso_to_datetime(parse_time(x)) if isinstance(
                                x, str) else x for x in value
                        ]
                else:
                    eopatch.meta_info[eoparam] = request_params[param]

        if 'service_type' not in eopatch.meta_info:
            eopatch.meta_info['service_type'] = service_type.value

        for param in ['size_x', 'size_y']:
            if param not in eopatch.meta_info:
                eopatch.meta_info[param] = getattr(self, param)

        if eopatch.bbox is None:
            eopatch.bbox = request_params['bbox']
 def test_iso_to_datetime(self):
     test_pairs = [
         ('2018-01-01', datetime.datetime(2018, 1, 1)),
         ('2017-02-28', datetime.datetime(2017, 2, 28))
     ]
     for date_str, date_dt in test_pairs:
         with self.subTest(msg=date_str):
             res_dt = time_utils.iso_to_datetime(date_str)
             self.assertEqual(res_dt, date_dt,
                              msg='Expected {}, got {}'.format(date_dt, res_dt))
    def _update_other_data(self, eopatch):

        if 'time_interval' in eopatch.meta_info:

            start_time, end_time = [iso_to_datetime(x) if isinstance(x, str)
                                    else x for x in eopatch.meta_info['time_interval']]
            eopatch.meta_info['time_interval'] = (max(start_time, self.start_date),
                                                  min(end_time, self.end_date))

        return eopatch
Example #7
0
    def _get_dates_subset(self, array, dates):

        dates = np.array(dates)

        if isinstance(self.date_indices, list):
            if [
                    date for date in self.date_indices
                    if not isinstance(date, int)
            ]:
                raise ValueError(
                    'Invalid format in {} list, expected integers'.format(
                        self.date_indices))
            array_sub = array[np.array(self.date_indices)]
        elif isinstance(self.date_indices, tuple):
            if tuple(map(type, self.date_indices)) == (int, int):
                start_date = dates[self.date_indices[0]]
                end_date = dates[self.date_indices[1]]
            elif tuple(map(type, self.date_indices)) == (str, str):
                start_date = iso_to_datetime(self.date_indices[0])
                end_date = iso_to_datetime(self.date_indices[1])
            elif tuple(map(type, self.date_indices)) == (datetime.datetime,
                                                         datetime.datetime):
                start_date = self.date_indices[0]
                end_date = self.date_indices[1]
            else:
                raise ValueError(
                    'Invalid format in {} tuple, expected ints, strings, or datetimes'
                    .format(self.date_indices))
            array_sub = array[np.nonzero(
                np.where((dates >= start_date) & (dates <= end_date), dates,
                         0))[0]]
        else:
            raise ValueError(
                'Invalid format in {}, expected tuple or list'.format(
                    self.date_indices))

        return array_sub
Example #8
0
def fis_data_to_df(fis_data):
    """Creates a pd.DataFrame from list of FIS responses"""
    COLUMNS = ['channel', 'date', 'min', 'max', 'mean', 'stDev']
    data = []

    for fis_response in fis_data:
        for channel, channel_stats in fis_response.items():
            for stat in channel_stats:
                row = [int(channel[1:]), iso_to_datetime(stat['date'])]

                for column in COLUMNS[2:]:
                    row.append(stat['basicStats'][column])

                data.append(row)

    return pd.DataFrame(data, columns=COLUMNS).sort_values(['channel', 'date'])
Example #9
0
 def test_time_interval(self):
     for task in self.task_cases:
         with self.subTest(msg='Test case {}'.format(task.name)):
             self.assertEqual(
                 task.eop.meta_info['time_interval'],
                 [iso_to_datetime(x) for x in ('2017-1-1', '2018-1-1')])