diff --git a/cmr/queries.py b/cmr/queries.py index 1cf0f69..db4c162 100644 --- a/cmr/queries.py +++ b/cmr/queries.py @@ -4,6 +4,7 @@ from abc import abstractmethod from collections import defaultdict +from decimal import Decimal from datetime import date, datetime, timezone from inspect import getmembers, ismethod from re import search @@ -625,7 +626,17 @@ def point(self, lon: FloatLike, lat: FloatLike) -> Self: if "point" not in self.params: self.params["point"] = [] - self.params["point"].append(f"{lon},{lat}") + # CMR rejects scientific notation in point query parameters. + lon_as_str = format(Decimal(str(lon)), "f") + lat_as_str = format(Decimal(str(lat)), "f") + + if "." not in lon_as_str: + lon_as_str += ".0" + + if "." not in lat_as_str: + lat_as_str += ".0" + + self.params["point"].append(f"{lon_as_str},{lat_as_str}") return self diff --git a/tests/test_granule.py b/tests/test_granule.py index fbf188f..9a61496 100644 --- a/tests/test_granule.py +++ b/tests/test_granule.py @@ -505,6 +505,12 @@ def test_valid_parameters(self): self.assertEqual(query.params["version"], "003") self.assertEqual(query.params["point"], ["-100.0,42.0"]) + def test_point_avoids_scientific_notation(self): + query = GranuleQuery().short_name("FOO").point(42, 0.00001) + + self.assertEqual(query.params["point"], ["42.0,0.00001"]) + self.assertIn("point[]=42.0,0.00001", query._build_url()) + def test_invalid_parameters(self): query = GranuleQuery()