diff --git a/copernicusmarine/catalogue_parser/request_structure.py b/copernicusmarine/catalogue_parser/request_structure.py index 164be8e4..1bd5bbd0 100644 --- a/copernicusmarine/catalogue_parser/request_structure.py +++ b/copernicusmarine/catalogue_parser/request_structure.py @@ -45,10 +45,6 @@ class DatasetTimeAndSpaceSubset: maximum_depth: Optional[float] = None start_datetime: Optional[datetime] = None end_datetime: Optional[datetime] = None - minimum_x: Optional[float] = None - maximum_x: Optional[float] = None - minimum_y: Optional[float] = None - maximum_y: Optional[float] = None @dataclass @@ -67,10 +63,6 @@ class SubsetRequest: vertical_axis: VerticalAxis = DEFAULT_VERTICAL_AXIS start_datetime: Optional[datetime] = None end_datetime: Optional[datetime] = None - minimum_x: Optional[float] = None - maximum_x: Optional[float] = None - minimum_y: Optional[float] = None - maximum_y: Optional[float] = None coordinates_selection_method: CoordinatesSelectionMethod = ( DEFAULT_COORDINATES_SELECTION_METHOD ) @@ -138,10 +130,6 @@ def get_time_and_space_subset( maximum_depth=self.maximum_depth, start_datetime=self.start_datetime, end_datetime=self.end_datetime, - minimum_x=self.minimum_x, - maximum_x=self.maximum_x, - minimum_y=self.minimum_y, - maximum_y=self.maximum_y, ) def from_file(self, filepath: pathlib.Path): diff --git a/copernicusmarine/download_functions/subset_xarray.py b/copernicusmarine/download_functions/subset_xarray.py index 1987bf99..6d243af6 100644 --- a/copernicusmarine/download_functions/subset_xarray.py +++ b/copernicusmarine/download_functions/subset_xarray.py @@ -694,51 +694,63 @@ def check_dataset_subset_bounds( else: raise ServiceNotSupported(service_name) - for coordinate_label in COORDINATES_LABEL["latitude"]: - if coordinate_label in dataset.sizes: - latitudes = dataset_coordinates[coordinate_label].values + if ( + "y" in coordinates_name_and_axis.keys() + ): # latitude and y are the same, simple + coordinate_label = coordinates_name_and_axis["y"] + latitudes = dataset_coordinates[coordinate_label].values + user_minimum_coordinate_value = ( + dataset_subset.minimum_latitude + if dataset_subset.minimum_latitude is not None + else latitudes.min() + ) + user_maximum_coordinate_value = ( + dataset_subset.maximum_latitude + if dataset_subset.maximum_latitude is not None + else latitudes.max() + ) + _check_coordinate_overlap( + dimension=coordinate_label, + user_minimum_coordinate_value=user_minimum_coordinate_value, + user_maximum_coordinate_value=user_maximum_coordinate_value, + dataset_minimum_coordinate_value=latitudes.min(), + dataset_maximum_coordinate_value=latitudes.max(), + is_strict=coordinates_selection_method == "strict-inside", + ) + if "x" in coordinates_name_and_axis.keys(): + coordinate_label = coordinates_name_and_axis["x"] + longitudes = dataset_coordinates[coordinate_label].values + if coordinate_label == "longitude": + # longitude apply moduli if longitude user_minimum_coordinate_value = ( - dataset_subset.minimum_latitude - if dataset_subset.minimum_latitude is not None - else latitudes.min() + longitude_modulus(dataset_subset.minimum_longitude) + if dataset_subset.minimum_longitude is not None + else longitudes.min() ) user_maximum_coordinate_value = ( - dataset_subset.maximum_latitude - if dataset_subset.maximum_latitude is not None - else latitudes.max() + longitude_modulus_upper_bound(dataset_subset.maximum_longitude) + if dataset_subset.maximum_longitude is not None + else longitudes.max() ) - _check_coordinate_overlap( - dimension="latitude", - user_minimum_coordinate_value=user_minimum_coordinate_value, - user_maximum_coordinate_value=user_maximum_coordinate_value, - dataset_minimum_coordinate_value=latitudes.min(), - dataset_maximum_coordinate_value=latitudes.max(), - is_strict=coordinates_selection_method == "strict-inside", + else: # don't aplpy moduli if x + user_minimum_coordinate_value = ( + dataset_subset.minimum_longitude + if dataset_subset.minimum_longitude is not None + else longitudes.min() ) - for coordinate_label in COORDINATES_LABEL["longitude"]: - if ( - coordinate_label in dataset.sizes - and coordinate_label == coordinates_name_and_axis["x"] - ): - longitudes = dataset_coordinates[coordinate_label].values - _check_coordinate_overlap( - dimension="longitude", - user_minimum_coordinate_value=( - longitude_modulus(dataset_subset.minimum_longitude) - if dataset_subset.minimum_longitude is not None - else longitudes.min() - ), - user_maximum_coordinate_value=( - longitude_modulus_upper_bound( - dataset_subset.maximum_longitude - ) - if dataset_subset.maximum_longitude is not None - else longitudes.max() - ), - dataset_minimum_coordinate_value=longitudes.min(), - dataset_maximum_coordinate_value=longitudes.max(), - is_strict=coordinates_selection_method == "strict-inside", + user_maximum_coordinate_value = ( + dataset_subset.maximum_longitude + if dataset_subset.maximum_longitude is not None + else longitudes.max() ) + _check_coordinate_overlap( + dimension=coordinate_label, + user_minimum_coordinate_value=user_minimum_coordinate_value, + user_maximum_coordinate_value=user_maximum_coordinate_value, + dataset_minimum_coordinate_value=longitudes.min(), + dataset_maximum_coordinate_value=longitudes.max(), + is_strict=coordinates_selection_method == "strict-inside", + ) for coordinate_label in COORDINATES_LABEL["time"]: if coordinate_label in dataset.sizes: times = dataset_coordinates[coordinate_label].values