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
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 ]
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 ]
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 ]
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
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
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
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