예제 #1
0
    def execute(self, eopatch=None, bbox=None, time_interval=None):
        """ Main execute method for the Processing API tasks
        """

        if eopatch is not None and (bbox or time_interval):
            raise ValueError(
                'Either an eopatch must be provided or bbox and time interval, not both.'
            )

        if eopatch is None:
            eopatch = EOPatch()
            eopatch.bbox = bbox

        if self.size is not None:
            size_x, size_y = self.size
        elif self.resolution is not None:
            size_x, size_y = bbox_to_dimensions(eopatch.bbox, self.resolution)

        if time_interval:
            time_interval = parse_time_interval(time_interval)
            timestamp = self._get_timestamp(time_interval, bbox)
        else:
            timestamp = None

        if eopatch.timestamp:
            self.check_timestamp_difference(timestamp, eopatch.timestamp)
        elif timestamp:
            eopatch.timestamp = timestamp

        payloads = self._build_payloads(bbox, size_x, size_y, timestamp,
                                        time_interval)
        requests = [
            DownloadRequest(post_values=payload, **self.request_args)
            for payload in payloads
        ]

        LOGGER.debug('Downloading %d requests of type %s', len(requests),
                     str(self.data_source))
        client = SentinelHubDownloadClient(config=self.config)
        images = client.download(requests, max_threads=self.max_threads)
        LOGGER.debug('Downloads complete')

        temporal_dim = len(timestamp) if timestamp else 1
        shape = temporal_dim, size_y, size_x
        self._extract_data(eopatch, images, shape)

        eopatch.meta_info['size_x'] = size_x
        eopatch.meta_info['size_y'] = size_y
        eopatch.meta_info['time_interval'] = time_interval
        eopatch.meta_info['service_type'] = 'processing'

        self._add_meta_info(eopatch)

        return eopatch
예제 #2
0
    def _build_requests(self, bbox, size_x, size_y, timestamp, time_interval):
        """ Build requests
        """
        if self.single_scene:
            dates = [parse_time_interval(time_interval)]
        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
        ]
예제 #3
0
    def _build_requests(self, bbox, size_x, size_y, timestamp, time_interval):
        """ Build requests
        """
        if timestamp:
            dates = [(date - self.time_difference, date + self.time_difference)
                     for date in timestamp]
        else:
            dates = [parse_time_interval(time_interval, allow_undefined=True)
                     ] if time_interval else [None]

        return [
            self._create_sh_request(date, bbox, size_x, size_y)
            for date in dates
        ]
예제 #4
0
    def _build_requests(self, bbox, size_x, size_y, timestamp, time_interval):
        """Defines request timestamps and builds requests. In case `timestamp` is either `None` or an empty list it
        still has to create at least one request in order to obtain back number of bands of responses."""
        if timestamp:
            dates = [(date - self.time_difference, date + self.time_difference)
                     for date in timestamp]
        elif timestamp is None:
            dates = [None]
        else:
            dates = [parse_time_interval(time_interval, allow_undefined=True)]

        return [
            self._create_sh_request(date, bbox, size_x, size_y)
            for date in dates
        ]
예제 #5
0
    def execute(self, eopatch=None, bbox=None, time_interval=None):
        """Main execute method for the Process API tasks"""

        eopatch = eopatch or EOPatch()

        self._check_and_set_eopatch_bbox(bbox, eopatch)
        size_x, size_y = self._get_size(eopatch)

        if time_interval:
            time_interval = parse_time_interval(time_interval)
            timestamp = self._get_timestamp(time_interval, eopatch.bbox)
        elif self.data_collection.is_timeless:
            timestamp = None
        else:
            timestamp = eopatch.timestamp

        if timestamp is not None:
            eop_timestamp = [
                time_point.replace(tzinfo=None) for time_point in timestamp
            ]
            if eopatch.timestamp:
                self.check_timestamp_difference(eop_timestamp,
                                                eopatch.timestamp)
            else:
                eopatch.timestamp = eop_timestamp

        requests = self._build_requests(eopatch.bbox, size_x, size_y,
                                        timestamp, time_interval)
        requests = [request.download_list[0] for request in requests]

        LOGGER.debug("Downloading %d requests of type %s", len(requests),
                     str(self.data_collection))
        client = SentinelHubDownloadClient(config=self.config)
        responses = client.download(requests, max_threads=self.max_threads)
        LOGGER.debug("Downloads complete")

        temporal_dim = 1 if timestamp is None else len(timestamp)
        shape = temporal_dim, size_y, size_x
        self._extract_data(eopatch, responses, shape)

        eopatch.meta_info["size_x"] = size_x
        eopatch.meta_info["size_y"] = size_y
        if timestamp is not None:  # do not overwrite time interval in case of timeless features
            eopatch.meta_info["time_interval"] = serialize_time(time_interval)

        self._add_meta_info(eopatch)

        return eopatch
