diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9abd205 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.nc filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 58e11c7..5c04f27 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,6 +11,8 @@ jobs: PYTHON: 3.9 steps: - uses: actions/checkout@v3 + with: + lfs: 'true' - name: Set up Python ${{ env.PYTHON }} uses: actions/setup-python@v4 with: @@ -39,6 +41,8 @@ jobs: os: [ ubuntu-22.04 ] steps: - uses: actions/checkout@v3 + with: + lfs: 'true' - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: diff --git a/README.md b/README.md index 57c36a7..2f0ea0b 100644 --- a/README.md +++ b/README.md @@ -2,73 +2,112 @@ implementations of readers for the pyaerocom project using pyaro as interface ## Installation -`python -m pip install 'pyaro-readers@git+https://github.com/metno/pyaro-readers.git'` +`python -m pip install 'pyaro-readers@git+https://github.com/metno/pyaro-readers.git'` This will install pyaro and pyaro-readers and all their dependencies. ## Supported readers -### aeronetsunreader -Reader for aeronet sun version 3 data (https://aeronet.gsfc.nasa.gov/new_web/download_all_v3_aod.html). +### aeronetsunreader +Reader for aeronet sun version 3 data (https://aeronet.gsfc.nasa.gov/new_web/download_all_v3_aod.html). The reader supports reading from an uncompressed local file and from an URL providing a zip file or an -uncompressed file. -If a zip file URL is provided, only the 1st file in there is used (since the +uncompressed file. +If a zip file URL is provided, only the 1st file in there is used (since the Aeronet provided zip contains all data in a single file). ### aeronetsdareader -Reader for aeronet SDA version 3 data (https://aeronet.gsfc.nasa.gov/new_web/download_all_v3_aod.html). +Reader for aeronet SDA version 3 data (https://aeronet.gsfc.nasa.gov/new_web/download_all_v3_aod.html). The reader supports reading from an uncompressed local file and from an URL providing a zip file, an -uncompressed file or a tar file (including all common compression formats). -If a zip file URL is provided, only the 1st file in there is used (since the +uncompressed file or a tar file (including all common compression formats). +If a zip file URL is provided, only the 1st file in there is used (since the Aeronet provided zip contains all data in a single file). +### ascii2netcdf +Reader for databases created with MSC-W tools niluNasaAmes2Netcdf or eea_airquip2emepdata.py. +The database consists of a directory with a list of stations, i.e. `StationList.csv` and netcdf +data-files per year with resolutions `hourly`, `daily`, `weekly`, `monthly` and `yearly` and a naming +of `data_{resolution}.{YYYY}.nc`, e.g. `data_daily.2021.nc`. A test-database with daily data only +can be found under `tests/testdata/NILU`. + +The MSC-W database contains the EBAS database for 1990-2021 and the EEA_Airquip database for +2016-2018 as of yearly 2024. The data in the database is already aggregated, i.e. daily files +contain already hourly data if enough hours have been measured. Therefore, `resolution` is a +required parameter. + + ## Usage ### aeronetsunreader ```python -import pyaro.timeseries +import pyaro TEST_URL = "https://pyaerocom.met.no/pyaro-suppl/testdata/aeronetsun_testdata.csv" -engine = pyaro.list_timeseries_engines()["aeronetsunreader"] -ts = engine.open(TEST_URL, filters=[], fill_country_flag=False) -print(ts.variables()) -# stations -ts.data('AOD_550nm')['stations'] -# start_times -ts.data('AOD_550nm')['start_times'] -# stop_times -ts.data('AOD_550nm')['end_times'] -# latitudes -ts.data('AOD_550nm')['latitudes'] -# longitudes -ts.data('AOD_550nm')['longitudes'] -# altitudes -ts.data('AOD_550nm')['altitudes'] -# values -ts.data('AOD_550nm')['values'] +with pyro.open_timeseries("aeronetsunreader", TEST_URL, filters=[], fill_country_flag=False) as ts: + print(ts.variables()) + data = ts.data('AOD_550nm') + # stations + data.stations + # start_times + data.start_times + # stop_times + data.end_times + # latitudes + data.latitudes + # longitudes + data.longitudes + # altitudes + data.altitudes + # values + data.values ``` ### aeronetsdareader ```python -import pyaro.timeseries +import pyaro TEST_URL = "https://pyaerocom.met.no/pyaro-suppl/testdata/SDA_Level20_Daily_V3_testdata.tar.gz" -engine = pyaro.list_timeseries_engines()["aeronetsdareader"] -ts = engine.open(TEST_URL, filters=[], fill_country_flag=False) -print(ts.variables()) -# stations -ts.data('AODGT1_550nm')['stations'] -# start_times -ts.data('AODGT1_550nm')['start_times'] -# stop_times -ts.data('AODGT1_550nm')['end_times'] -# latitudes -ts.data('AODGT1_550nm')['latitudes'] -# longitudes -ts.data('AODGT1_550nm')['longitudes'] -# altitudes -ts.data('AODGT1_550nm')['altitudes'] -# values -ts.data('AODGT1_550nm')['values'] +with pyaro.open_timeseries("aeronetsdareader", TEST_URL, filters=[], fill_country_flag=False) as ts: + print(ts.variables()) + data = ts.data('AODGT1_550nm') + # stations + data.stations + # start_times + data.start_times + # stop_times + data.end_times + # latitudes + data.latitudes + # longitudes + data.longitudes + # altitudes + data.altitudes + # values + data.values +``` + +### ascii2netcdf +```python +import pyaro +TEST_URL = "/lustre/storeB/project/fou/kl/emep/Auxiliary/NILU/" +with pyaro.open_timeseries( + 'ascii2netcdf', EBAS_URL, resolution="daily", filters=[] +) as ts: + data = ts.data("sulphur_dioxide_in_air") + data.units # ug + # stations + data.stations + # start_times + data.start_times + # stop_times + data.end_times + # latitudes + data.latitudes + # longitudes + data.longitudes + # altitudes + data.altitudes + # values + data.values ``` + ### geocoder_reverse_natural_earth geocoder_reverse_natural_earth is small helper to identify country codes for obs networks that don't mention the countrycode of a station in their location data @@ -89,7 +128,7 @@ except Geocoder_Reverse_Exception as grex: print(f"error: {lat},{lon}") else: print(dummy["ISO_A2_EH"]) - - -``` \ No newline at end of file + + +``` diff --git a/pyproject.toml b/pyproject.toml_future similarity index 91% rename from pyproject.toml rename to pyproject.toml_future index d91108d..cfc33c1 100644 --- a/pyproject.toml +++ b/pyproject.toml_future @@ -22,16 +22,17 @@ classifiers = [ ] requires-python = ">=3.9" dependencies = [ - "pyaro@git+https://github.com/metno/pyaro", + "pyaro >=0.0.6", "requests", "fiona", + "netCDF4", "shapely", "rtree", "tqdm", ] [tool.setuptools] -packages = ["pyaro_readers.aeronetsunreader", "pyaro_readers.aeronetsdareader","geocoder_reverse_natural_earth"] +packages = ["pyaro_readers.aeronetsunreader", "pyaro_readers.aeronetsdareader","geocoder_reverse_natural_earth", "pyaro_readers.ascii2netcdf"] package-dir = {"" = "src"} [tool.setuptools.package-data] @@ -44,6 +45,7 @@ geocoder_reverse_natural_earth = ["*.zip"] [project.entry-points."pyaro.timeseries"] "aeronetsunreader" = "pyaro_readers.aeronetsunreader:AeronetSunTimeseriesEngine" "aeronetsdareader" = "pyaro_readers.aeronetsdareader:AeronetSdaTimeseriesEngine" +"ascii2netcdf" = "pyaro_readers.ascii2netcdf:Ascii2NetcdfTimeseriesEngine" [tool.mypy] python_version = "3.9" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..06de1dd --- /dev/null +++ b/setup.cfg @@ -0,0 +1,65 @@ +[metadata] +name = pyaro_readers +version = 0.0.3dev +author = MET Norway +description = implementations of pyaerocom reading plugings using pyaro as interface +long_description = file: README.md +long_description_content_type = text/markdown +classifiers = + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: 3.9 + Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 + License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3) + Operating System :: OS Independent + Development Status :: 3 - Alpha + Intended Audience :: Science/Research + Intended Audience :: Education + Topic :: Scientific/Engineering :: Atmospheric Science +url = https://github.com/metno/pyaro-readers + +[options] +python_version = >=3.9 +install_requires = + pyaro >= 0.0.6 + netCDF4 + requests + fiona + shapely + rtree + tqdm + +package_dir = + =src +packages = pyaro_readers.aeronetsunreader, pyaro_readers.aeronetsdareader, geocoder_reverse_natural_earth, pyaro_readers.ascii2netcdf +test_require = tox:tox + +[options.package_data] +geocoder_reverse_natural_earth = + *.zip + +[options.entry_points] +pyaro.timeseries = + aeronetsunreader = pyaro_readers.aeronetsunreader:AeronetSunTimeseriesEngine + aeronetsdareader = pyaro_readers.aeronetsdareader:AeronetSdaTimeseriesEngine + ascii2netcdf = pyaro_readers.ascii2netcdf:Ascii2NetcdfTimeseriesEngine + + +[tox:tox] +min_version = 4.0 +skip_missing_interpreters = True +isolated_build = True +env_list = + py310 + format +#depends = + +[testenv] +commands = python3 -m unittest discover -s tests + +[testenv:format] +commands = + pre-commit run --all-files --show-diff-on-failure +deps = + pre-commit + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..229b2eb --- /dev/null +++ b/setup.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +from setuptools import setup + +setup() diff --git a/src/pyaro_readers/ascii2netcdf/Ascii2NetcdfTimeseries.py b/src/pyaro_readers/ascii2netcdf/Ascii2NetcdfTimeseries.py new file mode 100644 index 0000000..d9c5ba1 --- /dev/null +++ b/src/pyaro_readers/ascii2netcdf/Ascii2NetcdfTimeseries.py @@ -0,0 +1,260 @@ +import csv +import glob +import inspect +import logging +import os +import netCDF4 +import numpy as np +from pyaro.timeseries import ( + AutoFilterReaderEngine, + Data, + Flag, + NpStructuredData, + Station, +) +import pyaro.timeseries.Filter + +logger = logging.getLogger(__name__) + + +class Ascii2NetcdfTimeseriesReaderException(Exception): + pass + + +class Ascii2NetcdfTimeseriesReader(AutoFilterReaderEngine.AutoFilterReader): + RESOLUTIONS = { + 60 * 60: "hourly", + 60 * 60 * 24: "daily", + 60 * 60 * 24 * 7: "weekly", + 60 * 60 * 24 * 28: "monthly", + 60 * 60 * 24 * 365: "yearly", + } + + def __init__( + self, + filename, + resolution="daily", + filters=[], + ): + """Initialize/open a new reader for netcdf-files converted from EBAS NASA-Ames-files + with niluNasaAmes2netcdf.pl. + + :param filename: directory name for data_daily.YYYY.nc, e.g. + /lustre/storeB/project/fou/kl/emep/Auxiliary/NILU + :param resolution: hourly, daily, weekly, monthly, yearly + The resolutions are already merged in the conversion from ascii to netcdf, e.g. daily + contains the accumulated hourly data, too. + :param filters: list of filters, defaults to [] + """ + self._set_filters(filters) + if os.path.isdir(filename): + self._directory = filename + else: + raise Ascii2NetcdfTimeseriesReaderException( + f"no such file or directory: {filename}" + ) + + if resolution in self.RESOLUTIONS.values(): + self._resolution = resolution + else: + raise Ascii2NetcdfTimeseriesReaderException( + f"unknown resolution: resolution" + ) + + dataglob = os.path.join(self._directory, f"data_{self._resolution}.????.nc") + self._years = set() + for file in glob.iglob(dataglob): + year = file[-7:-3] + if self._is_year_in_filters(year): + self._years.add(year) + + self._variables = self._read_file_variables() + station_file = "StationList.csv" + station_filepath = os.path.join(self._directory, station_file) + if os.path.exists(station_filepath): + self._stations = self._read_station_list(station_filepath) + else: + dirname = os.path.basename(self._directory) + station_file = dirname + station_file # e.g. AirbaseStationList.csv + station_filepath = os.path.join(self._directory, station_file) + if os.exists(station_filepath): + self._stations = self._read_station_list(station_filepath) + else: + raise Ascii2NetcdfTimeseriesReaderException( + f"no stations: StationList.csv or {station_file} not found in {self._directory}" + ) + return + + def _is_year_in_filters(self, year): + start_year = np.datetime64(f"{year}-01-01 00:00:00") + end_year = np.datetime64(f"{year}-12-31 23:59:59") + time_filter = pyaro.timeseries.Filter.TimeBoundsFilter() + for fil in self._get_filters(): + if isinstance(fil, pyaro.timeseries.Filter.TimeBoundsFilter): + time_filter = fil + if time_filter.has_envelope(): + start, end = time_filter.envelope() + if end_year < start: + return False + if end < start_year: + return False + return True + + def _read_file_variables(self): + variables = {} + for year in self._years: + file = os.path.join(self._directory, f"data_{self._resolution}.{year}.nc") + if not os.path.exists(file): + logger.info( + f"no datafile for {year} and {self._resolution} at {file}, skipping..." + ) + continue + with netCDF4.Dataset(file, "r") as nc: + for vname, var in nc.variables.items(): + if vname.startswith("EPDL"): + varname = f"{var.component}_in_{var.matrix}" + units = "1" + if "units" in var.ncattrs(): + units = var.units + if varname in variables: + if units != variables[varname][1]: + logger.warning( + f"units changed from {variables[varname][1]} to {units} for {varname}/{vname} in {file}" + ) + variables[varname] = (vname, units) + return variables + + def _read_station_list(self, file): + stations = {} + "#StationName urban/suburban/rural CountryName ISO2 Latitude (degrees) Longitude (degrees) Altitude (m.a.s.l.) LocationCode" + with open(file, encoding="UTF-8", newline="") as fh: + csvfile = csv.reader(fh, delimiter="\t") + for row in csvfile: + if not len(row): + continue + if row[0].startswith("#"): + continue + if len(row) < 8: + logger.warning(r"missing elements in file {file}: {row}") + continue + if row[6] in stations: + logger.warning(r"duplicated station in file {file}: {row[6]}") + else: + stations[row[7]] = Station( + { + "station": row[7], + "longitude": float(row[5]), + "latitude": float(row[4]), + "altitude": float(row[6]), + "country": row[3], + "url": "", + "long_name": row[0], + # not used: rural/urban + } + ) + return stations + + def _get_data_from_ncfile(self, varname, file, data): + with netCDF4.Dataset(file, "r") as nc: + start_times = netCDF4.num2date(nc["time"][:], nc["time"].units) + end_times = start_times + (start_times[1] - start_times[0]) + stations = nc["station"][:] + (epdl, _) = self._variables[varname] + if not epdl in nc.variables: + return + vdata = np.ma.filled(nc[epdl][:], np.nan) + if nc[epdl].units != data.units: + logger.warning( + f"units-change for {varname} in {file}: {nc[epdl].units} != {data.units}" + ) + + # get all arrays into same size, time fastes moving, i.e. [station][time] + dstruct = {} + dstruct["start_times"] = np.tile(start_times, vdata.shape[0]) + dstruct["end_times"] = np.tile(end_times, vdata.shape[0]) + lats = [] + lons = [] + alts = [] + stats = [] + for i in range(stations.shape[0]): + station = str(netCDF4.chartostring(stations[i])) + if not station in self.stations(): + lats.append(np.nan) + lons.append(np.nan) + alts.append(np.nan) + stats.append(station) + else: + stat = self._stations[station] + lats.append(stat.latitude) + lons.append(stat.longitude) + alts.append(stat.altitude) + stats.append(station) + lat = np.array(lats) + lon = np.array(lons) + alt = np.array(alts) + dstruct["stations"] = np.repeat(stats, vdata.shape[1]) + dstruct["lats"] = np.repeat(lat, vdata.shape[1]) + dstruct["lons"] = np.repeat(lon, vdata.shape[1]) + dstruct["alts"] = np.repeat(alt, vdata.shape[1]) + dstruct["data"] = vdata.flatten() + + # filter out undefined data or stations + idx = np.isfinite(dstruct["data"]) & np.isfinite(dstruct["lats"]) + for key in dstruct.keys(): + dstruct[key] = dstruct[key][idx] + + dstruct["flags"] = dstruct["data"].astype("i4") + dstruct["flags"][:] = Flag.VALID + + data.append( + dstruct["data"], + dstruct["stations"], + dstruct["lats"], + dstruct["lons"], + dstruct["alts"], + dstruct["start_times"], + dstruct["end_times"], + dstruct["flags"], + dstruct["data"] * np.nan, + ) + return + + def _unfiltered_data(self, varname) -> Data: + (_, units) = self._variables[varname] + data = NpStructuredData(varname, units) + + for year in self._years: + file = os.path.join(self._directory, f"data_{self._resolution}.{year}.nc") + if not os.path.exists(file): + logger.info( + f"no datafile for {year} and {self._resolution} at {file}, skipping..." + ) + continue + self._get_data_from_ncfile(varname, file, data) + + return data + + def _unfiltered_stations(self) -> dict[str, Station]: + return self._stations + + def _unfiltered_variables(self) -> list[str]: + return list(self._variables.keys()) + + def close(self): + pass + + +class Ascii2NetcdfTimeseriesEngine(AutoFilterReaderEngine.AutoFilterEngine): + """Ascii-files converted by MSC-W to netcdf-format, e.g. using niluAscii2netcdf or eea_airquip2emepdata.py""" + + def reader_class(self): + return Ascii2NetcdfTimeseriesReader + + def open(self, filename, *args, **kwargs) -> Ascii2NetcdfTimeseriesReader: + return self.reader_class()(filename, *args, **kwargs) + + def description(self) -> str: + return inspect.doc(self) + + def url(self): + return "https://github.com/metno/pyaro-readers" diff --git a/src/pyaro_readers/ascii2netcdf/__init__.py b/src/pyaro_readers/ascii2netcdf/__init__.py new file mode 100644 index 0000000..f033ade --- /dev/null +++ b/src/pyaro_readers/ascii2netcdf/__init__.py @@ -0,0 +1,4 @@ +from .Ascii2NetcdfTimeseries import ( + Ascii2NetcdfTimeseriesReader, + Ascii2NetcdfTimeseriesEngine, +) diff --git a/tests/test_Ascii2NetcdfTimeseries.py b/tests/test_Ascii2NetcdfTimeseries.py new file mode 100644 index 0000000..870743b --- /dev/null +++ b/tests/test_Ascii2NetcdfTimeseries.py @@ -0,0 +1,50 @@ +import os +import unittest +import numpy as np + +import pyaro +import pyaro.timeseries + +EBAS_URL = file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), "testdata", "NILU" +) + + +class TestAscii2NetcdfTimeSeriesReader(unittest.TestCase): + engine = "ascii2netcdf" + + def test_0engine(self): + self.assertIn(self.engine, pyaro.list_timeseries_engines()) + + def test_1open(self): + with pyaro.open_timeseries( + self.engine, EBAS_URL, resolution="daily", filters=[] + ) as ts: + self.assertGreater(len(ts.variables()), 70) + self.assertGreater(len(ts.stations()), 300) + + def test_2read(self): + with pyaro.open_timeseries( + self.engine, EBAS_URL, resolution="daily", filters=[] + ) as ts: + data = ts.data("sulphur_dioxide_in_air") + self.assertIn("AM0001", data.stations) + self.assertGreater(np.sum(data.values), 10000) + self.assertEqual(data.units, "ug") + + def test_3read(self): + with pyaro.open_timeseries( + self.engine, + EBAS_URL, + resolution="daily", + filters={ + "stations": {"include": ["NO0002"]}, + }, # Birkenes2 + ) as ts: + data = ts.data("sulphur_dioxide_in_air") + self.assertIn("NO0002", data.stations) + self.assertGreater(len(data), 360) + self.assertEqual(data.units, "ug") + self.assertEqual( + len(data.values[data.values > 4]), 1 + ) # one day (21.05. with extreme SO2) diff --git a/tests/testdata/NILU/StationList.csv b/tests/testdata/NILU/StationList.csv new file mode 100644 index 0000000..dd77f47 --- /dev/null +++ b/tests/testdata/NILU/StationList.csv @@ -0,0 +1,370 @@ +#StationName urban/suburban/rural CountryName ISO2 Latitude (degrees) Longitude (degrees) Altitude (m.a.s.l.) LocationCode +Amberd rural AM 40.3833333333333 44.25 2080 AM0001 +Illmitz rural AT 47.7666666666667 16.7666666666667 117 AT0002 +Achenkirch rural AT 47.55 11.7166666666667 960 AT0003 +St. Koloman rural AT 47.65 13.2 851 AT0004 +Vorhegg rural AT 46.6666666666667 12.9666666666667 1020 AT0005 +Pillersdorf rural AT 48.7166666666667 15.9333333333333 315 AT0030 +St. Leonhard rural AT 47.9833333333333 14.85 790 AT0031 +Sulzberg rural AT 47.5166666666667 9.86666666666667 1020 AT0032 +Stolzalpe rural AT 47.1333333333333 14.2 1302 AT0033 +Sonnblick rural AT 47.05 12.9666666666667 3106 AT0034 +Zillertalen Alpen rural AT 47.1333333333333 11.8666666666667 1970 AT0037 +Gerlitzen rural AT 46.7 13.9166666666667 1895 AT0038 +Masenberg rural AT 47.35 15.8833333333333 1170 AT0040 +Haunsberg rural AT 47.9666666666667 13.0166666666667 730 AT0041 +Heidenreichstein rural AT 48.8833333333333 15.05 570 AT0042 +Forsthof rural AT 48.1 15.9166666666667 581 AT0043 +Graz Platte rural AT 47.1166666666667 15.4666666666667 651 AT0044 +Dunkelsteinerwald rural AT 48.3666666666667 15.55 320 AT0045 +Gaenserndorf rural AT 48.3333333333333 16.7333333333333 161 AT0046 +Stixneusiedl rural AT 48.05 16.6833333333333 240 AT0047 +Zoebelboden rural AT 47.8333333333333 14.4333333333333 899 AT0048 +Grebenzen rural AT 47.0333333333333 14.3333333333333 1648 AT0049 +Graz Lustbuehel rural AT 47.0666666666667 15.4833333333333 481 AT0050 +Ivan Sedlo rural BA 43.7666666666667 18.0333333333333 970 BA0006 +Offagne rural BE 49.8833333333333 5.2 420 BE0001 +Brugge rural BE 51.25 3.2 10 BE0003 +Knokke rural BE 51.35 3.33333333333333 0 BE0004 +University of Gent rural BE 51.05 3.71666666666667 0 BE0005 +Moerkerke rural BE 51.25 3.36666666666667 3 BE0011 +Houtem rural BE 51.0166666666667 2.58333333333333 2 BE0013 +Koksijde rural BE 51.1166666666667 2.65 4 BE0014 +Berendrecht rural BE 51.35 4.33333333333333 5 BE0031 +Eupen rural BE 50.6333333333333 6 295 BE0032 +Moerkerke rural BE 51.25 3.36666666666667 3 BE0033 +St. Denijs rural BE 50.75 3.36666666666667 42 BE0034 +Vezin rural BE 50.5 4.98333333333333 160 BE0035 +Bredenee rural BE 51.2333333333333 2.98333333333333 163 BE0090 +BEO Moussala rural BG 42.1666666666667 23.5833333333333 2971 BG0001 +Rojen peak rural BG 41.6833333333333 24.7333333333333 1750 BG0053 +Vysokoe rural BY 52.3333333333333 23.4333333333333 163 BY0004 +Jungfraujoch rural CH 46.55 7.98333333333333 3573 CH0001 +Payerne rural CH 46.8166666666667 6.95 489 CH0002 +Taenikon rural CH 47.4833333333333 8.9 540 CH0003 +Chaumont rural CH 47.05 6.96666666666667 1130 CH0004 +Rigi rural CH 47.0666666666667 8.45 1028 CH0005 +Zürich-Kaserne rural CH 47.3666666666667 8.51666666666667 409 CH0010 +Sion rural CH 46.2166666666667 7.33333333333333 480 CH0031 +Magadino-Cadenazzo rural CH 46.1666666666667 8.93333333333333 203 CH0033 +Beromünster rural CH 47.1833333333333 8.18333333333333 797 CH0053 +Kamenicki vis rural CS 43.4 21.95 813 CS0005 +Zabljak rural CS 43.15 19.1333333333333 1450 CS0008 +Ayia Marina rural CY 35.0333333333333 33.05 532 CY0002 +Svratouch rural CZ 49.7333333333333 16.0333333333333 737 CZ0001 +Kosetice rural CZ 49.5833333333333 15.0833333333333 534 CZ0003 +Churanov rural CZ 49.0666666666667 13.6 1118 CZ0005 +Kresin u Pacova rural CZ 49.5833333333333 15.0833333333333 534 CZ0007 +Libus rural CZ 50.15 15.0666666666667 0 CZ0099 +Westerland/Wenningsted rural DE 54.9333333333333 8.31666666666667 12 DE0001 +Langenbrügge/Waldhof rural DE 52.8 10.75 74 DE0002 +Schauinsland rural DE 47.9166666666667 7.9 1205 DE0003 +Deuselbach rural DE 49.7666666666667 7.05 480 DE0004 +Brotjacklriegel rural DE 48.8166666666667 13.2166666666667 1016 DE0005 +Arkona rural DE 54.6833333333333 13.4333333333333 42 DE0006 +Neuglobsow rural DE 53.15 13.0333333333333 62 DE0007 +Schmücke rural DE 50.65 10.7666666666667 937 DE0008 +Zingst rural DE 54.4333333333333 12.7333333333333 1 DE0009 +Hohenwestedt rural DE 54.1 9.66666666666667 75 DE0011 +Bassum rural DE 52.85 8.71666666666667 52 DE0012 +Rodenberg rural DE 52.3166666666667 9.36666666666667 148 DE0013 +Meinerzhagen rural DE 51.1166666666667 7.63333333333333 510 DE0014 +Usingen rural DE 50.3333333333333 8.53333333333333 485 DE0015 +Bad Kreuznach rural DE 49.8333333333333 7.86666666666667 230 DE0016 +Ansbach rural DE 49.3 10.5666666666667 481 DE0017 +Rottenburg rural DE 48.4833333333333 8.93333333333333 427 DE0018 +Starnberg rural DE 48.0166666666667 11.35 729 DE0019 +Hof rural DE 50.3166666666667 11.8833333333333 568 DE0020 +Ueckermünde rural DE 53.75 14.0666666666667 1 DE0026 +Wiesenburg rural DE 52.1166666666667 12.4666666666667 107 DE0031 +Herleshausen rural DE 51.0333333333333 10.15 380 DE0033 +Lückendorf rural DE 50.8333333333333 14.7666666666667 490 DE0035 +Schleiz rural DE 50.5666666666667 11.8166666666667 500 DE0037 +Murnauer Moos rural DE 47.65 11.2 622 DE0038 +Aukrug rural DE 54.0666666666667 9.8 15 DE0039 +Westerland/Tinnum rural DE 54.9 8.33333333333333 3 DE0041 +Öhringen rural DE 49.2333333333333 9.43333333333333 283 DE0042 +Hohenpeissenberg rural DE 47.8 11.0166666666667 985 DE0043 +Melpitz rural DE 51.5333333333333 12.9 87 DE0044 +Schorfheide rural DE 52.9666666666667 13.65 70 DE0045 +Raisting rural DE 47.9 11.1 552 DE0046 +Falkenberg rural DE 52.1666666666667 14.1166666666667 73 DE0047 +Zugspitze-Schneeferner rural DE 47.4166666666667 10.9833333333333 2671 DE0054 +Faeroerne rural DK 62.3 -7.06666666666667 210 DK0001 +Tange rural DK 56.35 9.6 13 DK0003 +Keldsnor rural DK 54.7333333333333 10.7333333333333 9 DK0005 +Faeroerne-Akraber rural DK 61.4 -6.66666666666667 90 DK0007 +Anholt rural DK 56.7166666666667 11.5166666666667 40 DK0008 +Storebaelt rural DK 58.3166666666667 10.9166666666667 250 DK0009 +Nord, Greenland rural DK 81.6 -16.6666666666667 20 DK0010 +Risoe rural DK 55.6833333333333 12.1 3 DK0012 +Pedersker rural DK 55.0166666666667 14.9333333333333 5 DK0020 +Sepstrup Sande rural DK 56.0833333333333 9.41666666666667 60 DK0022 +Summit rural DK 72.5833333333333 -38.4833333333333 3238 DK0025 +Ulborg rural DK 56.2833333333333 8.43333333333333 10 DK0031 +Frederiksborg rural DK 55.9666666666667 11.3333333333333 10 DK0032 +Lille Valby rural DK 55.6833333333333 12.1333333333333 10 DK0041 +Syrve rural EE 57.95 22.1 2 EE0002 +Lahemaa rural EE 59.5 25.9 32 EE0009 +Vilsandy rural EE 58.3833333333333 21.8166666666667 6 EE0011 +Toledo rural ES 39.55 -4.35 917 ES0001 +La Cartuja rural ES 37.2 -3.6 720 ES0002 +Roquetas rural ES 40.8166666666667 -0.5 50 ES0003 +Logrono rural ES 42.45 -2.35 370 ES0004 +Noia rural ES 42.7333333333333 -8.91666666666667 685 ES0005 +Mahon rural ES 39.8833333333333 4.31666666666667 78 ES0006 +Viznar rural ES 37.2333333333333 -3.53333333333333 1230 ES0007 +Niembro rural ES 43.45 -4.85 134 ES0008 +Campisabalos rural ES 41.2833333333333 -3.15 1360 ES0009 +Cabo de Creus rural ES 42.3166666666667 3.31666666666667 76 ES0010 +Barcarrota rural ES 38.4833333333333 -6.91666666666667 393 ES0011 +Zarra rural ES 39.0833333333333 -1.1 885 ES0012 +Penausende rural ES 41.2333333333333 -5.9 985 ES0013 +Els Torms rural ES 41.4 0.716666666666667 470 ES0014 +Risco Llano rural ES 39.5166666666667 -4.35 1241 ES0015 +O Savinao rural ES 42.6333333333333 -7.7 506 ES0016 +Doñana rural ES 37.05 -6.55 35 ES0017 +Barcelona rural ES 41.3833333333333 2.11666666666667 80 ES0019 +Montsec rural ES 42.05 0.733333333333333 1571 ES0022 +Montseny rural ES 41.7666666666667 2.35 700 ES1778 +Ähtäri rural FI 62.55 24.2166666666667 162 FI0004 +Kökar rural FI 59.9166666666667 20.9166666666667 10 FI0006 +Virolahti rural FI 60.5166666666667 27.6833333333333 8 FI0007 +Kevo rural FI 69.75 27 80 FI0008 +Utö rural FI 59.7833333333333 21.3833333333333 7 FI0009 +Virolahti II rural FI 60.5166666666667 27.6833333333333 4 FI0017 +Virolahti III rural FI 60.5333333333333 27.6666666666667 4 FI0018 +Oulanka rural FI 66.3166666666667 29.4 310 FI0022 +Matorova rural FI 68 24.25 340 FI0036 +Ähtäri II rural FI 62.5833333333333 24.1833333333333 180 FI0037 +Hyytiälä rural FI 61.85 24.2833333333333 181 FI0050 +Hailuoto rural FI 65 24.6833333333333 4 FI0053 +Puijo Smear IV rural FI 64.9166666666667 27.65 0 FI0063 +Haaspari rural FI 60.2833333333333 27.2 15 FI0090 +Hailuota rural FI 65 24.6833333333333 4 FI0091 +Hietajärvi rural FI 63.1666666666667 30.7166666666667 173 FI0092 +Kotinen rural FI 61.2333333333333 25.0666666666667 158 FI0093 +Pesojärvi rural FI 66.3 29.5 257 FI0094 +Vuoskojärvi rural FI 69.7333333333333 26.95 147 FI0095 +Pallas rural FI 67.9666666666667 24.1166666666667 566 FI0096 +Vert-le-Petit rural FR 48.5333333333333 2.36666666666667 64 FR0001 +La Crouzille rural FR 45.8333333333333 1.26666666666667 497 FR0003 +La Hague rural FR 49.6166666666667 -1.83333333333333 133 FR0005 +Valduc rural FR 47.5833333333333 4.86666666666667 470 FR0006 +Lodeve rural FR 43.7 3.33333333333333 252 FR0007 +Donon rural FR 48.5 7.13333333333333 775 FR0008 +Revin rural FR 49.9 4.63333333333333 390 FR0009 +Morvan rural FR 47.2666666666667 4.08333333333333 620 FR0010 +Bonnevaux rural FR 46.8166666666667 6.18333333333333 836 FR0011 +Iraty rural FR 43.0333333333333 -1.08333333333333 1300 FR0012 +Peyrusse Vieille rural FR 43.6166666666667 0.183333333333333 200 FR0013 +Montandon rural FR 47.3 6.83333333333333 836 FR0014 +La Tardiere rural FR 46.65 -0.75 133 FR0015 +Le Casset rural FR 45 6.46666666666667 1750 FR0016 +Montfranc rural FR 45.8 2.06666666666667 810 FR0017 +La Coulonche rural FR 48.6333333333333 -0.45 309 FR0018 +Pic du Midi rural FR 42.9333333333333 0.15 2877 FR0019 +SIRTA Atm.Res.Obs rural FR 48.7166666666667 2.16666666666667 162 FR0020 +Obs. Per. de l'Env rural FR 48.5666666666667 5.5 392 FR0022 +Saint-Nazaire-le-Déser rural FR 44.5666666666667 5.28333333333333 605 FR0023 +Guipry rural FR 47.8333333333333 -1.83333333333333 29 FR0024 +Verneuil rural FR 46.8166666666667 2.61666666666667 182 FR0025 +Kergoff rural FR 48.2666666666667 -2.95 307 FR0028 +Puy de Dôme rural FR 45.7666666666667 2.95 1465 FR0030 +Aubur rural FR 48.2166666666667 7.18333333333333 1135 FR0031 +Brennilis rural FR 48.35 -3.86666666666667 220 FR0032 +Porspoder rural FR 48.5166666666667 4.75 50 FR0090 +Eskdalemuir rural GB 55.3166666666667 -3.2 243 GB0002 +Goonhilly rural GB 50.05 -5.18333333333333 108 GB0003 +Stoke Ferry rural GB 52.5666666666667 0.5 15 GB0004 +Ludlow rural GB 52.3666666666667 -2.63333333333333 190 GB0005 +Lough Navar rural GB 54.4333333333333 -7.9 126 GB0006 +Barcombe Mills rural GB 50.8666666666667 -0.0333333333333333 8 GB0007 +Yarner Wood rural GB 50.6 -3.71666666666667 119 GB0013 +High Muffles rural GB 54.3333333333333 -0.8 267 GB0014 +Strath Vaich Dam rural GB 57.7333333333333 -4.76666666666667 270 GB0015 +Glen Dye rural GB 56.9666666666667 -2.58333333333333 85 GB0016 +Aston Hill rural GB 52.5 -3.05 370 GB0031 +Bottesford rural GB 52.9333333333333 -0.816666666666667 32 GB0032 +Bush rural GB 55.8666666666667 -3.2 180 GB0033 +Glazebury rural GB 53.4666666666667 -2.46666666666667 21 GB0034 +Great Dun Fell rural GB 54.6833333333333 -2.45 847 GB0035 +Harwell rural GB 51.5666666666667 -1.31666666666667 137 GB0036 +Ladybower rural GB 53.4 -1.75 420 GB0037 +Lullington Heath rural GB 50.8 0.183333333333333 120 GB0038 +Sibton rural GB 52.2833333333333 1.45 46 GB0039 +Stevenage rural GB 51.8833333333333 -0.183333333333333 90 GB0040 +Wharley Croft rural GB 54.6166666666667 -2.46666666666667 26 GB0041 +Narberth rural GB 51.7833333333333 -4.7 160 GB0043 +Somerton rural GB 51.7666666666667 -3.05 55 GB0044 +Wicken Fen rural GB 52.3 0.3 5 GB0045 +CEH Edingburgh rural GB 55.8666666666667 -3.2 0 GB0046 +Auchencorth Moss rural GB 55.7833333333333 -3.23333333333333 260 GB0048 +Weybourne rural GB 52.95 1.11666666666667 16 GB0049 +St. Osyth rural GB 51.7666666666667 1.06666666666667 8 GB0050 +Market Harborough rural GB 52.55 -0.766666666666667 145 GB0051 +Lerwick rural GB 60.1333333333333 -1.18333333333333 85 GB0052 +Charlton Mackrell rural GB 51.05 -2.68333333333333 54 GB0053 +Glen Saugh rural GB 56.9 -2.55 85 GB0054 +East Ruston rural GB 51.8 1.46666666666667 5 GB0090 +Banchory rural GB 57.0833333333333 2.53333333333333 120 GB0091 +Isle of Wight rural GB 50.7 -1.3 35 GB0092 +Driby rural GB 53.2333333333333 0.0666666666666667 47 GB0095 +Chilbolton Observatory rural GB 51.15 -1.43333333333333 78 GB1055 +Abastumani rural GE 41.75 42.8166666666667 1650 GE0001 +Aliartos rural GR 38.3666666666667 23.0833333333333 110 GR0001 +Finokalia rural GR 35.3333333333333 25.6666666666667 150 GR0002 +Livadi rural GR 40.5333333333333 23.25 850 GR0003 +Puntijarka rural HR 45.9 15.9666666666667 988 HR0002 +Zavizan rural HR 44.8166666666667 14.9833333333333 1594 HR0004 +Kecskemet rural HU 46.9666666666667 19.5833333333333 125 HU0001 +K-puszta rural HU 46.9666666666667 19.5833333333333 125 HU0002 +Farkasfa rural HU 46.9166666666667 16.3166666666667 312 HU0003 +Nyirjes rural HU 47.9 19.95 670 HU0017 +Valentia Obs. rural IE 51.9333333333333 -10.25 9 IE0001 +Turlough Hill rural IE 53.0333333333333 -6.4 420 IE0002 +The Burren rural IE 53 -9.1 90 IE0003 +Ridge of Capard rural IE 53.1166666666667 -7.45 340 IE0004 +Oak Park rural IE 52.8666666666667 -6.91666666666667 59 IE0005 +Malin Head rural IE 55.3833333333333 -7.35 20 IE0006 +Glen Veagh rural IE 55.05 -7.93333333333333 44 IE0007 +Carnsore Point rural IE 52.1833333333333 -6.36666666666667 9 IE0008 +Johnstown Castle rural IE 52.3 -6.51666666666667 62 IE0009 +Mace Head rural IE 53.3333333333333 -9.9 25 IE0031 +Rjupnahed rural IS 64.0833333333333 -21.85 120 IS0001 +Irafoss rural IS 64.0833333333333 -21.0166666666667 61 IS0002 +Reykjavik rural IS 64.1333333333333 -21.9 61 IS0090 +Stórhöfdi rural IS 63.45 -20.25 118 IS0091 +Montelibretti rural IT 42.1 12.6333333333333 48 IT0001 +Stelvio rural IT 46.35 10.3833333333333 1415 IT0002 +Vallombrosa rural IT 43.7333333333333 11.55 1000 IT0003 +Ispra rural IT 45.8 8.63333333333333 209 IT0004 +Arabba rural IT 46.5166666666667 11.8833333333333 2030 IT0005 +ISAC Belogna rural IT 44.4833333333333 11.3333333333333 0 IT0008 +Mt Cimone rural IT 44.1833333333333 10.7 2165 IT0009 +San Pietro Capofiume rural IT 44.65 11.6166666666667 11 IT0010 +Capo Granitola rural IT 37.5666666666667 12.6666666666667 5 IT0014 +Lampedusa rural IT 35.5166666666667 12.6333333333333 45 IT0018 +Monte Martano rural IT 42.8 12.5666666666667 1090 IT0019 +Borovoe rural KZ 53.0166666666667 70.6166666666667 0 KZ0001 +Nida rural LT 55.35 21.0666666666667 17 LT0003 +Preila rural LT 55.35 21.0666666666667 5 LT0015 +Rucava rural LV 56.2166666666667 21.2166666666667 18 LV0010 +Zoseni rural LV 57.1333333333333 25.9166666666667 183 LV0016 +Kemeri rural LV 56.9166666666667 23.4666666666667 15 LV0025 +Leovo rural MD 46.5 28.2666666666667 156 MD0012 +Leova II rural MD 46.4833333333333 28.2833333333333 166 MD0013 +Zabljak rural ME 43.15 19.1333333333333 1450 ME0008 +Lazaropole rural MK 41.5333333333333 20.7 1332 MK0007 +Giordan lighthouse rural MT 36.1 14.2 160 MT0001 +Witteveen rural NL 52.8166666666667 6.66666666666667 18 NL0002 +Rekken rural NL 52.1 6.71666666666667 25 NL0005 +Appelscha rural NL 52.95 6.3 10 NL0006 +Eibergen rural NL 52.0833333333333 6.56666666666667 20 NL0007 +Bilthoven rural NL 52.1166666666667 5.2 5 NL0008 +Kollumerwaard rural NL 53.3333333333333 6.28333333333333 0 NL0009 +Vreedepeel rural NL 51.5333333333333 5.85 28 NL0010 +Cabauw_Zijdeweg rural NL 51.9666666666667 4.93333333333333 60 NL0011 +De Zilk rural NL 52.3 4.5 4 NL0091 +Cabauw_Wielsekade rural NL 51.9666666666667 4.91666666666667 1 NL0644 +Birkenes rural NO 58.3833333333333 8.25 190 NO0001 +Birkenes II rural NO 58.3833333333333 8.25 219 NO0002 +Skreådalen rural NO 58.8166666666667 6.71666666666667 475 NO0008 +Tustervatn rural NO 65.8333333333333 13.9166666666667 439 NO0015 +Jergul rural NO 69.4 24.6 255 NO0030 +Narbuvoll rural NO 62.35 11.4666666666667 768 NO0035 +Hummelfjell rural NO 62.45 11.2666666666667 1539 NO0036 +Bjørnøya rural NO 74.5166666666667 19.0166666666667 20 NO0037 +Kårvatn rural NO 62.7833333333333 8.88333333333333 210 NO0039 +Osen rural NO 61.25 11.7833333333333 440 NO0041 +Spitzbergen, Zeppelin rural NO 78.9 11.8833333333333 474 NO0042 +Prestebakke rural NO 59 11.5333333333333 160 NO0043 +Nordmoen rural NO 60.2666666666667 11.1 200 NO0044 +Jeløya rural NO 59.4333333333333 10.6 3 NO0045 +Svanvik rural NO 69.45 30.0333333333333 30 NO0047 +Voss rural NO 60.6 6.53333333333333 500 NO0048 +Valle rural NO 59.05 7.56666666666667 250 NO0049 +Søgne rural NO 58.0833333333333 7.85 15 NO0051 +Sandve rural NO 59.2 5.2 15 NO0052 +Karasjok rural NO 69.4666666666667 25.2166666666667 333 NO0055 +Hurdal rural NO 60.3666666666667 11.0666666666667 300 NO0056 +Spitzbergen,Ny-Alesund rural NO 78.9166666666667 11.9166666666667 8 NO0057 +Troll rural NO -72.0166666666667 2.53333333333333 1309 NO0058 +Nordpolhotellet rural NO 78.9333333333333 11.9166666666667 8 NO0065 +Haukenes rural NO 59.2 9.51666666666667 20 NO0089 +Andøya rural NO 69.2833333333333 16 380 NO0090 +Øverbygd rural NO 69.05 19.3666666666667 90 NO0092 +Valdalen rural NO 62.0833333333333 12.1666666666667 800 NO0093 +Møsvatn rural NO 59.8333333333333 8.33333333333333 940 NO0094 +Ualand rural NO 58.5166666666667 6.38333333333333 220 NO0095 +Solhomfjell rural NO 58.9333333333333 8.8 260 NO0097 +Karpdalen rural NO 69.65 30.4333333333333 70 NO0098 +Lista rural NO 58.1 6.56666666666667 13 NO0099 +Suwalki rural PL 54.1333333333333 22.95 184 PL0001 +Jarczew rural PL 51.8166666666667 21.9666666666667 180 PL0002 +Sniezka rural PL 50.7333333333333 15.7333333333333 1604 PL0003 +Leba rural PL 54.75 17.5333333333333 2 PL0004 +Diabla Gora rural PL 54.15 22.0666666666667 157 PL0005 +Zielonka rural PL 53.6666666666667 17.9333333333333 121 PL0009 +Braganca rural PT 41.8166666666667 -6.76666666666667 691 PT0001 +Faro rural PT 37.0166666666667 -7.96666666666667 8 PT0002 +V. d. Castelo rural PT 41.7 -8.8 16 PT0003 +Monte Velho rural PT 38.0833333333333 -8.8 43 PT0004 +Foia rural PT 37.3166666666667 -8.9 902 PT0005 +Angra do Heroismo rural PT 38.6666666666667 -27.2166666666667 74 PT0010 +Rarau rural RO 47.45 25.45 1536 RO0001 +Stina de Vale rural RO 46.6833333333333 23.5333333333333 1111 RO0002 +Semenic rural RO 45.1166666666667 25.9666666666667 1432 RO0003 +Paring rural RO 45.3833333333333 23.4666666666667 1585 RO0004 +Fundata rural RO 45.4666666666667 25.3 1371 RO0005 +Turia rural RO 46.1166666666667 25.9833333333333 1008 RO0006 +Bucharest rural RO 44.35 26.0333333333333 93 RO0007 +EM-3 rural RO 47.3166666666667 25.1333333333333 908 RO0008 +Kamenicki vis rural RS 43.4 21.95 813 RS0005 +Janiskoski rural RU 68.9333333333333 28.85 118 RU0001 +Lesogorsky rural RU 61 28.9666666666667 39 RU0008 +Pinega rural RU 64.7 43.4 28 RU0013 +Pushkinskie Gory rural RU 57 28.9 103 RU0014 +Shepeljovo rural RU 59.9666666666667 29.1166666666667 4 RU0016 +Dunai rural RU 73.9833333333333 124.5 474 RU0017 +Danki rural RU 54.9 37.8 150 RU0018 +Lesnoy rural RU 56.5333333333333 32.9333333333333 340 RU0020 +Tiksi rural RU 71.5833333333333 128.916666666667 8 RU0100 +Ekeröd rural SE 55.9 13.7166666666667 140 SE0001 +Rörvik rural SE 57.4166666666667 11.9333333333333 10 SE0002 +Velen rural SE 58.7833333333333 14.3 127 SE0003 +Bredkälen rural SE 63.85 15.3333333333333 404 SE0005 +Hoburg rural SE 56.9166666666667 18.15 58 SE0008 +Vavihill rural SE 56.0166666666667 13.15 172 SE0011 +Aspvreten rural SE 58.8 17.3833333333333 20 SE0012 +Esrange rural SE 67.8833333333333 21.0666666666667 475 SE0013 +Råö rural SE 57.3833333333333 11.9 5 SE0014 +Asa rural SE 57.1666666666667 14.7833333333333 180 SE0018 +Östad rural SE 57.95 12.4 65 SE0019 +Hallahus rural SE 56.05 13.15 190 SE0020 +Hyltemossa rural SE 56.0833333333333 13.4166666666667 115 SE0021 +Norunda Stenen rural SE 60.0833333333333 17.5 45 SE0022 +Ammarnäs rural SE 65.9666666666667 16.2 480 SE0031 +Norra-Kvill rural SE 57.8166666666667 15.5666666666667 261 SE0032 +Sannen rural SE 56.3333333333333 15.3333333333333 90 SE0033 +Storulvsjöen rural SE 62.2666666666667 16.3 420 SE0034 +Vindeln rural SE 64.25 19.7666666666667 225 SE0035 +Grimsö rural SE 59.7166666666667 15.4666666666667 132 SE0039 +Arup rural SE 55.75 13.6666666666667 157 SE0051 +Gårdsjön rural SE 58.05 12.0166666666667 113 SE0097 +Svartedalen rural SE 57.9833333333333 12.0666666666667 100 SE0098 +Arup rural SE 55.75 13.6666666666667 0 SE0099 +Masun rural SI 45.65 14.3666666666667 1026 SI0001 +Iskrba rural SI 45.5666666666667 14.8666666666667 520 SI0008 +Zarodnje rural SI 46.4333333333333 15 770 SI0031 +Krvavec rural SI 46.3 14.5333333333333 32 SI0032 +Kovk rural SI 46.1166666666667 15.1 6 SI0033 +Chopok rural SK 48.9333333333333 19.5833333333333 2008 SK0002 +Stara Lesna rural SK 49.15 20.2833333333333 808 SK0004 +Liesek rural SK 49.3666666666667 19.6833333333333 892 SK0005 +Starina rural SK 49.05 22.2666666666667 345 SK0006 +Topolniky rural SK 47.9666666666667 17.8666666666667 113 SK0007 +Cubuk II rural TR 40.5 33 1169 TR0001 +Svityaz rural UA 51.5166666666667 23.8833333333333 164 UA0005 +Rava-Russkaya rural UA 50.25 23.6333333333333 249 UA0006 +Beregovo rural UA 48.25 22.6833333333333 112 UA0007 diff --git a/tests/testdata/NILU/data_daily.2020.nc b/tests/testdata/NILU/data_daily.2020.nc new file mode 100644 index 0000000..f4f02f7 --- /dev/null +++ b/tests/testdata/NILU/data_daily.2020.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1a1382b54a44bc188f59ad6bf42020777c16ae1e3526818d82b363626d79857 +size 17135676 diff --git a/tests/testdata/NILU/data_daily.2021.nc b/tests/testdata/NILU/data_daily.2021.nc new file mode 100644 index 0000000..5203b5e --- /dev/null +++ b/tests/testdata/NILU/data_daily.2021.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d0411773ca01ae63eae59b2f72b2a3da495acfcf1955d72c5b565665528a782 +size 18636520