From f125e1ca68f50c85658850fc10b01b2513bb9abd Mon Sep 17 00:00:00 2001 From: Amund Isaksen Date: Tue, 10 Mar 2026 15:49:12 +0100 Subject: [PATCH 1/9] Add radius to metadata --- api/metadata_endpoints.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/api/metadata_endpoints.py b/api/metadata_endpoints.py index c65264f3..319e51b9 100644 --- a/api/metadata_endpoints.py +++ b/api/metadata_endpoints.py @@ -54,7 +54,7 @@ def datetime_to_iso_string(value: datetime) -> str: iso_8601_str = value.isoformat() tz_offset_utc = "+00:00" if iso_8601_str.endswith(tz_offset_utc): - return f"{iso_8601_str[:-len(tz_offset_utc)]}Z" + return f"{iso_8601_str[: -len(tz_offset_utc)]}Z" else: return iso_8601_str @@ -193,7 +193,11 @@ async def get_collection_metadata(base_url: str, collection_id: str, is_self) -> title=collections_metadata[collection_id]["title"], links=[ Link(href=f"{base_url}/observations", rel="self" if is_self else "data"), - Link(href=collections_metadata[collection_id]["license"]["url"], rel="license", type="text/html"), + Link( + href=collections_metadata[collection_id]["license"]["url"], + rel="license", + type="text/html", + ), ], extent=Extent( spatial=Spatial( @@ -261,6 +265,13 @@ async def get_collection_metadata(base_url: str, collection_id: str, is_self) -> variables=Variables(query_type="area", output_format=["CoverageJSON"]), ) ), + radius=EDRQuery( + link=EDRQueryLink( + href=f"{base_url}/observations/radius", + rel="data", + variables=Variables(query_type="radius", output_format=["CoverageJSON"]), + ) + ), ), crs=collections_metadata[collection_id]["crs"], output_formats=["CoverageJSON"], From df1594896ad278581d62bfc0079e40543ae65190 Mon Sep 17 00:00:00 2001 From: Amund Isaksen Date: Tue, 10 Mar 2026 15:52:35 +0100 Subject: [PATCH 2/9] Add openapi docs and examples --- .../edr_query_parameter_descriptions.py | 6 ++++ api/openapi/openapi_examples.py | 33 ++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/api/openapi/edr_query_parameter_descriptions.py b/api/openapi/edr_query_parameter_descriptions.py index dbb9ced3..d83eb4f1 100644 --- a/api/openapi/edr_query_parameter_descriptions.py +++ b/api/openapi/edr_query_parameter_descriptions.py @@ -17,4 +17,10 @@ wigos_id = "WIGOS Station Identifier (WSI) of the station to query data from." format = "Specify wanted return format." point = "Point to query all data within 10 meters, specified as Well-Known Text (WKT) point coordinates." +point_radius = ( + "Point to query data from within a specified radius," + " specified as Well-Known Text (WKT) point coordinates followed by the radius in meters." +) area = "Area to query data from in Well-Known Text (WKT) polygon coordinates." +radius_within = "Defines the radius of area to query arround the coordiantes defined in the coords." +radius_within_unit = "Unit of the radius defined in within." diff --git a/api/openapi/openapi_examples.py b/api/openapi/openapi_examples.py index c6648d04..30c23a46 100644 --- a/api/openapi/openapi_examples.py +++ b/api/openapi/openapi_examples.py @@ -59,6 +59,14 @@ "METNO": {"summary": "Point in Oslo", "value": "POINT(10.72 59.9423)"}, } +within = { + "10 meters": {"value": "0.01"}, + "100 meters": {"value": "0.1"}, + "1 Kilometer": {"value": "1"}, +} + +within_unit = {"Deafult": {"value": "Kilometers"}} + polygon = { "Netherlands": { "summary": "Area in central Netherlands", @@ -74,7 +82,10 @@ naming_authority = { "Met.no": {"summary": "Norwegian Meteorological Institute", "value": "no.met"}, "FMI:": {"summary": "Finnish Meteorological Institute", "value": "fi.fmi"}, - "KNMI": {"summary": "Royal Netherlands Meteorological Institute", "value": "nl.knmi"}, + "KNMI": { + "summary": "Royal Netherlands Meteorological Institute", + "value": "nl.knmi", + }, } institution = { @@ -82,7 +93,10 @@ "summary": "Norwegian Meteorological Institute", "value": "Norwegian Meteorological Institute (MET Norway)", }, - "FMI:": {"summary": "Finnish Meteorological Institute", "value": "Finnish Meteorological Institute (FMI)"}, + "FMI:": { + "summary": "Finnish Meteorological Institute", + "value": "Finnish Meteorological Institute (FMI)", + }, "KNMI": { "summary": "Royal Netherlands Meteorological Institute", "value": "Royal Netherlands Meteorological Institute (KNMI)", @@ -91,10 +105,16 @@ standard_name = { "air_temperature": {"summary": "Air temperature", "value": "air_temperature"}, - "wind_from_direction": {"summary": "Wind direction", "value": "wind_from_direction"}, + "wind_from_direction": { + "summary": "Wind direction", + "value": "wind_from_direction", + }, "wind_speed": {"summary": "Wind speed", "value": "wind_speed"}, "relative_humidity": {"summary": "Relative humidity", "value": "relative_humidity"}, - "air_pressure_at_sea_level": {"summary": "Air pressure at sea level", "value": "air_pressure_at_sea_level"}, + "air_pressure_at_sea_level": { + "summary": "Air pressure at sea level", + "value": "air_pressure_at_sea_level", + }, } unit = { @@ -114,4 +134,7 @@ "PT10M": {"summary": "10 minutes", "value": "PT10M"}, } -method = {"mean": {"summary": "Mean", "value": "mean"}, "maximum": {"summary": "Maximum", "value": "maximum"}} +method = { + "mean": {"summary": "Mean", "value": "mean"}, + "maximum": {"summary": "Maximum", "value": "maximum"}, +} From c89fc84171f0a5214b06b42f3e5587ad06a3d7f8 Mon Sep 17 00:00:00 2001 From: Amund Isaksen Date: Tue, 10 Mar 2026 15:53:04 +0100 Subject: [PATCH 3/9] Add new endpoint radius --- api/routers/edr.py | 142 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 5 deletions(-) diff --git a/api/routers/edr.py b/api/routers/edr.py index 85c9aff5..164e63d2 100644 --- a/api/routers/edr.py +++ b/api/routers/edr.py @@ -2,6 +2,8 @@ from typing import Annotated from typing import Dict from typing import Set +from typing import Literal + import datastore_pb2 as dstore import formatters @@ -174,7 +176,11 @@ async def get_locations( ) async def get_data_location_id( location_id: Annotated[ - str, Path(description=edr_query_parameter_descriptions.wigos_id, openapi_examples=openapi_examples.wigos_id) + str, + Path( + description=edr_query_parameter_descriptions.wigos_id, + openapi_examples=openapi_examples.wigos_id, + ), ], parameter_name: Annotated[ str | None, @@ -186,7 +192,10 @@ async def get_data_location_id( ] = None, datetime: Annotated[ str | None, - Query(description=edr_query_parameter_descriptions.datetime, openapi_examples=openapi_examples.datetime), + Query( + description=edr_query_parameter_descriptions.datetime, + openapi_examples=openapi_examples.datetime, + ), ] = None, f: Annotated[ formatters.Formats, Query(description=edr_query_parameter_descriptions.format) @@ -245,7 +254,11 @@ async def get_data_location_id( ) async def get_data_position( coords: Annotated[ - str, Query(description=edr_query_parameter_descriptions.point, openapi_examples=openapi_examples.point) + str, + Query( + description=edr_query_parameter_descriptions.point, + openapi_examples=openapi_examples.point, + ), ], parameter_name: Annotated[ str | None, @@ -338,7 +351,11 @@ async def get_data_position( ) async def get_data_area( coords: Annotated[ - str, Query(description=edr_query_parameter_descriptions.area, openapi_examples=openapi_examples.polygon) + str, + Query( + description=edr_query_parameter_descriptions.area, + openapi_examples=openapi_examples.polygon, + ), ], parameter_name: Annotated[ str | None, @@ -350,7 +367,10 @@ async def get_data_area( ] = None, datetime: Annotated[ str | None, - Query(description=edr_query_parameter_descriptions.datetime, openapi_examples=openapi_examples.datetime), + Query( + description=edr_query_parameter_descriptions.datetime, + openapi_examples=openapi_examples.datetime, + ), ] = None, f: Annotated[ formatters.Formats, Query(description=edr_query_parameter_descriptions.format) @@ -418,3 +438,115 @@ async def get_data_area( response = formatters.formatters[f](observations) return response + + +@router.get( + "/radius", + tags=["Collection data queries"], + response_model=Coverage | CoverageCollection, + response_model_exclude_none=True, + response_class=CoverageJsonResponse, +) +async def get_data_radius( + coords: Annotated[ + str, + Query( + description=edr_query_parameter_descriptions.point_radius, + openapi_examples=openapi_examples.point, + ), + ], + within: Annotated[ + int | float, + Query( + alias="within", + description=edr_query_parameter_descriptions.radius_within, + openapi_examples=openapi_examples.within, + ), + ], + within_units: Annotated[ + Literal["Kilometers"], + Query( + alias="within-units", + description=edr_query_parameter_descriptions.radius_within_unit, + openapi_examples=openapi_examples.within_unit, + ), + ] = "Kilometers", + parameter_name: Annotated[ + str | None, + Query( + alias="parameter-name", + description=edr_query_parameter_descriptions.parameter_name, + openapi_examples=openapi_examples.parameter_name, + ), + ] = None, + datetime: Annotated[ + str | None, + Query( + description=edr_query_parameter_descriptions.datetime, + openapi_examples=openapi_examples.datetime, + ), + ] = None, + f: Annotated[ + formatters.Formats, Query(description=edr_query_parameter_descriptions.format) + ] = formatters.Formats.covjson, + standard_name: Annotated[ + str | None, + Query( + description=edr_query_parameter_descriptions.standard_name, + openapi_examples=custom_dimension_examples.standard_name, + ), + ] = None, + level: Annotated[ + str | None, + Query( + description=edr_query_parameter_descriptions.level, + openapi_examples=custom_dimension_examples.level, + ), + ] = None, + method: Annotated[ + str | None, + Query( + description=edr_query_parameter_descriptions.method, + openapi_examples=custom_dimension_examples.method, + ), + ] = None, + duration: Annotated[ + str | None, + Query( + description=edr_query_parameter_descriptions.duration, + openapi_examples=custom_dimension_examples.duration, + ), + ] = None, +): + try: + point = wkt.loads(coords) + if point.geom_type != "Point": + raise TypeError + except GEOSException: + raise HTTPException( + status_code=400, + detail={"coords": f"Invalid or unparseable wkt provided: {coords}"}, + ) + except TypeError: + raise HTTPException( + status_code=400, + detail={"coords": f"Invalid geometric type: {point.geom_type}"}, + ) + except Exception: + raise HTTPException( + status_code=400, + detail={"coords": f"Unexpected error occurred during wkt parsing: {coords}"}, + ) + + request = dstore.GetObsRequest( + spatial_circle=dstore.Circle(center=dstore.Point(lat=point.y, lon=point.x), radius=within), + included_response_fields=response_fields_needed_for_data_api, + ) + + await add_request_parameters(request, parameter_name, datetime, standard_name, level, method, duration) + + grpc_response = await get_obs_request(request) + observations = grpc_response.observations + response = formatters.formatters[f](observations) + + return response From 29c80d7267a4ed5b449b1b54037b39fae4aca5e1 Mon Sep 17 00:00:00 2001 From: Amund Isaksen Date: Tue, 10 Mar 2026 15:55:41 +0100 Subject: [PATCH 4/9] Add integration test for new radius endpoint --- ...adius_multiple_location_one_parameter.json | 1762 +++++++++++++++++ ...ata_radius_one_location_one_parameter.json | 567 ++++++ .../metadata_collections_all_collections.json | 12 + datastore/integration-test/test_api.py | 63 +- 4 files changed, 2397 insertions(+), 7 deletions(-) create mode 100644 datastore/integration-test/response/data_radius_multiple_location_one_parameter.json create mode 100644 datastore/integration-test/response/data_radius_one_location_one_parameter.json diff --git a/datastore/integration-test/response/data_radius_multiple_location_one_parameter.json b/datastore/integration-test/response/data_radius_multiple_location_one_parameter.json new file mode 100644 index 00000000..86d4b228 --- /dev/null +++ b/datastore/integration-test/response/data_radius_multiple_location_one_parameter.json @@ -0,0 +1,1762 @@ +{ + "type": "CoverageCollection", + "coverages": [ + { + "type": "Coverage", + "domain": { + "type": "Domain", + "domainType": "PointSeries", + "axes": { + "x": { + "values": [ + 5.1453989235756 + ] + }, + "y": { + "values": [ + 51.857593837453 + ] + }, + "t": { + "values": [ + "2022-12-31T00:00:00Z", + "2022-12-31T00:10:00Z", + "2022-12-31T00:20:00Z", + "2022-12-31T00:30:00Z", + "2022-12-31T00:40:00Z", + "2022-12-31T00:50:00Z", + "2022-12-31T01:00:00Z", + "2022-12-31T01:10:00Z", + "2022-12-31T01:20:00Z", + "2022-12-31T01:30:00Z", + "2022-12-31T01:40:00Z", + "2022-12-31T01:50:00Z", + "2022-12-31T02:00:00Z", + "2022-12-31T02:10:00Z", + "2022-12-31T02:20:00Z", + "2022-12-31T02:30:00Z", + "2022-12-31T02:40:00Z", + "2022-12-31T02:50:00Z", + "2022-12-31T03:00:00Z", + "2022-12-31T03:10:00Z", + "2022-12-31T03:20:00Z", + "2022-12-31T03:30:00Z", + "2022-12-31T03:40:00Z", + "2022-12-31T03:50:00Z", + "2022-12-31T04:00:00Z", + "2022-12-31T04:10:00Z", + "2022-12-31T04:20:00Z", + "2022-12-31T04:30:00Z", + "2022-12-31T04:40:00Z", + "2022-12-31T04:50:00Z", + "2022-12-31T05:00:00Z", + "2022-12-31T05:10:00Z", + "2022-12-31T05:20:00Z", + "2022-12-31T05:30:00Z", + "2022-12-31T05:40:00Z", + "2022-12-31T05:50:00Z", + "2022-12-31T06:00:00Z", + "2022-12-31T06:10:00Z", + "2022-12-31T06:20:00Z", + "2022-12-31T06:30:00Z", + "2022-12-31T06:40:00Z", + "2022-12-31T06:50:00Z", + "2022-12-31T07:00:00Z", + "2022-12-31T07:10:00Z", + "2022-12-31T07:20:00Z", + "2022-12-31T07:30:00Z", + "2022-12-31T07:40:00Z", + "2022-12-31T07:50:00Z", + "2022-12-31T08:00:00Z", + "2022-12-31T08:10:00Z", + "2022-12-31T08:20:00Z", + "2022-12-31T08:30:00Z", + "2022-12-31T08:40:00Z", + "2022-12-31T08:50:00Z", + "2022-12-31T09:00:00Z", + "2022-12-31T09:10:00Z", + "2022-12-31T09:20:00Z", + "2022-12-31T09:30:00Z", + "2022-12-31T09:40:00Z", + "2022-12-31T09:50:00Z", + "2022-12-31T10:00:00Z", + "2022-12-31T10:10:00Z", + "2022-12-31T10:20:00Z", + "2022-12-31T10:30:00Z", + "2022-12-31T10:40:00Z", + "2022-12-31T10:50:00Z", + "2022-12-31T11:00:00Z", + "2022-12-31T11:10:00Z", + "2022-12-31T11:20:00Z", + "2022-12-31T11:30:00Z", + "2022-12-31T11:40:00Z", + "2022-12-31T11:50:00Z", + "2022-12-31T12:00:00Z", + "2022-12-31T12:10:00Z", + "2022-12-31T12:20:00Z", + "2022-12-31T12:30:00Z", + "2022-12-31T12:40:00Z", + "2022-12-31T12:50:00Z", + "2022-12-31T13:00:00Z", + "2022-12-31T13:10:00Z", + "2022-12-31T13:20:00Z", + "2022-12-31T13:30:00Z", + "2022-12-31T13:40:00Z", + "2022-12-31T13:50:00Z", + "2022-12-31T14:00:00Z", + "2022-12-31T14:10:00Z", + "2022-12-31T14:20:00Z", + "2022-12-31T14:30:00Z", + "2022-12-31T14:40:00Z", + "2022-12-31T14:50:00Z", + "2022-12-31T15:00:00Z", + "2022-12-31T15:10:00Z", + "2022-12-31T15:20:00Z", + "2022-12-31T15:30:00Z", + "2022-12-31T15:40:00Z", + "2022-12-31T15:50:00Z", + "2022-12-31T16:00:00Z", + "2022-12-31T16:10:00Z", + "2022-12-31T16:20:00Z", + "2022-12-31T16:30:00Z", + "2022-12-31T16:40:00Z", + "2022-12-31T16:50:00Z", + "2022-12-31T17:00:00Z", + "2022-12-31T17:10:00Z", + "2022-12-31T17:20:00Z", + "2022-12-31T17:30:00Z", + "2022-12-31T17:40:00Z", + "2022-12-31T17:50:00Z", + "2022-12-31T18:00:00Z", + "2022-12-31T18:10:00Z", + "2022-12-31T18:20:00Z", + "2022-12-31T18:30:00Z", + "2022-12-31T18:40:00Z", + "2022-12-31T18:50:00Z", + "2022-12-31T19:00:00Z", + "2022-12-31T19:10:00Z", + "2022-12-31T19:20:00Z", + "2022-12-31T19:30:00Z", + "2022-12-31T19:40:00Z", + "2022-12-31T19:50:00Z", + "2022-12-31T20:00:00Z", + "2022-12-31T20:10:00Z", + "2022-12-31T20:20:00Z", + "2022-12-31T20:30:00Z", + "2022-12-31T20:40:00Z", + "2022-12-31T20:50:00Z", + "2022-12-31T21:00:00Z", + "2022-12-31T21:10:00Z", + "2022-12-31T21:20:00Z", + "2022-12-31T21:30:00Z", + "2022-12-31T21:40:00Z", + "2022-12-31T21:50:00Z", + "2022-12-31T22:00:00Z", + "2022-12-31T22:10:00Z", + "2022-12-31T22:20:00Z", + "2022-12-31T22:30:00Z", + "2022-12-31T22:40:00Z", + "2022-12-31T22:50:00Z", + "2022-12-31T23:00:00Z", + "2022-12-31T23:10:00Z", + "2022-12-31T23:20:00Z", + "2022-12-31T23:30:00Z", + "2022-12-31T23:40:00Z", + "2022-12-31T23:50:00Z" + ] + } + }, + "referencing": [ + { + "coordinates": [ + "x", + "y" + ], + "system": { + "type": "GeographicCRS", + "id": "http://www.opengis.net/def/crs/OGC/1.3/CRS84" + } + }, + { + "coordinates": [ + "t" + ], + "system": { + "type": "TemporalRS", + "calendar": "Gregorian" + } + } + ] + }, + "parameters": { + "air_temperature:1.5:maximum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'maximum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "maximum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'minimum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "minimum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + } + }, + "ranges": { + "air_temperature:1.5:maximum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.7, + 12.8, + 12.7, + 12.4, + 12.3, + 12.1, + 12.0, + 11.9, + 11.9, + 11.9, + 11.9, + 11.8, + 11.8, + 11.7, + 11.7, + 11.6, + 11.5, + 11.4, + 11.3, + 11.3, + 11.3, + 11.1, + 11.0, + 10.9, + 10.8, + 10.8, + 10.9, + 11.0, + 11.3, + 11.4, + 11.5, + 11.6, + 11.8, + 11.8, + 11.9, + 11.9, + 11.8, + 11.9, + 12.1, + 12.6, + 13.1, + 13.2, + 13.3, + 13.3, + 13.3, + 13.6, + 13.7, + 13.8, + 13.8, + 13.6, + 13.3, + 13.1, + 12.9, + 13.0, + 13.2, + 13.7, + 14.4, + 15.0, + 15.5, + 15.5, + 15.2, + 15.1, + 15.2, + 15.4, + 15.5, + 15.3, + 15.1, + 15.2, + 15.8, + 16.0, + 15.9, + 15.4, + 15.6, + 15.5, + 15.1, + 15.1, + 15.1, + 15.2, + 15.2, + 15.2, + 15.1, + 15.0, + 15.1, + 15.1, + 15.3, + 15.5, + 15.6, + 15.4, + 15.3, + 15.7, + 15.9, + 15.6, + 15.6, + 15.7, + 15.7, + 15.7, + 15.7, + 15.8, + 15.8, + 15.7, + 15.5, + 15.6, + 15.5, + 15.3, + 15.2, + 15.1, + 15.2, + 15.2, + 15.3, + 15.4, + 15.5, + 15.5, + 15.4, + 15.3, + 15.4, + 15.3, + 15.3, + 15.3, + 15.3, + 15.2, + 15.3, + 15.6, + 15.4, + 15.5, + 15.6, + 15.6, + 15.5, + 15.6, + 15.5, + 15.6, + 15.7, + 15.5, + 15.7, + 15.7, + 15.6, + 15.6, + 15.3, + 15.2, + 15.3, + 15.4, + 15.3, + 15.5, + 15.5, + 15.4 + ] + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.6, + 12.7, + 12.4, + 12.3, + 12.1, + 12.0, + 11.9, + 11.9, + 11.9, + 11.8, + 11.8, + 11.7, + 11.7, + 11.6, + 11.5, + 11.5, + 11.4, + 11.3, + 11.3, + 11.3, + 11.1, + 11.0, + 10.9, + 10.8, + 10.7, + 10.7, + 10.7, + 10.9, + 11.0, + 11.3, + 11.4, + 11.5, + 11.6, + 11.7, + 11.8, + 11.8, + 11.8, + 11.8, + 11.9, + 12.1, + 12.6, + 13.1, + 13.2, + 13.2, + 13.2, + 13.3, + 13.5, + 13.6, + 13.6, + 13.3, + 13.0, + 12.9, + 12.9, + 12.9, + 13.0, + 13.2, + 13.7, + 14.4, + 15.0, + 15.2, + 14.9, + 15.0, + 15.0, + 15.2, + 15.2, + 15.1, + 14.9, + 14.9, + 15.3, + 15.7, + 15.3, + 15.1, + 15.4, + 15.0, + 15.0, + 15.0, + 15.0, + 15.0, + 15.0, + 14.9, + 14.8, + 14.8, + 14.8, + 15.0, + 15.0, + 15.3, + 15.4, + 15.1, + 15.1, + 15.2, + 15.4, + 15.5, + 15.4, + 15.5, + 15.3, + 15.4, + 15.4, + 15.6, + 15.5, + 15.4, + 15.3, + 15.2, + 15.2, + 14.9, + 14.9, + 14.8, + 14.9, + 14.9, + 14.9, + 15.2, + 15.3, + 15.2, + 15.1, + 15.1, + 15.1, + 15.0, + 15.1, + 14.8, + 14.7, + 14.7, + 14.9, + 15.1, + 15.2, + 15.2, + 15.2, + 15.2, + 15.2, + 15.2, + 15.3, + 15.3, + 15.3, + 15.0, + 15.3, + 15.3, + 15.3, + 15.3, + 14.6, + 14.8, + 15.0, + 15.0, + 15.1, + 15.2, + 14.9, + 15.0 + ] + } + }, + "metocean:wigosId": "0-20000-0-06356" + }, + { + "type": "Coverage", + "domain": { + "type": "Domain", + "domainType": "PointSeries", + "axes": { + "x": { + "values": [ + 4.9259216999194 + ] + }, + "y": { + "values": [ + 51.969031121385 + ] + }, + "t": { + "values": [ + "2022-12-31T00:00:00Z", + "2022-12-31T00:10:00Z", + "2022-12-31T00:20:00Z", + "2022-12-31T00:30:00Z", + "2022-12-31T00:40:00Z", + "2022-12-31T00:50:00Z", + "2022-12-31T01:00:00Z", + "2022-12-31T01:10:00Z", + "2022-12-31T01:20:00Z", + "2022-12-31T01:30:00Z", + "2022-12-31T01:40:00Z", + "2022-12-31T01:50:00Z", + "2022-12-31T02:00:00Z", + "2022-12-31T02:10:00Z", + "2022-12-31T02:20:00Z", + "2022-12-31T02:30:00Z", + "2022-12-31T02:40:00Z", + "2022-12-31T02:50:00Z", + "2022-12-31T03:00:00Z", + "2022-12-31T03:10:00Z", + "2022-12-31T03:20:00Z", + "2022-12-31T03:30:00Z", + "2022-12-31T03:40:00Z", + "2022-12-31T03:50:00Z", + "2022-12-31T04:00:00Z", + "2022-12-31T04:10:00Z", + "2022-12-31T04:20:00Z", + "2022-12-31T04:30:00Z", + "2022-12-31T04:40:00Z", + "2022-12-31T04:50:00Z", + "2022-12-31T05:00:00Z", + "2022-12-31T05:10:00Z", + "2022-12-31T05:20:00Z", + "2022-12-31T05:30:00Z", + "2022-12-31T05:40:00Z", + "2022-12-31T05:50:00Z", + "2022-12-31T06:00:00Z", + "2022-12-31T06:10:00Z", + "2022-12-31T06:20:00Z", + "2022-12-31T06:30:00Z", + "2022-12-31T06:40:00Z", + "2022-12-31T06:50:00Z", + "2022-12-31T07:00:00Z", + "2022-12-31T07:10:00Z", + "2022-12-31T07:20:00Z", + "2022-12-31T07:30:00Z", + "2022-12-31T07:40:00Z", + "2022-12-31T07:50:00Z", + "2022-12-31T08:00:00Z", + "2022-12-31T08:10:00Z", + "2022-12-31T08:20:00Z", + "2022-12-31T08:30:00Z", + "2022-12-31T08:40:00Z", + "2022-12-31T08:50:00Z", + "2022-12-31T09:00:00Z", + "2022-12-31T09:10:00Z", + "2022-12-31T09:20:00Z", + "2022-12-31T09:30:00Z", + "2022-12-31T09:40:00Z", + "2022-12-31T09:50:00Z", + "2022-12-31T10:00:00Z", + "2022-12-31T10:10:00Z", + "2022-12-31T10:20:00Z", + "2022-12-31T10:30:00Z", + "2022-12-31T10:40:00Z", + "2022-12-31T10:50:00Z", + "2022-12-31T11:00:00Z", + "2022-12-31T11:10:00Z", + "2022-12-31T11:20:00Z", + "2022-12-31T11:30:00Z", + "2022-12-31T11:40:00Z", + "2022-12-31T11:50:00Z", + "2022-12-31T12:00:00Z", + "2022-12-31T12:10:00Z", + "2022-12-31T12:20:00Z", + "2022-12-31T12:30:00Z", + "2022-12-31T12:40:00Z", + "2022-12-31T12:50:00Z", + "2022-12-31T13:00:00Z", + "2022-12-31T13:10:00Z", + "2022-12-31T13:20:00Z", + "2022-12-31T13:30:00Z", + "2022-12-31T13:40:00Z", + "2022-12-31T13:50:00Z", + "2022-12-31T14:00:00Z", + "2022-12-31T14:10:00Z", + "2022-12-31T14:20:00Z", + "2022-12-31T14:30:00Z", + "2022-12-31T14:40:00Z", + "2022-12-31T14:50:00Z", + "2022-12-31T15:00:00Z", + "2022-12-31T15:10:00Z", + "2022-12-31T15:20:00Z", + "2022-12-31T15:30:00Z", + "2022-12-31T15:40:00Z", + "2022-12-31T15:50:00Z", + "2022-12-31T16:00:00Z", + "2022-12-31T16:10:00Z", + "2022-12-31T16:20:00Z", + "2022-12-31T16:30:00Z", + "2022-12-31T16:40:00Z", + "2022-12-31T16:50:00Z", + "2022-12-31T17:00:00Z", + "2022-12-31T17:10:00Z", + "2022-12-31T17:20:00Z", + "2022-12-31T17:30:00Z", + "2022-12-31T17:40:00Z", + "2022-12-31T17:50:00Z", + "2022-12-31T18:00:00Z", + "2022-12-31T18:10:00Z", + "2022-12-31T18:20:00Z", + "2022-12-31T18:30:00Z", + "2022-12-31T18:40:00Z", + "2022-12-31T18:50:00Z", + "2022-12-31T19:00:00Z", + "2022-12-31T19:10:00Z", + "2022-12-31T19:20:00Z", + "2022-12-31T19:30:00Z", + "2022-12-31T19:40:00Z", + "2022-12-31T19:50:00Z", + "2022-12-31T20:00:00Z", + "2022-12-31T20:10:00Z", + "2022-12-31T20:20:00Z", + "2022-12-31T20:30:00Z", + "2022-12-31T20:40:00Z", + "2022-12-31T20:50:00Z", + "2022-12-31T21:00:00Z", + "2022-12-31T21:10:00Z", + "2022-12-31T21:20:00Z", + "2022-12-31T21:30:00Z", + "2022-12-31T21:40:00Z", + "2022-12-31T21:50:00Z", + "2022-12-31T22:00:00Z", + "2022-12-31T22:10:00Z", + "2022-12-31T22:20:00Z", + "2022-12-31T22:30:00Z", + "2022-12-31T22:40:00Z", + "2022-12-31T22:50:00Z", + "2022-12-31T23:00:00Z", + "2022-12-31T23:10:00Z", + "2022-12-31T23:20:00Z", + "2022-12-31T23:30:00Z", + "2022-12-31T23:40:00Z", + "2022-12-31T23:50:00Z" + ] + } + }, + "referencing": [ + { + "coordinates": [ + "x", + "y" + ], + "system": { + "type": "GeographicCRS", + "id": "http://www.opengis.net/def/crs/OGC/1.3/CRS84" + } + }, + { + "coordinates": [ + "t" + ], + "system": { + "type": "TemporalRS", + "calendar": "Gregorian" + } + } + ] + }, + "parameters": { + "air_temperature:1.5:maximum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'maximum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "maximum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'minimum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "minimum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + } + }, + "ranges": { + "air_temperature:1.5:maximum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.2, + 12.2, + 12.1, + 12.1, + 11.9, + 12.0, + 11.9, + 12.0, + 12.0, + 11.9, + 11.8, + 11.8, + 11.7, + 11.5, + 11.4, + 11.3, + 11.3, + 11.2, + 11.1, + 11.0, + 10.9, + 10.8, + 10.6, + 10.5, + 10.4, + 10.3, + 10.3, + 10.3, + 10.4, + 10.5, + 10.8, + 11.1, + 11.3, + 11.5, + 11.6, + 11.6, + 11.6, + 11.7, + 11.8, + 12.0, + 12.6, + 13.1, + 13.3, + 13.4, + 13.4, + 13.3, + 13.3, + 13.4, + 13.5, + 13.5, + 13.2, + 12.9, + 12.9, + 13.0, + 13.1, + 13.2, + 13.5, + 13.9, + 14.2, + 14.4, + 14.8, + 14.7, + 14.5, + 14.7, + 14.7, + 14.9, + 14.8, + 14.7, + 14.5, + 15.3, + 15.5, + 15.5, + 15.3, + 15.0, + 14.9, + 15.0, + 14.9, + 14.8, + 15.0, + 14.9, + 14.7, + 14.6, + 14.6, + 14.6, + 14.9, + 14.7, + 14.6, + 14.4, + 14.5, + 14.2, + 14.6, + 14.7, + 15.1, + 15.2, + 15.1, + 15.2, + 15.3, + 15.2, + 15.0, + 15.1, + 15.0, + 15.0, + 15.0, + 14.8, + 14.9, + 15.0, + 15.0, + 14.8, + 14.8, + 14.9, + 15.0, + 14.9, + 15.0, + 14.9, + 15.1, + 15.2, + 15.2, + 15.1, + 15.0, + 14.9, + 14.9, + 14.8, + 15.0, + 15.0, + 15.1, + 15.0, + 15.1, + 15.2, + 15.3, + 15.3, + 15.3, + 15.1, + 15.1, + 15.1, + 15.0, + 15.1, + 15.1, + 15.1, + 15.0, + 15.0, + 15.0, + 15.0, + 15.0, + 15.0 + ] + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.0, + 12.1, + 12.1, + 11.9, + 11.9, + 11.9, + 11.9, + 11.9, + 11.9, + 11.7, + 11.7, + 11.7, + 11.5, + 11.4, + 11.3, + 11.2, + 11.2, + 11.1, + 11.0, + 10.9, + 10.8, + 10.6, + 10.5, + 10.4, + 10.3, + 10.2, + 10.2, + 10.2, + 10.3, + 10.4, + 10.5, + 10.8, + 11.1, + 11.2, + 11.5, + 11.6, + 11.6, + 11.6, + 11.6, + 11.8, + 12.0, + 12.6, + 13.1, + 13.3, + 13.3, + 13.1, + 13.1, + 13.3, + 13.4, + 13.2, + 12.9, + 12.8, + 12.8, + 12.8, + 13.0, + 13.0, + 13.2, + 13.5, + 13.8, + 14.2, + 14.4, + 14.4, + 14.3, + 14.4, + 14.5, + 14.7, + 14.6, + 14.4, + 14.3, + 14.4, + 15.1, + 15.2, + 15.0, + 14.7, + 14.7, + 14.9, + 14.7, + 14.7, + 14.7, + 14.6, + 14.5, + 14.5, + 14.5, + 14.3, + 14.6, + 14.5, + 14.4, + 14.3, + 14.1, + 14.1, + 14.0, + 14.5, + 14.6, + 14.8, + 14.9, + 14.9, + 15.0, + 14.9, + 14.8, + 14.8, + 14.8, + 14.7, + 14.7, + 14.5, + 14.5, + 14.7, + 14.6, + 14.5, + 14.5, + 14.6, + 14.7, + 14.6, + 14.7, + 14.7, + 14.8, + 14.7, + 14.8, + 14.8, + 14.6, + 14.5, + 14.6, + 14.5, + 14.4, + 14.4, + 14.7, + 14.7, + 14.8, + 14.8, + 15.0, + 15.0, + 14.9, + 14.7, + 14.8, + 14.7, + 14.7, + 14.7, + 14.8, + 14.7, + 14.6, + 14.6, + 14.8, + 14.6, + 14.8, + 14.7 + ] + } + }, + "metocean:wigosId": "0-20000-0-06348" + }, + { + "type": "Coverage", + "domain": { + "type": "Domain", + "domainType": "PointSeries", + "axes": { + "x": { + "values": [ + 5.1797058644882 + ] + }, + "y": { + "values": [ + 52.098821802977 + ] + }, + "t": { + "values": [ + "2022-12-31T00:00:00Z", + "2022-12-31T00:10:00Z", + "2022-12-31T00:20:00Z", + "2022-12-31T00:30:00Z", + "2022-12-31T00:40:00Z", + "2022-12-31T00:50:00Z", + "2022-12-31T01:00:00Z", + "2022-12-31T01:10:00Z", + "2022-12-31T01:20:00Z", + "2022-12-31T01:30:00Z", + "2022-12-31T01:40:00Z", + "2022-12-31T01:50:00Z", + "2022-12-31T02:00:00Z", + "2022-12-31T02:10:00Z", + "2022-12-31T02:20:00Z", + "2022-12-31T02:30:00Z", + "2022-12-31T02:40:00Z", + "2022-12-31T02:50:00Z", + "2022-12-31T03:00:00Z", + "2022-12-31T03:10:00Z", + "2022-12-31T03:20:00Z", + "2022-12-31T03:30:00Z", + "2022-12-31T03:40:00Z", + "2022-12-31T03:50:00Z", + "2022-12-31T04:00:00Z", + "2022-12-31T04:10:00Z", + "2022-12-31T04:20:00Z", + "2022-12-31T04:30:00Z", + "2022-12-31T04:40:00Z", + "2022-12-31T04:50:00Z", + "2022-12-31T05:00:00Z", + "2022-12-31T05:10:00Z", + "2022-12-31T05:20:00Z", + "2022-12-31T05:30:00Z", + "2022-12-31T05:40:00Z", + "2022-12-31T05:50:00Z", + "2022-12-31T06:00:00Z", + "2022-12-31T06:10:00Z", + "2022-12-31T06:20:00Z", + "2022-12-31T06:30:00Z", + "2022-12-31T06:40:00Z", + "2022-12-31T06:50:00Z", + "2022-12-31T07:00:00Z", + "2022-12-31T07:10:00Z", + "2022-12-31T07:20:00Z", + "2022-12-31T07:30:00Z", + "2022-12-31T07:40:00Z", + "2022-12-31T07:50:00Z", + "2022-12-31T08:00:00Z", + "2022-12-31T08:10:00Z", + "2022-12-31T08:20:00Z", + "2022-12-31T08:30:00Z", + "2022-12-31T08:40:00Z", + "2022-12-31T08:50:00Z", + "2022-12-31T09:00:00Z", + "2022-12-31T09:10:00Z", + "2022-12-31T09:20:00Z", + "2022-12-31T09:30:00Z", + "2022-12-31T09:40:00Z", + "2022-12-31T09:50:00Z", + "2022-12-31T10:00:00Z", + "2022-12-31T10:10:00Z", + "2022-12-31T10:20:00Z", + "2022-12-31T10:30:00Z", + "2022-12-31T10:40:00Z", + "2022-12-31T10:50:00Z", + "2022-12-31T11:00:00Z", + "2022-12-31T11:10:00Z", + "2022-12-31T11:20:00Z", + "2022-12-31T11:30:00Z", + "2022-12-31T11:40:00Z", + "2022-12-31T11:50:00Z", + "2022-12-31T12:00:00Z", + "2022-12-31T12:10:00Z", + "2022-12-31T12:20:00Z", + "2022-12-31T12:30:00Z", + "2022-12-31T12:40:00Z", + "2022-12-31T12:50:00Z", + "2022-12-31T13:00:00Z", + "2022-12-31T13:10:00Z", + "2022-12-31T13:20:00Z", + "2022-12-31T13:30:00Z", + "2022-12-31T13:40:00Z", + "2022-12-31T13:50:00Z", + "2022-12-31T14:00:00Z", + "2022-12-31T14:10:00Z", + "2022-12-31T14:20:00Z", + "2022-12-31T14:30:00Z", + "2022-12-31T14:40:00Z", + "2022-12-31T14:50:00Z", + "2022-12-31T15:00:00Z", + "2022-12-31T15:10:00Z", + "2022-12-31T15:20:00Z", + "2022-12-31T15:30:00Z", + "2022-12-31T15:40:00Z", + "2022-12-31T15:50:00Z", + "2022-12-31T16:00:00Z", + "2022-12-31T16:10:00Z", + "2022-12-31T16:20:00Z", + "2022-12-31T16:30:00Z", + "2022-12-31T16:40:00Z", + "2022-12-31T16:50:00Z", + "2022-12-31T17:00:00Z", + "2022-12-31T17:10:00Z", + "2022-12-31T17:20:00Z", + "2022-12-31T17:30:00Z", + "2022-12-31T17:40:00Z", + "2022-12-31T17:50:00Z", + "2022-12-31T18:00:00Z", + "2022-12-31T18:10:00Z", + "2022-12-31T18:20:00Z", + "2022-12-31T18:30:00Z", + "2022-12-31T18:40:00Z", + "2022-12-31T18:50:00Z", + "2022-12-31T19:00:00Z", + "2022-12-31T19:10:00Z", + "2022-12-31T19:20:00Z", + "2022-12-31T19:30:00Z", + "2022-12-31T19:40:00Z", + "2022-12-31T19:50:00Z", + "2022-12-31T20:00:00Z", + "2022-12-31T20:10:00Z", + "2022-12-31T20:20:00Z", + "2022-12-31T20:30:00Z", + "2022-12-31T20:40:00Z", + "2022-12-31T20:50:00Z", + "2022-12-31T21:00:00Z", + "2022-12-31T21:10:00Z", + "2022-12-31T21:20:00Z", + "2022-12-31T21:30:00Z", + "2022-12-31T21:40:00Z", + "2022-12-31T21:50:00Z", + "2022-12-31T22:00:00Z", + "2022-12-31T22:10:00Z", + "2022-12-31T22:20:00Z", + "2022-12-31T22:30:00Z", + "2022-12-31T22:40:00Z", + "2022-12-31T22:50:00Z", + "2022-12-31T23:00:00Z", + "2022-12-31T23:10:00Z", + "2022-12-31T23:20:00Z", + "2022-12-31T23:30:00Z", + "2022-12-31T23:40:00Z", + "2022-12-31T23:50:00Z" + ] + } + }, + "referencing": [ + { + "coordinates": [ + "x", + "y" + ], + "system": { + "type": "GeographicCRS", + "id": "http://www.opengis.net/def/crs/OGC/1.3/CRS84" + } + }, + { + "coordinates": [ + "t" + ], + "system": { + "type": "TemporalRS", + "calendar": "Gregorian" + } + } + ] + }, + "parameters": { + "air_temperature:1.5:maximum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'maximum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "maximum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'minimum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "minimum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + } + }, + "ranges": { + "air_temperature:1.5:maximum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.1, + 12.1, + 12.2, + 12.1, + 12.1, + 12.1, + 12.1, + 12.0, + 12.0, + 11.9, + 11.9, + 11.9, + 11.8, + 11.8, + 11.8, + 11.6, + 11.7, + 11.5, + 11.5, + 11.4, + 11.3, + 11.2, + 11.1, + 11.0, + 10.9, + 10.8, + 10.7, + 10.6, + 10.6, + 10.5, + 10.4, + 10.5, + 10.7, + 10.9, + 11.1, + 11.3, + 11.5, + 11.7, + 11.7, + 11.7, + 11.9, + 12.2, + 12.6, + 13.0, + 13.2, + 13.3, + 13.4, + 13.5, + 13.6, + 13.7, + 13.7, + 13.5, + 13.4, + 13.2, + 13.1, + 13.2, + 13.3, + 13.6, + 13.8, + 14.1, + 14.2, + 14.5, + 14.9, + 14.6, + 14.8, + 15.1, + 15.1, + 15.0, + 14.7, + 14.5, + 14.5, + 15.1, + 15.2, + 15.3, + 15.3, + 15.0, + 15.1, + 15.1, + 15.1, + 15.1, + 15.1, + 14.9, + 14.7, + 14.8, + 14.7, + 14.8, + 14.9, + 14.8, + 14.7, + 14.7, + 14.7, + 14.7, + 14.7, + 15.0, + 15.3, + 15.5, + 15.6, + 15.6, + 15.5, + 15.5, + 15.6, + 15.5, + 15.6, + 15.6, + 15.6, + 15.6, + 15.6, + 15.7, + 15.7, + 15.7, + 15.8, + 15.7, + 15.9, + 15.8, + 15.8, + 15.8, + 15.8, + 15.8, + 15.7, + 15.7, + 15.6, + 15.6, + 15.6, + 15.7, + 15.5, + 15.5, + 15.6, + 15.7, + 15.7, + 15.7, + 15.8, + 15.7, + 15.7, + 15.6, + 15.6, + 15.6, + 15.5, + 15.6, + 15.5, + 15.5, + 15.5, + 15.6, + 15.6, + 15.7 + ] + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.1, + 12.1, + 12.1, + 12.1, + 12.1, + 12.1, + 12.0, + 12.0, + 11.9, + 11.9, + 11.8, + 11.8, + 11.7, + 11.7, + 11.6, + 11.6, + 11.5, + 11.4, + 11.4, + 11.3, + 11.2, + 11.1, + 11.0, + 10.9, + 10.8, + 10.7, + 10.6, + 10.6, + 10.5, + 10.4, + 10.4, + 10.4, + 10.5, + 10.7, + 10.9, + 11.1, + 11.3, + 11.5, + 11.6, + 11.7, + 11.7, + 11.9, + 12.2, + 12.7, + 13.0, + 13.2, + 13.3, + 13.4, + 13.5, + 13.5, + 13.5, + 13.4, + 13.2, + 13.0, + 13.0, + 13.0, + 13.2, + 13.3, + 13.5, + 13.8, + 14.1, + 14.2, + 14.5, + 14.5, + 14.6, + 14.7, + 15.0, + 14.6, + 14.5, + 14.2, + 14.1, + 14.5, + 15.1, + 15.1, + 15.0, + 14.9, + 14.9, + 14.9, + 14.9, + 15.0, + 14.8, + 14.7, + 14.6, + 14.6, + 14.7, + 14.7, + 14.7, + 14.6, + 14.6, + 14.6, + 14.6, + 14.5, + 14.5, + 14.6, + 15.0, + 15.3, + 15.3, + 15.4, + 15.3, + 15.4, + 15.3, + 15.4, + 15.4, + 15.4, + 15.4, + 15.4, + 15.5, + 15.4, + 15.5, + 15.6, + 15.5, + 15.6, + 15.7, + 15.6, + 15.6, + 15.5, + 15.6, + 15.5, + 15.5, + 15.5, + 15.5, + 15.5, + 15.4, + 15.4, + 15.4, + 15.4, + 15.4, + 15.5, + 15.4, + 15.5, + 15.6, + 15.6, + 15.4, + 15.3, + 15.4, + 15.4, + 15.4, + 15.4, + 15.4, + 15.3, + 15.4, + 15.4, + 15.5, + 15.5 + ] + } + }, + "metocean:wigosId": "0-20000-0-06260" + } + ], + "parameters": { + "air_temperature:1.5:maximum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'maximum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "maximum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'minimum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "minimum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + } + } +} diff --git a/datastore/integration-test/response/data_radius_one_location_one_parameter.json b/datastore/integration-test/response/data_radius_one_location_one_parameter.json new file mode 100644 index 00000000..dd573eff --- /dev/null +++ b/datastore/integration-test/response/data_radius_one_location_one_parameter.json @@ -0,0 +1,567 @@ +{ + "type": "Coverage", + "domain": { + "type": "Domain", + "domainType": "PointSeries", + "axes": { + "x": { + "values": [ + 5.1797058644882 + ] + }, + "y": { + "values": [ + 52.098821802977 + ] + }, + "t": { + "values": [ + "2022-12-31T00:00:00Z", + "2022-12-31T00:10:00Z", + "2022-12-31T00:20:00Z", + "2022-12-31T00:30:00Z", + "2022-12-31T00:40:00Z", + "2022-12-31T00:50:00Z", + "2022-12-31T01:00:00Z", + "2022-12-31T01:10:00Z", + "2022-12-31T01:20:00Z", + "2022-12-31T01:30:00Z", + "2022-12-31T01:40:00Z", + "2022-12-31T01:50:00Z", + "2022-12-31T02:00:00Z", + "2022-12-31T02:10:00Z", + "2022-12-31T02:20:00Z", + "2022-12-31T02:30:00Z", + "2022-12-31T02:40:00Z", + "2022-12-31T02:50:00Z", + "2022-12-31T03:00:00Z", + "2022-12-31T03:10:00Z", + "2022-12-31T03:20:00Z", + "2022-12-31T03:30:00Z", + "2022-12-31T03:40:00Z", + "2022-12-31T03:50:00Z", + "2022-12-31T04:00:00Z", + "2022-12-31T04:10:00Z", + "2022-12-31T04:20:00Z", + "2022-12-31T04:30:00Z", + "2022-12-31T04:40:00Z", + "2022-12-31T04:50:00Z", + "2022-12-31T05:00:00Z", + "2022-12-31T05:10:00Z", + "2022-12-31T05:20:00Z", + "2022-12-31T05:30:00Z", + "2022-12-31T05:40:00Z", + "2022-12-31T05:50:00Z", + "2022-12-31T06:00:00Z", + "2022-12-31T06:10:00Z", + "2022-12-31T06:20:00Z", + "2022-12-31T06:30:00Z", + "2022-12-31T06:40:00Z", + "2022-12-31T06:50:00Z", + "2022-12-31T07:00:00Z", + "2022-12-31T07:10:00Z", + "2022-12-31T07:20:00Z", + "2022-12-31T07:30:00Z", + "2022-12-31T07:40:00Z", + "2022-12-31T07:50:00Z", + "2022-12-31T08:00:00Z", + "2022-12-31T08:10:00Z", + "2022-12-31T08:20:00Z", + "2022-12-31T08:30:00Z", + "2022-12-31T08:40:00Z", + "2022-12-31T08:50:00Z", + "2022-12-31T09:00:00Z", + "2022-12-31T09:10:00Z", + "2022-12-31T09:20:00Z", + "2022-12-31T09:30:00Z", + "2022-12-31T09:40:00Z", + "2022-12-31T09:50:00Z", + "2022-12-31T10:00:00Z", + "2022-12-31T10:10:00Z", + "2022-12-31T10:20:00Z", + "2022-12-31T10:30:00Z", + "2022-12-31T10:40:00Z", + "2022-12-31T10:50:00Z", + "2022-12-31T11:00:00Z", + "2022-12-31T11:10:00Z", + "2022-12-31T11:20:00Z", + "2022-12-31T11:30:00Z", + "2022-12-31T11:40:00Z", + "2022-12-31T11:50:00Z", + "2022-12-31T12:00:00Z", + "2022-12-31T12:10:00Z", + "2022-12-31T12:20:00Z", + "2022-12-31T12:30:00Z", + "2022-12-31T12:40:00Z", + "2022-12-31T12:50:00Z", + "2022-12-31T13:00:00Z", + "2022-12-31T13:10:00Z", + "2022-12-31T13:20:00Z", + "2022-12-31T13:30:00Z", + "2022-12-31T13:40:00Z", + "2022-12-31T13:50:00Z", + "2022-12-31T14:00:00Z", + "2022-12-31T14:10:00Z", + "2022-12-31T14:20:00Z", + "2022-12-31T14:30:00Z", + "2022-12-31T14:40:00Z", + "2022-12-31T14:50:00Z", + "2022-12-31T15:00:00Z", + "2022-12-31T15:10:00Z", + "2022-12-31T15:20:00Z", + "2022-12-31T15:30:00Z", + "2022-12-31T15:40:00Z", + "2022-12-31T15:50:00Z", + "2022-12-31T16:00:00Z", + "2022-12-31T16:10:00Z", + "2022-12-31T16:20:00Z", + "2022-12-31T16:30:00Z", + "2022-12-31T16:40:00Z", + "2022-12-31T16:50:00Z", + "2022-12-31T17:00:00Z", + "2022-12-31T17:10:00Z", + "2022-12-31T17:20:00Z", + "2022-12-31T17:30:00Z", + "2022-12-31T17:40:00Z", + "2022-12-31T17:50:00Z", + "2022-12-31T18:00:00Z", + "2022-12-31T18:10:00Z", + "2022-12-31T18:20:00Z", + "2022-12-31T18:30:00Z", + "2022-12-31T18:40:00Z", + "2022-12-31T18:50:00Z", + "2022-12-31T19:00:00Z", + "2022-12-31T19:10:00Z", + "2022-12-31T19:20:00Z", + "2022-12-31T19:30:00Z", + "2022-12-31T19:40:00Z", + "2022-12-31T19:50:00Z", + "2022-12-31T20:00:00Z", + "2022-12-31T20:10:00Z", + "2022-12-31T20:20:00Z", + "2022-12-31T20:30:00Z", + "2022-12-31T20:40:00Z", + "2022-12-31T20:50:00Z", + "2022-12-31T21:00:00Z", + "2022-12-31T21:10:00Z", + "2022-12-31T21:20:00Z", + "2022-12-31T21:30:00Z", + "2022-12-31T21:40:00Z", + "2022-12-31T21:50:00Z", + "2022-12-31T22:00:00Z", + "2022-12-31T22:10:00Z", + "2022-12-31T22:20:00Z", + "2022-12-31T22:30:00Z", + "2022-12-31T22:40:00Z", + "2022-12-31T22:50:00Z", + "2022-12-31T23:00:00Z", + "2022-12-31T23:10:00Z", + "2022-12-31T23:20:00Z", + "2022-12-31T23:30:00Z", + "2022-12-31T23:40:00Z", + "2022-12-31T23:50:00Z" + ] + } + }, + "referencing": [ + { + "coordinates": [ + "x", + "y" + ], + "system": { + "type": "GeographicCRS", + "id": "http://www.opengis.net/def/crs/OGC/1.3/CRS84" + } + }, + { + "coordinates": [ + "t" + ], + "system": { + "type": "TemporalRS", + "calendar": "Gregorian" + } + } + ] + }, + "parameters": { + "air_temperature:1.5:maximum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'maximum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "maximum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "Parameter", + "description": { + "en": "Air temperature at 1.5m, aggregated over PT10M with method 'minimum'" + }, + "observedProperty": { + "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", + "label": { + "en": "Air temperature" + } + }, + "unit": { + "label": { + "en": "Cel" + }, + "symbol": { + "value": "°C", + "type": "https://qudt.org/vocab/unit/DEG_C" + } + }, + "metocean:measurementType": { + "method": "minimum", + "duration": "PT10M" + }, + "metocean:standard_name": "air_temperature", + "metocean:level": 1.5 + } + }, + "ranges": { + "air_temperature:1.5:maximum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.1, + 12.1, + 12.2, + 12.1, + 12.1, + 12.1, + 12.1, + 12.0, + 12.0, + 11.9, + 11.9, + 11.9, + 11.8, + 11.8, + 11.8, + 11.6, + 11.7, + 11.5, + 11.5, + 11.4, + 11.3, + 11.2, + 11.1, + 11.0, + 10.9, + 10.8, + 10.7, + 10.6, + 10.6, + 10.5, + 10.4, + 10.5, + 10.7, + 10.9, + 11.1, + 11.3, + 11.5, + 11.7, + 11.7, + 11.7, + 11.9, + 12.2, + 12.6, + 13.0, + 13.2, + 13.3, + 13.4, + 13.5, + 13.6, + 13.7, + 13.7, + 13.5, + 13.4, + 13.2, + 13.1, + 13.2, + 13.3, + 13.6, + 13.8, + 14.1, + 14.2, + 14.5, + 14.9, + 14.6, + 14.8, + 15.1, + 15.1, + 15.0, + 14.7, + 14.5, + 14.5, + 15.1, + 15.2, + 15.3, + 15.3, + 15.0, + 15.1, + 15.1, + 15.1, + 15.1, + 15.1, + 14.9, + 14.7, + 14.8, + 14.7, + 14.8, + 14.9, + 14.8, + 14.7, + 14.7, + 14.7, + 14.7, + 14.7, + 15.0, + 15.3, + 15.5, + 15.6, + 15.6, + 15.5, + 15.5, + 15.6, + 15.5, + 15.6, + 15.6, + 15.6, + 15.6, + 15.6, + 15.7, + 15.7, + 15.7, + 15.8, + 15.7, + 15.9, + 15.8, + 15.8, + 15.8, + 15.8, + 15.8, + 15.7, + 15.7, + 15.6, + 15.6, + 15.6, + 15.7, + 15.5, + 15.5, + 15.6, + 15.7, + 15.7, + 15.7, + 15.8, + 15.7, + 15.7, + 15.6, + 15.6, + 15.6, + 15.5, + 15.6, + 15.5, + 15.5, + 15.5, + 15.6, + 15.6, + 15.7 + ] + }, + "air_temperature:1.5:minimum:PT10M": { + "type": "NdArray", + "dataType": "float", + "axisNames": [ + "t", + "x", + "y" + ], + "shape": [ + 144, + 1, + 1 + ], + "values": [ + 12.1, + 12.1, + 12.1, + 12.1, + 12.1, + 12.1, + 12.0, + 12.0, + 11.9, + 11.9, + 11.8, + 11.8, + 11.7, + 11.7, + 11.6, + 11.6, + 11.5, + 11.4, + 11.4, + 11.3, + 11.2, + 11.1, + 11.0, + 10.9, + 10.8, + 10.7, + 10.6, + 10.6, + 10.5, + 10.4, + 10.4, + 10.4, + 10.5, + 10.7, + 10.9, + 11.1, + 11.3, + 11.5, + 11.6, + 11.7, + 11.7, + 11.9, + 12.2, + 12.7, + 13.0, + 13.2, + 13.3, + 13.4, + 13.5, + 13.5, + 13.5, + 13.4, + 13.2, + 13.0, + 13.0, + 13.0, + 13.2, + 13.3, + 13.5, + 13.8, + 14.1, + 14.2, + 14.5, + 14.5, + 14.6, + 14.7, + 15.0, + 14.6, + 14.5, + 14.2, + 14.1, + 14.5, + 15.1, + 15.1, + 15.0, + 14.9, + 14.9, + 14.9, + 14.9, + 15.0, + 14.8, + 14.7, + 14.6, + 14.6, + 14.7, + 14.7, + 14.7, + 14.6, + 14.6, + 14.6, + 14.6, + 14.5, + 14.5, + 14.6, + 15.0, + 15.3, + 15.3, + 15.4, + 15.3, + 15.4, + 15.3, + 15.4, + 15.4, + 15.4, + 15.4, + 15.4, + 15.5, + 15.4, + 15.5, + 15.6, + 15.5, + 15.6, + 15.7, + 15.6, + 15.6, + 15.5, + 15.6, + 15.5, + 15.5, + 15.5, + 15.5, + 15.5, + 15.4, + 15.4, + 15.4, + 15.4, + 15.4, + 15.5, + 15.4, + 15.5, + 15.6, + 15.6, + 15.4, + 15.3, + 15.4, + 15.4, + 15.4, + 15.4, + 15.4, + 15.3, + 15.4, + 15.4, + 15.5, + 15.5 + ] + } + }, + "metocean:wigosId": "0-20000-0-06260" +} diff --git a/datastore/integration-test/response/metadata_collections_all_collections.json b/datastore/integration-test/response/metadata_collections_all_collections.json index 5afa8834..2ea6187d 100644 --- a/datastore/integration-test/response/metadata_collections_all_collections.json +++ b/datastore/integration-test/response/metadata_collections_all_collections.json @@ -142,6 +142,18 @@ } } }, + "radius": { + "link": { + "href": "http://localhost:8008/collections/observations/radius", + "rel": "data", + "variables": { + "query_type": "radius", + "output_format": [ + "CoverageJSON" + ] + } + } + }, "area": { "link": { "href": "http://localhost:8008/collections/observations/area", diff --git a/datastore/integration-test/test_api.py b/datastore/integration-test/test_api.py index 4283c56f..731d5d77 100644 --- a/datastore/integration-test/test_api.py +++ b/datastore/integration-test/test_api.py @@ -114,7 +114,9 @@ def test_from_a_single_collection_get_locations_within_a_bbox(): assert actual_response.status_code == 200 actual_response_is_expected_response( - actual_response, expected_json, exclude_regex_paths=exclude_properties_timeseries + actual_response, + expected_json, + exclude_regex_paths=exclude_properties_timeseries, ) @@ -129,7 +131,9 @@ def test_from_a_single_collection_get_locations_within_a_bbox_with_durations_ran assert actual_response.status_code == 200 actual_response_is_expected_response( - actual_response, expected_json, exclude_regex_paths=exclude_properties_timeseries + actual_response, + expected_json, + exclude_regex_paths=exclude_properties_timeseries, ) @@ -142,7 +146,9 @@ def test_from_a_single_collection_get_locations_within_bbox_with_levels_range_fi assert actual_response.status_code == 200 actual_response_is_expected_response( - actual_response, expected_json, exclude_regex_paths=exclude_properties_timeseries + actual_response, + expected_json, + exclude_regex_paths=exclude_properties_timeseries, ) @@ -158,7 +164,9 @@ def test_from_a_single_collection_get_locations_within_a_bbox_with_parameter_nam assert actual_response.status_code == 200 actual_response_is_expected_response( - actual_response, expected_json, exclude_regex_paths=exclude_properties_timeseries + actual_response, + expected_json, + exclude_regex_paths=exclude_properties_timeseries, ) @@ -176,7 +184,9 @@ def test_from_a_single_collection_get_locations_within_a_bbox_with_methods_and_l assert actual_response.status_code == 200 actual_response_is_expected_response( - actual_response, expected_json, exclude_regex_paths=exclude_properties_timeseries + actual_response, + expected_json, + exclude_regex_paths=exclude_properties_timeseries, ) @@ -195,7 +205,9 @@ def test_from_a_single_collection_get_locations_within_a_bbox_with_duration_and_ assert actual_response.status_code == 200 actual_response_is_expected_response( - actual_response, expected_json, exclude_regex_paths=exclude_properties_timeseries + actual_response, + expected_json, + exclude_regex_paths=exclude_properties_timeseries, ) @@ -505,7 +517,7 @@ def test_items_dont_set_bbox_or_platform(): def test_items_no_data_return(): collection_id = "observations" bbox = "-49.394531,22.593726,-36.386719,31.503629" - actual_response = requests.get(url=BASE_URL + f"/collections/{collection_id}/items" f"?bbox={bbox}") + actual_response = requests.get(url=BASE_URL + f"/collections/{collection_id}/items?bbox={bbox}") assert actual_response.status_code == 404 expected_json = load_json("response/items_no_data_found.json") @@ -517,3 +529,40 @@ def test_get_dataset(): actual_response = requests.get(url=BASE_URL + f"/collections/{collection_id}/dataset") assert actual_response.status_code == 200 + + +def test_radius_get_one_position(): + collection_id = "observations" + datetime_str = "2022-01-01T00:00Z/2023-01-01T00:00Z" + coords = "POINT(5.179705 52.0988218)" + radius = "1" + parameter_name = "air_temperature:1.5:*:*" + actual_response = requests.get( + url=BASE_URL + + f"/collections/{collection_id}/radius?coords={coords}&within={radius}&" + + f"parameter-name={parameter_name}&datetime={datetime_str}" + ) + + assert actual_response.status_code == 200 + assert actual_response.headers["Content-Type"] == "application/prs.coverage+json" + expected_json = load_json("response/data_radius_one_location_one_parameter.json") + actual_response_is_expected_response(actual_response, expected_json) + + +def test_radius_get_multiple_position(): + collection_id = "observations" + + datetime_str = "2022-01-01T00:00Z/2023-01-01T00:00Z" + parameter_name = "air_temperature:1.5:*:*" + coords = "POINT(5.179705 52.0988218)" + radius = "40" + actual_response = requests.get( + url=BASE_URL + + f"/collections/{collection_id}/radius?coords={coords}&within={radius}&" + + f"parameter-name={parameter_name}&datetime={datetime_str}" + ) + + assert actual_response.status_code == 200 + assert actual_response.headers["Content-Type"] == "application/prs.coverage+json" + expected_json = load_json("response/data_radius_multiple_location_one_parameter.json") + actual_response_is_expected_response(actual_response, expected_json) From a5b37c7a4bc69e8c79af9eab11288dc96422aa10 Mon Sep 17 00:00:00 2001 From: Amund Isaksen <31344542+Teddy-1000@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:44:58 +0100 Subject: [PATCH 5/9] Update datastore/integration-test/test_api.py Co-authored-by: Jeffrey-Vervoort-KNMI <80899828+Jeffrey-Vervoort-KNMI@users.noreply.github.com> --- datastore/integration-test/test_api.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/datastore/integration-test/test_api.py b/datastore/integration-test/test_api.py index 731d5d77..06f899af 100644 --- a/datastore/integration-test/test_api.py +++ b/datastore/integration-test/test_api.py @@ -533,19 +533,20 @@ def test_get_dataset(): def test_radius_get_one_position(): collection_id = "observations" - datetime_str = "2022-01-01T00:00Z/2023-01-01T00:00Z" + datetime_str = "2022-12-31T00:50:00Z/2022-12-31T02:10:00Z" coords = "POINT(5.179705 52.0988218)" radius = "1" - parameter_name = "air_temperature:1.5:*:*" + within_units = "Kilometers" + parameter_name = "air_temperature:1.5:maximum:PT10M" actual_response = requests.get( url=BASE_URL - + f"/collections/{collection_id}/radius?coords={coords}&within={radius}&" - + f"parameter-name={parameter_name}&datetime={datetime_str}" + + f"/collections/{collection_id}/radius?coords={coords}&within={radius}&within-units={within_units}" + + f"&datetime={datetime_str}¶meter-name={parameter_name}" ) assert actual_response.status_code == 200 assert actual_response.headers["Content-Type"] == "application/prs.coverage+json" - expected_json = load_json("response/data_radius_one_location_one_parameter.json") + expected_json = load_json("response/data_position_one_location_with_one_parameter.json") actual_response_is_expected_response(actual_response, expected_json) From 340800fe1f0e4bd9ff6ee5e3c7a2f2402d9d30d3 Mon Sep 17 00:00:00 2001 From: Amund Isaksen <31344542+Teddy-1000@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:45:20 +0100 Subject: [PATCH 6/9] Update api/openapi/openapi_examples.py Co-authored-by: Jeffrey-Vervoort-KNMI <80899828+Jeffrey-Vervoort-KNMI@users.noreply.github.com> --- api/openapi/openapi_examples.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/openapi/openapi_examples.py b/api/openapi/openapi_examples.py index 30c23a46..fe8fa504 100644 --- a/api/openapi/openapi_examples.py +++ b/api/openapi/openapi_examples.py @@ -65,7 +65,7 @@ "1 Kilometer": {"value": "1"}, } -within_unit = {"Deafult": {"value": "Kilometers"}} +within_unit = {"Default": {"value": "Kilometers"}} polygon = { "Netherlands": { From 0c00f99cb32445186f189b88c15efd5ea5196221 Mon Sep 17 00:00:00 2001 From: Amund Isaksen <31344542+Teddy-1000@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:45:30 +0100 Subject: [PATCH 7/9] Update api/openapi/edr_query_parameter_descriptions.py Co-authored-by: Jeffrey-Vervoort-KNMI <80899828+Jeffrey-Vervoort-KNMI@users.noreply.github.com> --- api/openapi/edr_query_parameter_descriptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/openapi/edr_query_parameter_descriptions.py b/api/openapi/edr_query_parameter_descriptions.py index d83eb4f1..55b1e1d1 100644 --- a/api/openapi/edr_query_parameter_descriptions.py +++ b/api/openapi/edr_query_parameter_descriptions.py @@ -22,5 +22,5 @@ " specified as Well-Known Text (WKT) point coordinates followed by the radius in meters." ) area = "Area to query data from in Well-Known Text (WKT) polygon coordinates." -radius_within = "Defines the radius of area to query arround the coordiantes defined in the coords." +radius_within = "Defines the radius of area to query around the coordinates defined in the coords." radius_within_unit = "Unit of the radius defined in within." From c6d77ebbbbf23d32a932f227ab5cc1f3f597425c Mon Sep 17 00:00:00 2001 From: Amund Isaksen <31344542+Teddy-1000@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:45:56 +0100 Subject: [PATCH 8/9] Update api/openapi/edr_query_parameter_descriptions.py Co-authored-by: Jeffrey-Vervoort-KNMI <80899828+Jeffrey-Vervoort-KNMI@users.noreply.github.com> --- api/openapi/edr_query_parameter_descriptions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/openapi/edr_query_parameter_descriptions.py b/api/openapi/edr_query_parameter_descriptions.py index 55b1e1d1..f7530627 100644 --- a/api/openapi/edr_query_parameter_descriptions.py +++ b/api/openapi/edr_query_parameter_descriptions.py @@ -19,7 +19,8 @@ point = "Point to query all data within 10 meters, specified as Well-Known Text (WKT) point coordinates." point_radius = ( "Point to query data from within a specified radius," - " specified as Well-Known Text (WKT) point coordinates followed by the radius in meters." + " specified as Well-Known Text (WKT) point coordinates." + "Coordinates are given as longitude then latitude (`lon` `lat`) in degrees. Only 2D points are supported." ) area = "Area to query data from in Well-Known Text (WKT) polygon coordinates." radius_within = "Defines the radius of area to query around the coordinates defined in the coords." From 69bb241e76f171e8f4dd337a69df8e91e72bcdaf Mon Sep 17 00:00:00 2001 From: Amund Isaksen Date: Wed, 11 Mar 2026 11:09:32 +0100 Subject: [PATCH 9/9] Remove unused response file --- ...ata_radius_one_location_one_parameter.json | 567 ------------------ 1 file changed, 567 deletions(-) delete mode 100644 datastore/integration-test/response/data_radius_one_location_one_parameter.json diff --git a/datastore/integration-test/response/data_radius_one_location_one_parameter.json b/datastore/integration-test/response/data_radius_one_location_one_parameter.json deleted file mode 100644 index dd573eff..00000000 --- a/datastore/integration-test/response/data_radius_one_location_one_parameter.json +++ /dev/null @@ -1,567 +0,0 @@ -{ - "type": "Coverage", - "domain": { - "type": "Domain", - "domainType": "PointSeries", - "axes": { - "x": { - "values": [ - 5.1797058644882 - ] - }, - "y": { - "values": [ - 52.098821802977 - ] - }, - "t": { - "values": [ - "2022-12-31T00:00:00Z", - "2022-12-31T00:10:00Z", - "2022-12-31T00:20:00Z", - "2022-12-31T00:30:00Z", - "2022-12-31T00:40:00Z", - "2022-12-31T00:50:00Z", - "2022-12-31T01:00:00Z", - "2022-12-31T01:10:00Z", - "2022-12-31T01:20:00Z", - "2022-12-31T01:30:00Z", - "2022-12-31T01:40:00Z", - "2022-12-31T01:50:00Z", - "2022-12-31T02:00:00Z", - "2022-12-31T02:10:00Z", - "2022-12-31T02:20:00Z", - "2022-12-31T02:30:00Z", - "2022-12-31T02:40:00Z", - "2022-12-31T02:50:00Z", - "2022-12-31T03:00:00Z", - "2022-12-31T03:10:00Z", - "2022-12-31T03:20:00Z", - "2022-12-31T03:30:00Z", - "2022-12-31T03:40:00Z", - "2022-12-31T03:50:00Z", - "2022-12-31T04:00:00Z", - "2022-12-31T04:10:00Z", - "2022-12-31T04:20:00Z", - "2022-12-31T04:30:00Z", - "2022-12-31T04:40:00Z", - "2022-12-31T04:50:00Z", - "2022-12-31T05:00:00Z", - "2022-12-31T05:10:00Z", - "2022-12-31T05:20:00Z", - "2022-12-31T05:30:00Z", - "2022-12-31T05:40:00Z", - "2022-12-31T05:50:00Z", - "2022-12-31T06:00:00Z", - "2022-12-31T06:10:00Z", - "2022-12-31T06:20:00Z", - "2022-12-31T06:30:00Z", - "2022-12-31T06:40:00Z", - "2022-12-31T06:50:00Z", - "2022-12-31T07:00:00Z", - "2022-12-31T07:10:00Z", - "2022-12-31T07:20:00Z", - "2022-12-31T07:30:00Z", - "2022-12-31T07:40:00Z", - "2022-12-31T07:50:00Z", - "2022-12-31T08:00:00Z", - "2022-12-31T08:10:00Z", - "2022-12-31T08:20:00Z", - "2022-12-31T08:30:00Z", - "2022-12-31T08:40:00Z", - "2022-12-31T08:50:00Z", - "2022-12-31T09:00:00Z", - "2022-12-31T09:10:00Z", - "2022-12-31T09:20:00Z", - "2022-12-31T09:30:00Z", - "2022-12-31T09:40:00Z", - "2022-12-31T09:50:00Z", - "2022-12-31T10:00:00Z", - "2022-12-31T10:10:00Z", - "2022-12-31T10:20:00Z", - "2022-12-31T10:30:00Z", - "2022-12-31T10:40:00Z", - "2022-12-31T10:50:00Z", - "2022-12-31T11:00:00Z", - "2022-12-31T11:10:00Z", - "2022-12-31T11:20:00Z", - "2022-12-31T11:30:00Z", - "2022-12-31T11:40:00Z", - "2022-12-31T11:50:00Z", - "2022-12-31T12:00:00Z", - "2022-12-31T12:10:00Z", - "2022-12-31T12:20:00Z", - "2022-12-31T12:30:00Z", - "2022-12-31T12:40:00Z", - "2022-12-31T12:50:00Z", - "2022-12-31T13:00:00Z", - "2022-12-31T13:10:00Z", - "2022-12-31T13:20:00Z", - "2022-12-31T13:30:00Z", - "2022-12-31T13:40:00Z", - "2022-12-31T13:50:00Z", - "2022-12-31T14:00:00Z", - "2022-12-31T14:10:00Z", - "2022-12-31T14:20:00Z", - "2022-12-31T14:30:00Z", - "2022-12-31T14:40:00Z", - "2022-12-31T14:50:00Z", - "2022-12-31T15:00:00Z", - "2022-12-31T15:10:00Z", - "2022-12-31T15:20:00Z", - "2022-12-31T15:30:00Z", - "2022-12-31T15:40:00Z", - "2022-12-31T15:50:00Z", - "2022-12-31T16:00:00Z", - "2022-12-31T16:10:00Z", - "2022-12-31T16:20:00Z", - "2022-12-31T16:30:00Z", - "2022-12-31T16:40:00Z", - "2022-12-31T16:50:00Z", - "2022-12-31T17:00:00Z", - "2022-12-31T17:10:00Z", - "2022-12-31T17:20:00Z", - "2022-12-31T17:30:00Z", - "2022-12-31T17:40:00Z", - "2022-12-31T17:50:00Z", - "2022-12-31T18:00:00Z", - "2022-12-31T18:10:00Z", - "2022-12-31T18:20:00Z", - "2022-12-31T18:30:00Z", - "2022-12-31T18:40:00Z", - "2022-12-31T18:50:00Z", - "2022-12-31T19:00:00Z", - "2022-12-31T19:10:00Z", - "2022-12-31T19:20:00Z", - "2022-12-31T19:30:00Z", - "2022-12-31T19:40:00Z", - "2022-12-31T19:50:00Z", - "2022-12-31T20:00:00Z", - "2022-12-31T20:10:00Z", - "2022-12-31T20:20:00Z", - "2022-12-31T20:30:00Z", - "2022-12-31T20:40:00Z", - "2022-12-31T20:50:00Z", - "2022-12-31T21:00:00Z", - "2022-12-31T21:10:00Z", - "2022-12-31T21:20:00Z", - "2022-12-31T21:30:00Z", - "2022-12-31T21:40:00Z", - "2022-12-31T21:50:00Z", - "2022-12-31T22:00:00Z", - "2022-12-31T22:10:00Z", - "2022-12-31T22:20:00Z", - "2022-12-31T22:30:00Z", - "2022-12-31T22:40:00Z", - "2022-12-31T22:50:00Z", - "2022-12-31T23:00:00Z", - "2022-12-31T23:10:00Z", - "2022-12-31T23:20:00Z", - "2022-12-31T23:30:00Z", - "2022-12-31T23:40:00Z", - "2022-12-31T23:50:00Z" - ] - } - }, - "referencing": [ - { - "coordinates": [ - "x", - "y" - ], - "system": { - "type": "GeographicCRS", - "id": "http://www.opengis.net/def/crs/OGC/1.3/CRS84" - } - }, - { - "coordinates": [ - "t" - ], - "system": { - "type": "TemporalRS", - "calendar": "Gregorian" - } - } - ] - }, - "parameters": { - "air_temperature:1.5:maximum:PT10M": { - "type": "Parameter", - "description": { - "en": "Air temperature at 1.5m, aggregated over PT10M with method 'maximum'" - }, - "observedProperty": { - "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", - "label": { - "en": "Air temperature" - } - }, - "unit": { - "label": { - "en": "Cel" - }, - "symbol": { - "value": "°C", - "type": "https://qudt.org/vocab/unit/DEG_C" - } - }, - "metocean:measurementType": { - "method": "maximum", - "duration": "PT10M" - }, - "metocean:standard_name": "air_temperature", - "metocean:level": 1.5 - }, - "air_temperature:1.5:minimum:PT10M": { - "type": "Parameter", - "description": { - "en": "Air temperature at 1.5m, aggregated over PT10M with method 'minimum'" - }, - "observedProperty": { - "id": "https://vocab.nerc.ac.uk/standard_name/air_temperature", - "label": { - "en": "Air temperature" - } - }, - "unit": { - "label": { - "en": "Cel" - }, - "symbol": { - "value": "°C", - "type": "https://qudt.org/vocab/unit/DEG_C" - } - }, - "metocean:measurementType": { - "method": "minimum", - "duration": "PT10M" - }, - "metocean:standard_name": "air_temperature", - "metocean:level": 1.5 - } - }, - "ranges": { - "air_temperature:1.5:maximum:PT10M": { - "type": "NdArray", - "dataType": "float", - "axisNames": [ - "t", - "x", - "y" - ], - "shape": [ - 144, - 1, - 1 - ], - "values": [ - 12.1, - 12.1, - 12.2, - 12.1, - 12.1, - 12.1, - 12.1, - 12.0, - 12.0, - 11.9, - 11.9, - 11.9, - 11.8, - 11.8, - 11.8, - 11.6, - 11.7, - 11.5, - 11.5, - 11.4, - 11.3, - 11.2, - 11.1, - 11.0, - 10.9, - 10.8, - 10.7, - 10.6, - 10.6, - 10.5, - 10.4, - 10.5, - 10.7, - 10.9, - 11.1, - 11.3, - 11.5, - 11.7, - 11.7, - 11.7, - 11.9, - 12.2, - 12.6, - 13.0, - 13.2, - 13.3, - 13.4, - 13.5, - 13.6, - 13.7, - 13.7, - 13.5, - 13.4, - 13.2, - 13.1, - 13.2, - 13.3, - 13.6, - 13.8, - 14.1, - 14.2, - 14.5, - 14.9, - 14.6, - 14.8, - 15.1, - 15.1, - 15.0, - 14.7, - 14.5, - 14.5, - 15.1, - 15.2, - 15.3, - 15.3, - 15.0, - 15.1, - 15.1, - 15.1, - 15.1, - 15.1, - 14.9, - 14.7, - 14.8, - 14.7, - 14.8, - 14.9, - 14.8, - 14.7, - 14.7, - 14.7, - 14.7, - 14.7, - 15.0, - 15.3, - 15.5, - 15.6, - 15.6, - 15.5, - 15.5, - 15.6, - 15.5, - 15.6, - 15.6, - 15.6, - 15.6, - 15.6, - 15.7, - 15.7, - 15.7, - 15.8, - 15.7, - 15.9, - 15.8, - 15.8, - 15.8, - 15.8, - 15.8, - 15.7, - 15.7, - 15.6, - 15.6, - 15.6, - 15.7, - 15.5, - 15.5, - 15.6, - 15.7, - 15.7, - 15.7, - 15.8, - 15.7, - 15.7, - 15.6, - 15.6, - 15.6, - 15.5, - 15.6, - 15.5, - 15.5, - 15.5, - 15.6, - 15.6, - 15.7 - ] - }, - "air_temperature:1.5:minimum:PT10M": { - "type": "NdArray", - "dataType": "float", - "axisNames": [ - "t", - "x", - "y" - ], - "shape": [ - 144, - 1, - 1 - ], - "values": [ - 12.1, - 12.1, - 12.1, - 12.1, - 12.1, - 12.1, - 12.0, - 12.0, - 11.9, - 11.9, - 11.8, - 11.8, - 11.7, - 11.7, - 11.6, - 11.6, - 11.5, - 11.4, - 11.4, - 11.3, - 11.2, - 11.1, - 11.0, - 10.9, - 10.8, - 10.7, - 10.6, - 10.6, - 10.5, - 10.4, - 10.4, - 10.4, - 10.5, - 10.7, - 10.9, - 11.1, - 11.3, - 11.5, - 11.6, - 11.7, - 11.7, - 11.9, - 12.2, - 12.7, - 13.0, - 13.2, - 13.3, - 13.4, - 13.5, - 13.5, - 13.5, - 13.4, - 13.2, - 13.0, - 13.0, - 13.0, - 13.2, - 13.3, - 13.5, - 13.8, - 14.1, - 14.2, - 14.5, - 14.5, - 14.6, - 14.7, - 15.0, - 14.6, - 14.5, - 14.2, - 14.1, - 14.5, - 15.1, - 15.1, - 15.0, - 14.9, - 14.9, - 14.9, - 14.9, - 15.0, - 14.8, - 14.7, - 14.6, - 14.6, - 14.7, - 14.7, - 14.7, - 14.6, - 14.6, - 14.6, - 14.6, - 14.5, - 14.5, - 14.6, - 15.0, - 15.3, - 15.3, - 15.4, - 15.3, - 15.4, - 15.3, - 15.4, - 15.4, - 15.4, - 15.4, - 15.4, - 15.5, - 15.4, - 15.5, - 15.6, - 15.5, - 15.6, - 15.7, - 15.6, - 15.6, - 15.5, - 15.6, - 15.5, - 15.5, - 15.5, - 15.5, - 15.5, - 15.4, - 15.4, - 15.4, - 15.4, - 15.4, - 15.5, - 15.4, - 15.5, - 15.6, - 15.6, - 15.4, - 15.3, - 15.4, - 15.4, - 15.4, - 15.4, - 15.4, - 15.3, - 15.4, - 15.4, - 15.5, - 15.5 - ] - } - }, - "metocean:wigosId": "0-20000-0-06260" -}