예제 #6
0
    def execute(self, eopatch=None, bbox=None, time_interval=None):
        """ Main execute method for the Processing API tasks
        """

        eopatch = eopatch or EOPatch()

        self._check_and_set_eopatch_bbox(bbox, eopatch)

        if self.size is not None:
            size_x, size_y = self.size
        elif self.resolution is not None:
            size_x, size_y = bbox_to_dimensions(eopatch.bbox, self.resolution)

        if time_interval:
            time_interval = parse_time_interval(time_interval)
            timestamp = self._get_timestamp(time_interval, eopatch.bbox)
        else:
            timestamp = eopatch.timestamp

        if eopatch.timestamp:
            self.check_timestamp_difference(timestamp, eopatch.timestamp)
        elif timestamp:
            eopatch.timestamp = timestamp

        requests = self._build_requests(eopatch.bbox, size_x, size_y,
                                        timestamp, time_interval)
        requests = [request.download_list[0] for request in requests]

        LOGGER.debug('Downloading %d requests of type %s', len(requests),
                     str(self.data_source))
        client = SentinelHubDownloadClient(config=self.config)
        images = client.download(requests, max_threads=self.max_threads)
        LOGGER.debug('Downloads complete')

        temporal_dim = len(timestamp) if timestamp else 1
        shape = temporal_dim, size_y, size_x
        self._extract_data(eopatch, images, shape)

        eopatch.meta_info['size_x'] = size_x
        eopatch.meta_info['size_y'] = size_y
        eopatch.meta_info['time_interval'] = time_interval
        eopatch.meta_info['service_type'] = 'processing'

        self._add_meta_info(eopatch)

        return eopatch
예제 #7
0
    def get_timestamps(self):
        """ Get the list of timestamps from within date range for which data of the bbox is available.

        :return: A list of timestamps
        :rtype: list(datetime.datetime)
        """
        if self.timestamps is None:
            if isinstance(self.time, list) and all(isinstance(timestamp, dt.datetime) for timestamp in self.time):
                self.timestamps = self.time
            else:
                time_interval = parse_time_interval(self.time)
                self.timestamps = self._get_timestamps_from_catalog(time_interval)

            self.timestamps = filter_times(self.timestamps, self.time_difference)

        if not self.timestamps:
            raise NoDataAvailableException('There are no Sentinel-2 images available for given parameters')

        return self.timestamps
예제 #8
0
    def _prepare_time_intervals(self, eopatch, time_interval):
        """Prepare a list of time intervals for which data will be collected from Meteoblue services"""
        if not eopatch.timestamp and not time_interval:
            raise ValueError("Time interval should either be defined with eopatch.timestamp of time_interval parameter")

        if time_interval:
            start_time, end_time = serialize_time(parse_time_interval(time_interval))
            return [f"{start_time}/{end_time}"]

        timestamps = eopatch.timestamp
        time_intervals = []
        for timestamp in timestamps:
            start_time = timestamp - self.time_difference
            end_time = timestamp + self.time_difference

            start_time, end_time = serialize_time((start_time, end_time))
            time_interval = f"{start_time}/{end_time}"

            time_intervals.append(time_interval)

        return time_intervals