Esempio n. 1
0
 def test_invalid_query(self):
     client = meteoblue_dataset_sdk.Client("invalid_api_key")
     with self.assertRaises(meteoblue_dataset_sdk.ApiError):
         result = asyncio.run(client.query({"invalid": "query"}))
         self.assertEqual(
             result,
             "API returned error message: Value required for key 'geometry'."
         )
Esempio n. 2
0
    def __init__(
        self,
        feature,
        apikey: str,
        query: dict,
        units: dict = None,
        time_difference: dt.timedelta = dt.timedelta(minutes=30),
        cache_folder: Optional[str] = None,
        cache_max_age: int = 604800,
    ):
        """
        :param feature: A feature in which Meteoblue data will be stored
        :type feature: (FeatureType, str)
        :param apikey: Meteoblue API key
        :type apikey: str
        :param query: Meteoblue dataset API query definition
        :type query: dict
        :param units: Meteoblue dataset API units definition
        :type units: dict
        :param time_difference: The size of a time interval around each timestamp for which data will be collected. It
            is used only in a combination with ``time_interval`` parameter from ``execute`` method.
        :type time_difference: datetime.timedelta
        :param cache_folder: Path to cache_folder. If set to None (default) requests will not be cached.
        :type cache_folder: str
        :param cache_max_age: Maximum age in seconds to use a cached result. Default 1 week.
        :type cache_max_age: int
        """
        self.feature = self.parse_feature(feature)
        cache = None
        if cache_folder:
            cache = FileCache(path=cache_folder, max_age=cache_max_age)

        self.client = meteoblue_dataset_sdk.Client(apikey=apikey, cache=cache)
        self.query = query
        self.units = units
        self.time_difference = time_difference
    def test_complex_query(self):
        # This query is read half of Europe and 2 years of data
        # The API will refuse to run it directly
        query_complex = {
            "units": {
                "temperature": "C",
                "velocity": "km/h",
                "length": "metric",
                "energy": "watts",
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [2.96894, 46.041886],
                        [2.96894, 48.216537],
                        [10.989692, 48.216537],
                        [10.989692, 46.041886],
                        [2.96894, 46.041886],
                    ]
                ],
            },
            "format": "json",
            "timeIntervals": ["2017-01-01T+00:00/2019-01-31T+00:00"],
            "timeIntervalsAlignment": "none",
            "queries": [
                {
                    "domain": "NEMSGLOBAL",
                    "gapFillDomain": None,
                    "timeResolution": "hourly",
                    "codes": [{"code": 11, "level": "2 m above gnd"}],
                    "transformations": [
                        {"type": "aggregateTimeInterval", "aggregation": "mean"},
                        {"type": "spatialTotalAggregate", "aggregation": "mean"},
                    ],
                }
            ],
        }

        client = meteoblue_dataset_sdk.Client(os.environ["APIKEY"])
        result = asyncio.run(client.query(query_complex))
        geo = result.geometries[0]
        timestamps = geo.timeIntervals[0].timestrings
        variable = geo.codes[0]
        data = variable.timeIntervals[0].data
        # print(result)

        self.assertEqual(geo.domain, "NEMSGLOBAL")
        self.assertEqual(geo.lats, [47.12916946411133])
        self.assertEqual(geo.lons, [6.97930908203125])
        self.assertEqual(geo.nx, 1)
        self.assertEqual(geo.ny, 1)
        self.assertEqual(geo.timeResolution, "total")

        self.assertEqual(variable.code, 11)
        self.assertEqual(variable.level, "2 m above gnd")
        self.assertEqual(variable.unit, "°C")
        self.assertEqual(variable.aggregation, "mean")

        self.assertEqual(timestamps, ["20170101T0000-20190131T235959"])
        self.assertEqual(data, [8.519842147827148])
    def test_simple_query(self):
        query = {
            "units": {
                "temperature": "C",
                "velocity": "km/h",
                "length": "metric",
                "energy": "watts",
            },
            "geometry": {
                "type": "MultiPoint",
                "coordinates": [[7.57327, 47.558399, 279]],
                "locationNames": ["Basel"],
            },
            "format": "json",
            "timeIntervals": ["2019-01-01T+00:00/2019-01-01T+00:00"],
            "timeIntervalsAlignment": "none",
            "queries": [
                {
                    "domain": "NEMSGLOBAL",
                    "gapFillDomain": None,
                    "timeResolution": "hourly",
                    "codes": [{"code": 11, "level": "2 m above gnd"}],
                }
            ],
        }

        client = meteoblue_dataset_sdk.Client(os.environ["APIKEY"])
        result = asyncio.run(client.query(query))
        geo = result.geometries[0]
        timeInterval = result.geometries[0].timeIntervals[0]
        variable = geo.codes[0]
        data = variable.timeIntervals[0].data
        # print(result)

        self.assertEqual(geo.domain, "NEMSGLOBAL")
        self.assertEqual(geo.lats, [47.66651916503906])
        self.assertEqual(geo.lons, [7.5])
        self.assertEqual(geo.asls, [499.7736511230469])
        self.assertEqual(geo.locationNames, ["Basel"])
        self.assertEqual(geo.nx, 1)
        self.assertEqual(geo.ny, 1)
        self.assertEqual(geo.timeResolution, "hourly")

        self.assertEqual(variable.code, 11)
        self.assertEqual(variable.level, "2 m above gnd")
        self.assertEqual(variable.unit, "°C")
        self.assertEqual(variable.aggregation, "none")

        self.assertEqual(timeInterval.start, 1546300800)
        self.assertEqual(timeInterval.end, 1546383600 + 3600)
        self.assertEqual(timeInterval.stride, 3600)

        self.assertEqual(
            data,
            [
                2.890000104904175,
                2.690000057220459,
                2.549999952316284,
                2.380000114440918,
                2.2699999809265137,
                2.119999885559082,
                1.9900000095367432,
                1.8300000429153442,
                1.8200000524520874,
                2.0999999046325684,
                2.430000066757202,
                2.9200000762939453,
                3.7200000286102295,
                3.930000066757202,
                3.9100000858306885,
                3.5299999713897705,
                3.130000114440918,
                2.880000114440918,
                2.6500000953674316,
                2.4600000381469727,
                2.2799999713897705,
                2.0299999713897705,
                1.690000057220459,
                1.3799999952316284,
            ],
        )
 def test_invalid_query(self):
     client = meteoblue_dataset_sdk.Client("invalid_api_key")
     with self.assertRaises(meteoblue_dataset_sdk.ApiError):
         result = asyncio.run(client.query({"invalid": "query"}))
         print(result)