GNSS.be
  • About us
  • Activities
  • Open Data Portal
  • More Information
    ROB logo
  • Home
  • OPEN DATA PORTAL
  • Open Data Portal documentation

Open Data Portal documentation

No image

GNSS data & metadata format

  • GNSS data format
  • GNSS metadata format
No image

GNSS data citation & usage conditions

  • GNSS data citation
  • GNSS data usage conditions
No image

Retrieve GNSS data & metadata files

  • Output file formats
  • (Meta)data from the GUI
  • (Meta)data through the API
No image

Process GNSS data & metadata files

  • Plain text output
  • Simple JSON output
  • JSON-LD output

GNSS data & metadata format

GNSS data format

GNSS observation data files in the ROB data repositories are stored by GNSS station/day in the Hatanaka-compressed Receiver INdependent EXchange (RINEX).

The RINEX format is the standard format to exchange GNSS observation data files generated by different types of GNSS receivers independently of the receiver manufacturer.
To reduce the file size of the RINEX data files to a minimum, the RINEX data files are downloadable in the Hatanaka-compressed format, which is a two-step compression format with one of the steps being the common compression gzip or compress (for older files).
Once downloaded, Hatanaka-compressed RINEX files can be decompressed using the RNXCMP software, which performs both decompression steps and outputs the GNSS data file in the RINEX format.

Example of the Hatanaka-compressed RINEX file naming convention for the daily GNSS data of the station GENO00ITA for Day Of Year (DOY) 020 of the year 2020:
  • GENO0200.20D.Z (for RINEX 2 data)
  • GENO00ITA_R_20200200000_01D_30S_MO.crx.gz (for RINEX 3 data)

GNSS metadata format

When selecting the JSON-LD serialization format (see the Output file formats section), the GNSS observation data retrievable from this Open Data Portal are supplemented with rich and structured extra information (metadata) as recommended by the FAIR data principles. This rich metadata can include information on: data documentation, data license, data provenance (information on the origin of the data, how they were collected and eventually manipulated), data quality, etc.
At present, the portal is providing limited provenance metadata nor data quality metadata, but this will be included in a future version.

To enable interoperability, the content of these metadata is expressed using controlled vocabularies e.g., the list of standard names for GNSS receivers and antennas adopted by International GNSS Service (IGS).
To structure and standardize the metadata, the portal uses the GNSS-DCAT-AP schema, which includes all the mandatory DCAT-AP elements as well as metadata attributes specific to GNSS stations and RINEX data files.
The GNSS-DCAT-AP schema takes into account best practices in other GNSS data repositories, compliance with FAIR principles, and the perspective of the users accessing and using the data, as well as those managing and preserving the data in the repositories.

The GNSS-DCAT-AP schema describes in a standardized and structured way the daily RINEX files, the GNSS stations' datasets and the GNSS repositories. The table below lists just a few GNSS-DCAT-AP elements by way of example:

Daily RINEX file metadata
Description GNSS-DCAT-AP
Daily RINEX file Distribution
RINEX file name title
Link to the corresponding station dataset
Station dataset metadata
Description GNSS-DCAT-AP
GNSS station dataset Dataset
Station dataset's name title
Links to the station's RINEX data files distribution
Repository metadata
Description GNSS-DCAT-AP
GNSS repository Catalog
GNSS repository's name title
Links to the stations included in the repository dataset

The GNSS-DCAT-AP schema includes both RINEX-dependent as well as station-dependent metadata.

RINEX-dependent metadata

The RINEX-dependent metadata provided by this portal (in the GNSS-DCAT-AP schema) includes, for example, the date of the last change for each of the RINEX files included in the search, the URLs to download the RINEX files, information on the compression format, data license information, etc. The RINEX-dependent metadata is downloadable in the JSON-LD format.

Let's consider the metadata of the daily RINEX data of the station BRUX00BEL for Day Of Year (DOY) 363 of the year 2009:


{
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_R2",
  "@type": "Distribution",
  "accessURL": {
    "@type": "xsd:anyURI",
    "@value": "https://epncb.oma.be/pub/RINEX/2009/363/BRUX3630.09D.Z"
  },
  "adms:status": {
    "@id": "https://publications.europa.eu/resource/authority/distribution-status/COMPLETED"
  },
  "compressFormat": "application/x-gzip",
  "dataset": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL"
  },
  "dct:checksum": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#checksum"
  },
  "dct:conformsTo": {
    "@id": "https://gnss.be/PID/standard#hatanaka"
  },
  "dct:description": "Daily RINEX data of the GNSS station BRUX00BEL for DOY 363 of 2009",
  "dct:issued": {
    "@type": "xsd:dateTime",
    "@value": "2009-12-29T00:00:00"
  },
  "dct:license": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#license"
  },
  "dct:modified": {
    "@type": "xsd:dateTime",
    "@value": "2020-02-05T16:42:12"
  },
  "dct:title": "BRUX3630.09D.Z",
  "downloadURL": {
    "@type": "xsd:anyURI",
    "@value": "https://epncb.oma.be/pub/RINEX/2009/363/BRUX3630.09D.Z"
  },
  "gnss:obsData": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#obsdata"
  },
  "mediaType": "application/octet-stream",
  "temporal": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#temporal"
  }
},
{
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#obsdata",
  "@type": "gnss:OBSData",
  "gnss:compressFormat": {
    "@id": "https://gnss.be/PID/standard/hatanaka"
  },
  "gnss:format": {
    "@id": "https://gnss.be/PID/standard/RINEX"
  },
  "gnss:frequency": {
    "@id": "http://purl.org/cld/freq/daily"
  },
  "gnss:obsHeader": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#obsheader"
  },
  "gnss:station": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#station"
  }
},
{
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#obsheader",
  "gnss:antenna": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#antenna"
  },
  "gnss:interval": {
    "@type": "xsd:nonNegativeInteger",
    "@value": "30"
  },
  "gnss:issued": {
    "@type": "xsd:dateTime",
    "@value": "2009-12-29T00:00:00"
  },
  "gnss:markerName": "BRUX00BEL",
  "gnss:receiver": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#receiver"
  },
  "gnss:rinexVersion": "2",
  "gnss:temporal": {
    "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#temporal"
  }
},
{
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#temporal",
  "@type": "PeriodOfTime",
  "endDate": {
    "@type": "xsd:dateTime",
    "@value": "2009-12-29T23:59:30"
  },
  "startDate": {
    "@type": "xsd:dateTime",
    "@value": "2009-12-29T00:00:00"
  }
},
{
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#checksum",
  "@type": "dct:Checksum",
  "dct:checksumAlgorithm": "MD5",
  "dct:checksumValue": "71bcfa51f561a7cf984ad2f4458b56e9"
},
    {
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#receiver",
  "gnss:firmware_version": "1L01-1D04",
  "gnss:igsModelCode": "ASHTECH Z-XII3T"
},
{
  "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_RNone#antenna",
  "gnss:igsModelCode": "ASH701945C_M    NONE",
  "gnss:marker-arpEastEcc": {
    "@type": "xsd:float",
    "@value": "0.0"
  },
  "gnss:marker-arpNorthEcc": {
    "@type": "xsd:float",
    "@value": "0.001"
  },
  "gnss:marker-arpUpEcc": {
    "@type": "xsd:float",
    "@value": "0.1266"
  }
}

where the date of the last change is reported as "dct:modified": "2020-02-05T16:42:12Z", together with other relevant information related to the RINEX file itself, e.g. data license under "dct:license", data description and format under "dct:description, "dct:conformsTo", link to the station-dependent metadata via "dataset" etc.

Station-dependent metadata

The station-dependent metadata (in the GNSS-DCAT-AP schema) is provided in the form of persistent links (URL) to the station site log and GeodesyML files as well as a few properties related to the station dataset (e.g data license and links to the RINEX files and the repository metadata).
The site log is an international standard for exchanging station descriptions.
More detailed station information is available from the GeodesyML file (version 0.5), which contains all the information stored in the site log plus some extra metadata elements such as data license, and a DOI for the GNSS station dataset. These extra metadata are part of the additional information needed to comply with FAIR data principles.

For example, the JSON-LD file (extract of the GNSS-DCAT-AP schema) associated to the RINEX data of the BRUX00BEL station would contain:

{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#sitelog",
  "@type": "Distribution",
  "accessURL": {
    "@type": "xsd:anyURI",
    "@value": "https://gnss-metadata.eu"
  },
  "dct:description": "Station site log for BRUX00BEL",
  "dct:issued": {
    "@type": "xsd:dateTime",
    "@value": "2023-06-06T02:18:00+00:00"
  },
  "dct:license": {
    "@id": "https://creativecommons.org/licenses/by/4.0/"
  },
  "dct:modified": {
    "@type": "xsd:dateTime",
    "@value": "2023-06-06T02:18:00+00:00"
  },
  "dct:title": "brux00bel_20230124.log",
  "downloadURL": {
    "@type": "xsd:anyURI",
    "@value": "https://gnss-metadata.eu/v1/sitelog/exportlog?id=BRUX00BEL"
  },
  "mediaType": "text/plain;charset=UTF-8"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#geodesyml",
  "@type": "Distribution",
  "accessURL": {
    "@type": "xsd:anyURI",
    "@value": "https://gnss-metadata.eu"
  },
  "dct:description": "Station GeodesyML for BRUX00BEL",
  "dct:issued": {
    "@type": "xsd:dateTime",
    "@value": "2023-06-06T02:18:00+00:00"
  },
  "dct:license": {
    "@id": "https://creativecommons.org/licenses/by/4.0/"
  },
  "dct:modified": {
    "@type": "xsd:dateTime",
    "@value": "2023-06-06T02:18:00+00:00"
  },
  "dct:title": "BRUX00BEL.xml",
  "downloadURL": {
    "@type": "xsd:anyURI",
    "@value": "https://gnss-metadata.eu/v1/sitelog/exportxml?id=BRUX00BEL"
  },
  "mediaType": "application/xml;charset=UTF-8"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL",
  "@type": "Dataset",
  "adms:identifier": [
    {
      "@id": "https://epncb.oma.be/PID/BRUX00BEL#identifier_ninechar"
    },
    {
      "@id": "https://epncb.oma.be/PID/BRUX00BEL#identifier_domes"
    }
  ],
  "catalog": {
    "@id": "https://epncb.oma.be/PID/catalog"
  },
  "contactPoint": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#contact"
  },
  "dct:accrualPeriodicity": {
    "@id": "http://purl.org/cld/freq/daily"
  },
  "dct:creator": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#creator"
  },
  "dct:description": {
    "@language": "en",
    "@value": "BRUX00BEL GNSS station daily RINEX data at EUREF Permanent GNSS Network Historical Data Center"
  },
  "dct:modified": {
    "@type": "xsd:dateTime",
    "@value": "2024-03-13T04:04:37"
  },
  "dct:spatial": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#spatial"
  },
  "dct:temporal": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#temporal"
  },
  "dct:title": {
    "@language": "en",
    "@value": "BRUX00BEL Dataset"
  },
  "distribution": [
    {
      "@id": "https://epncb.oma.be/PID/2009/001/BRUX00BEL_2009001_01D_30S_R2"
    },
...
    {
      "@id": "https://epncb.oma.be/PID/2024/066/BRUX00BEL_2024066_01D_30S_R3"
    }
  ],
  "gnss:station": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#station"
  },
  "keyword": [
    "GNSS Dataset",
    "30 s",
    "24 h",
    "EPN Historical Data Center",
    "BRUX00BEL",
    "Brussels",
    "BEL"
  ]
},
{
  "@id": "https://creativecommons.org/licenses/by/4.0/",
  "@type": "dct:LicenseDocument",
  "dct:identifier": "CC-BY-4.0",
  "dct:license": {
    "@type": "xsd:anyURI",
    "@value": "https://creativecommons.org/licenses/by/4.0/"
  },
  "dct:title": "CC-BY-4.0"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#identifier_domes",
  "@type": "adms:Identifier",
  "adms:schemaAgency": {
    "@language": "en",
    "@value": "Station DOMES number"
  },
  "skos:notation": "13101M010"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#location",
  "@type": "dct:Point",
  "locn:coordinates": "[4.358563471289608, 50.79806281977222]"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#temporal",
  "@type": "dct:PeriodOfTime",
  "endDate": {
    "@type": "xsd:dateTime",
    "@value": "2024-03-06T23:59:30"
  },
  "startDate": {
    "@type": "xsd:dateTime",
    "@value": "2009-01-01T00:00:00"
  }
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#license",
  "@type": "dct:LicenseDocument",
  "dct:identifier": "CC-BY-4.0",
  "dct:license": {
    "@type": "xsd:anyURI",
    "@value": "https://creativecommons.org/licenses/by/4.0/"
  },
  "dct:title": "CC-BY-4.0"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#spatial",
  "@type": "dct:Location",
  "locn:city": "Brussels",
  "locn:country": "BEL",
  "locn:geometry": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#location"
  }
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#creator",
  "@type": "foaf:agent",
  "foaf:name": {
    "@language": "en",
    "@value": "Royal Observatory of Belgium (BEL)"
  }
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#identifier_ninechar",
  "@type": "adms:Identifier",
  "adms:schemaAgency": {
    "@language": "en",
    "@value": "Station 9 Character Identifier"
  },
  "skos:notation": "BRUX00BEL"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#contact",
  "@type": "vcard:Contact",
  "vcard:email": "gnss@oma.be",
  "vcard:fn": "GNSSatROB"
},
{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#station",
  "@type": "gnss:Station",
  "gnss:geodesyml": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#geodesyml"
  },
  "gnss:nineCharacterID": "BRUX00BEL",
  "gnss:sitelog": {
    "@id": "https://epncb.oma.be/PID/BRUX00BEL#sitelog"
  }
}

where https://gnss-metadata.eu/v1/sitelog/exportlog?id=BRUX00BEL and https://gnss-metadata.eu/v1/sitelog/exportxml?id=BRUX00BEL are the URLs to download the station site log and the GeodesyML file, respectively.

Finally, to retrieve these metadata from the portal and eventually process them, have a look at the Retrieve GNSS data & metadata files and the Process GNSS data & metadata files sections.

Back to top

GNSS data citation & usage conditions

GNSS data citation

When downloading GNSS (meta)data from this portal, you are expected to acknowledge (cite) the GNSS (meta)data providers.
For this purpose, Digital Object Identifiers (DOIs) are assigned to the GNSS metadata and RINEX data.
DOIs provide a globally unique, persistent and resolvable reference to the (meta)data and offer users the necessary information to cite the data.
In addition, through DOIs, users are aware of data access restrictions and cross-linking through various DOIs becomes possible (e.g. link publications and underlying data, datasets with other datasets via hierarchical relations, visualize relationships via PID graphs).

To cite the usage of GNSS station-dependent metadata, use the citation available through the following DOI: https://doi.org/10.24414/ROB-GNSS-M3G.

To cite the usage of GNSS RINEX data files, several options are possible:

  1. Cite the full data repository (currently recommended):
    • EPN Historical Data Center: https://doi.org/10.24414/ROB-EUREF-HDC
    • Belgian data repository: https://doi.org/10.24414/ROB-GNSS-BE-REPO
  2. Cite the dataset of an individual GNSS station. These so-called station-DOIs are currently only available for a few GNSS stations. These DOIs can be found via the portal API.
    For example, for the station DVCN00SVK , via the request https://gnss.be/api/v1/epn/dataset/DVCN00SVK, you obtain a response in the JSON-LD format, containing:
    
    {
      "@id": "https://epncb.oma.be/PID/DVCN00SVK#identifier_doi",
      "@type": "adms:Identifier",
      "adms:schemaAgency": {
        "@language": "en",
        "@value": "International DOI Foundation"
      },
      "skos:notation": {
        "@type": "xsd:anyURI",
        "@value": "https://doi.org/10.24414/ROB-EUREF-DVCN00SVK"
      }
    },
    
    

Presently, ROB is still in the process of collecting and/or minting DOI for all the RINEX datasets in its repositories. As long as this process is not completed, 1. is the recommended data citation method.

GNSS data usage conditions

The conditions under which the data provided by this Open Data Portal can be accessed, used and shared have been decided by the agencies responsible for the GNSS stations through the provision of a data license.
This data license is a legal arrangement between the owner of the data and the end-users.

All GNSS data available from this data portal come with a Creative Commons (CC) license and the most common licenses are:

  • CC0 1.0: you can copy, modify, distribute the data, even for commercial purposes, without asking permission
  • CC BY 4.0 (recommended): as CC0 1.0, but you must give credit e.g, via the DOI associated to the station data (if available), and indicate if changes were made to the data
Information about the data license attached to the RINEX data is included in the metadata accompanying RINEX files via a link to the metadata describing all the available datasets originating from a given GNSS station. For example, considering the metadata regarding the daily GNSS data of the station BRUX00BEL for Day Of Year (DOY) 363 of the year 2009, one can find in the JSON-LD file the following information:

"dct:license": {
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#license"
},

where the data license is identified with a Persistent Identifier (PID) linking the RINEX file to https://epncb.oma.be/PID/BRUX00BEL#license i.e. the metadata describing the BRUX00BEL station datasets.
Indeed, via the request https://gnss.be/api/v1/epn/dataset/BRUX00BEL, one gets the following detailed data license information:

{
  "@id": "https://epncb.oma.be/PID/BRUX00BEL#license",
  "@type": "dct:LicenseDocument",
  "dct:identifier": "CC-BY-4.0",
  "dct:license": {
    "@type": "xsd:anyURI",
    "@value": "https://gnss-metadata.eu/v1/licensedescription/view?id=CC-BY-4.0"
  },
  "dct:title": "CC-BY-4.0"
},
{
  "@id": "https://creativecommons.org/licenses/by/4.0/",
  "@type": "dct:LicenseDocument",
  "dct:identifier": "CC-BY-4.0",
  "dct:license": {
    "@type": "xsd:anyURI",
    "@value": "https://creativecommons.org/licenses/by/4.0/"
  },
  "dct:title": "CC-BY-4.0"
},

where the data license is identified by the PID mentioned above (https://epncb.oma.be/PID/BRUX00BEL#license) and documented by "dct:identifier": "CC-BY-4.0" and "dct:license": "https://creativecommons.org/licenses/by/4.0/"

Back to top

Retrieve GNSS data & metadata files

Output file formats

The GNSS data and associated metadata can be retrieved by the search functionalities of the web interface of the Open Data Portal or via its RESTful HTTP application programming interface (API).

In both cases, the selected output format will define the amount of information that is provided to the user as summarized in the table below:
Output format
URLs of the RINEX data files
Metadata
(RINEX file, station datasets and repository)
txt ✓ -
JSON ✓ -
JSON-LD ✓ ✓

The format of the data provided by the Open Data Portal is described here.
The format of the provided metadata is described here.

Retrieve (meta)data from the web interface

Through the web interface of the Open data Portal you can select RINEX data available in the EPN HDC and the Belgian GNSS data repository.
At present, the web interface allows you to select daily RINEX data based on:

  • location
  • RINEX version
  • date range
  • GNSS station(s)

For example, one might want to retrieve the data of the BRUX00BEL station from 2009-12-29 to 2010-01-02:

In the search results table, below the map showing the GNSS stations corresponding to the selected RINEX data, you can then download different types of output files (detailed in the Output formats section)

containing the URLs to the daily RINEX data you selected (see Example I.1 and I.2) as well as files containing also the metadata associated to the selected RINEX data (see Example I.3).

Example I.1 - Retrieve URLs pointing to selected RINEX data as a plain text file

In the search results table, one can download a plain text output file containing the URLs pointing to the selected RINEX files i.e., as in the example above, the daily RINEX files of the BRUX00BEL station dating from 2009-12-29 to 2010-01-02.
You can then click on and download the BRUX00BEL.txt file, which contains:


https://epncb.oma.be/pub/RINEX/2009/363/BRUX3630.09D.Z
https://epncb.oma.be/pub/RINEX/2009/364/BRUX3640.09D.Z
https://epncb.oma.be/pub/RINEX/2009/365/BRUX3650.09D.Z
https://epncb.oma.be/pub/RINEX/2010/001/BRUX0010.10D.Z
https://epncb.oma.be/pub/RINEX/2010/002/BRUX0020.10D.Z

A simple example on how to process this type of file and actually download the RINEX files is given in Example P.1.

Example I.2 - Retrieve URLs pointing to selected RINEX data as a simple JSON file

A in the example above, in addition to the plain text file, one could download a JSON output file, by clicking on in the search results table.
This JSON file contains the URLs pointing to the selected RINEX files together with some additional information such a the date, the Day Of the Year (DOY), the year and the RINEX version corresponding to each of the selected RINEX FILES:


[
  {
    "DOY": 363,
    "date": "2009-12-29",
    "filename": "BRUX3630.09D.Z",
    "rinexVersion": "2",
    "stationId": "BRUX00BEL",
    "url": "https://www.epncb.oma.be/pub/RINEX/2009/363/BRUX3630.09D.Z",
    "year": 2009
  },
  {
    "DOY": 364,
    "date": "2009-12-30",
    "filename": "BRUX3640.09D.Z",
    "rinexVersion": "2",
    "stationId": "BRUX00BEL",
    "url": "https://www.epncb.oma.be/pub/RINEX/2009/364/BRUX3640.09D.Z",
    "year": 2009
  },
...
]

To know more on how to process this output and download the files, see the Example P.2.

Example I.3 - Retrieve URLs pointing to selected RINEX data & the associated metadata as a JSON-LD file

On the web interface, one might want to retrieve the URLs pointing to the selected RINEX data and the accompanying metadata.
To do so, click on and download a JSON-LD output file (BRUX00BEL.jsonld).
The BRUX00BEL.jsonld file is structured according to the GNSS-DCAT-AP schema (see the GNSS metadata format section) and contains the URLs to download the selected RINEX files (accessURL), and metadata such as the file name (dct:title), last modfication date (dct:modified), etc. for each of the selected RINEX files:


      "@id": "https://epncb.oma.be/PID/2009/363/BRUX00BEL_2009363_01D_30S_R2",
      "@type": "Distribution",
      "accessURL": {
        "@type": "xsd:anyURI",
        "@value": "https://epncb.oma.be/pub/RINEX/2009/363/BRUX3630.09D.Z"
      },
      "dct:title": "BRUX3630.09D.Z",
      "downloadURL": {
        "@type": "xsd:anyURI",
        "@value": "https://epncb.oma.be/pub/RINEX/2009/363/BRUX3630.09D.Z"
      },
      "dct:description": "Daily RINEX data of the GNSS station BRUX00BEL for DOY 363 of 2009",
      "dct:issued": {
        "@type": "xsd:dateTime",
        "@value": "2009-12-29T00:00:00"
      },
      "dct:modified": {
        "@type": "xsd:dateTime",
        "@value": "2020-02-05T16:42:12"
      },
      "dct:conformsTo": {
        "@id": "https://gnss.be/PID/standard#hatanaka"
      },
      "dct:license": {
        "@id": "https://epncb.oma.be/PID/BRUX00BEL#license"
      },
    ...

To know more on how to process this output, see the Examples P.3 & P.4.

Retrieve (meta)data using the API

Data and metadata offered by the Open Data portal can be accessed via a RESTful API, available for both the Belgian and the EPN HDC repositories.

Depending on which repository you would like to to access i.e., the EPN HDC or the Belgian GNSS data repository, there is a corresponding API server to retrieve GNSS metadata and daily RINEX data, and a Swagger User Interface to check the API documentation and test the API itself:

API server Swagger User Interface
EPN HDC repository https://gnss.be/api/v1/epn/ https://gnss.be/api/v1/epn/doc
Belgian GNSS data repository https://gnss.be/api/v1/belgium/ https://gnss.be/api/v1/belgium/doc

The same API’s are offered for both repositories. Please note that currently the number of API requests per user is limited to 20 per minute.
Below you can find a table that provides an overview of the API endpoints:
API endpoint Optional parameters Output formats Pagination Short description
GET /station-data/{stationId} RINEX version, start date, end date, last modification date text, JSON, JSON-LD NO Retrieve RINEX data URLs in a given time range and associated metadata of one GNSS station
GET /data (list of) 9-char station IDs, RINEX version, start date, end date, last modification date text, JSON, JSON-LD YES Retrieve RINEX data URLs in a given time range and associated metadata of one or more GNSS stations
GET /distribution/{stationid}/{YEAR}/{DOY}/{rinex_version} RINEX version, start date, end date, last modification date text, JSON, JSON-LD NO Retrieve URL for a single RINEX data file of a given YEAR/DOY/RINEX version and associated metadata for one GNSS station
GET /doy/{YEAR}/{DOY} RINEX version, start date, end date, last modification date text, JSON, JSON-LD NO Retrieve RINEX data URLs and associated metadata of one or more GNSS stations for a given YEAR/DOY
GET /dataset/{stationId} - JSON-LD NO Retrieve the station metadata (DOI, data license, station location, etc. and an overview of the available RINEX data)
GET /catalog - JSON-LD NO Retrieve the repository metadata (publisher, location, list of GNSS stations, etc.) based on the choice of the API server
Example A.1 - API response as plain text

Let's assume one would like to retrieve all the available RINEX data of the BRUX00BEL station from 2009-12-29 to 2010-01-02 and, as in the Example I.1, you would like to obtain the list of URLs pointing to the RINEX data in a plain text output file.

The API endpoint /station-data/{stationid} allows you to do that. You need to formulate your query/request by specifying the station 9-characters ID, the start and end date, and the RINEX version you are interested in. Please note that the RINEX version default value is the most recent version available (as provided by the GNSS station managers) in the given date range.

The API URL corresponding to your query would look like:

https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=all&startDate=2023-09-01&endDate=2023-09-01


By clicking on the link above, you will visualize the API response in JSON, which is the current default output format.

To actually obtain as a response a plain text output file with the list of URLs, you need to use content negotiation and include in the Accept header parameter the desired type of output (text/plain).
One of the easiest ways to download the text file is via the curl command, which acts as an HTTP client and allows you to send requests and display/store the corresponding response:


curl -X 'GET' 'https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=latest&startDate=2023-09-01&endDate=2023-09-01' -H 'accept: text/plain' --output BRUX00BEL_file_list.txt
 


As in Example I.1, the BRUX00BEL_file_list.txt will contain the list of URLs as a column.

To know more on how to process this output and download the files, see the Example P.1.

Example A.2 - API response as simple JSON

As mentioned in the example above (A.1), once the query parameters have been identified (station 9-characters ID, dates, RINEX version, etc.), the API URL:

https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=all&startDate=2023-09-01&endDate=2023-09-01


returns a JSON output file by default.
You can then download the JSON file from your browser or using content negotiation, for example via curl


curl -X 'GET' 'https://gnss.be/api/v1/epn/station-data/BRUX00BEL?rinexVersion=latest&startDate=2023-09-01&endDate=2023-09-01'  --output BRUX00BEL_file_list.json
 

To know more on how to process this output and download the files, see the Example P.2.

Example A.3 - API response as JSON-LD

As mentioned in the examples above (A.1 and A.2), once the query parameters have been identified (station 9-characters ID, dates, RINEX version..), the API URL is defined

https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=all&startDate=2023-09-01&endDate=2023-09-01


By choosing JSON-LD output format i.e. application/ld+json as accept header parameter, you can download the metadata associated to the selectd RINEX files, together with URLs pointing to those files (see also Example I.3).

In practice, via content negotiation, you can download the JSON-LD file. For example, via curl:


curl -X 'GET' 'https://gnss.be/api/v1/epn/station-data/BRUX00BEL?rinexVersion=all&startDate=2023-09-01&endDate=2023-09-01' -H 'accept: application/ld+json'  --output BRUX00BEL_file_list.jsonld
 


The API also allows the users to retrieve rich metadata asoociated to the GNSS stations and the data repositories in JSON-LD output format.
For example, using the https://gnss.be/api/v1/belgium/ API server:

  • https://gnss.be/api/v1/epn/dataset/BRUX00BEL gives standardized information about the BRUX00BEL station such as the list of the included stations.
  • https://gnss.be/api/v1/belgium/catalog gives standardized information about the GNSS belgian data repository such as the list of the included stations.

To know more on how to process this output and download the files, see the Examples P.3 & P.4.

Please note that, in addition to the Open Data Portal web interface and API, one could also access the data via HTTPS file servers (for the EPN HDC and the Belgian repository) as well as the metadata via metadata file servers (for both the EPN HDC and Belgian repository).

Back to top

Process GNSS data & metadata files

Below, a list of examples which are complemented by those available on Github (https://github.com/ROB-GNSS/gnss.be-data-API-examples).

Process plain text output

If you have selected to download the list of URLs pointing to the RINEX data as text output file whether via the web interface as in Example I.1 or via the API as in Example A.1, you can now actually download the selected RINEX files using the URL list in the text file.

Example P.1 - Download RINEX data with wget

For example, assuming BRUX00BEL_file_list.txt is the text file containing teh URLs, you can download the RINEX file svia the command line tool wget.
You can choose to keep the file server directory structure via wget -x -nH or download all files in the same directory.
For example:


$ wget -i BRUX00BEL_file_list.txt
$ tree
.
├── BRUX0010.10D.Z
├── BRUX0020.10D.Z
├── BRUX00BEL_file_list.txt
├── BRUX3630.09D.Z
├── BRUX3640.09D.Z
└── BRUX3650.09D.Z

0 directories, 6 files


$ wget -x -nH -i BRUX00BEL_file_list.txt
$ tree
.
├── BRUX00BEL_file_list.txt
└── pub
    └── RINEX
        ├── 2009
        │   ├── 363
        │   │   └── BRUX3630.09D.Z
        │   ├── 364
        │   │   └── BRUX3640.09D.Z
        │   └── 365
        │       └── BRUX3650.09D.Z
        └── 2010
            ├── 001
            │   └── BRUX0010.10D.Z
            └── 002
                └── BRUX0020.10D.Z

9 directories, 6 files

Process simple JSON output

If you have selected to download the list of URLs pointing to the RINEX data as JSON output file whether via the web interface as in Example I.2 or via the API as in Example A.2, you can now actually download the selected RINEX files using the URL list in the JSOn file using various approaches.

Example P.2 - Process simple JSON output with php & cURL

For example, a PHP script with the cURL functions :


$api_url = "https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=all&startDate=2009-12-29&endDate=2010-01-02";
$ch = curl_init($api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
curl_close($ch);
$json_result = json_decode($result,true);
foreach($json_result as $value)
  {
  $file_name = basename($value["url"]);
  file_put_contents($file_name, file_get_contents($value["url"]));
  }

Example P.2 - Process simple JSON output with Phython

Using Python, with the requests, a generic HTTP client library (installable via pip install requests):


import requests
api_url="https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=all&startDate=2009-12-29&endDate=2010-01-02"
headers={'accept': 'application/json'}
jsonfile=requests.get(api_url,headers=headers)
for i in jsonfile.json():
  url=i['url']
  filename=url.rsplit('/', 1)[1]
  r = requests.get(url, allow_redirects=True)
  open(filename, 'wb').write(r.content)

Process JSON-LD output

Using Python, with the request library and rdflib, which can read JSON-LD formatted documents and create RDF graphs (both installable via pip install requests rdflib):


import requests
import rdflib

api_url="https://gnss.be/api/v1/belgium/station-data/BRUX00BEL?rinexVersion=all&startDate=2009-12-29&endDate=2010-01-02"
headers={'accept': 'application/ld+json'}
jsonldfile=requests.get(api_url,headers=headers).json()

g = rdflib.Graph()
g.parse(data=jsonldfile,format='json-ld')
#Prepare the SPARQL query to get from the graph g all ``dcat:accessURL`` instances aka the URLs pointing to the files
q = """
    PREFIX dcat1:  <https://www.w3.org/ns/dcat#>
    SELECT ?url
    WHERE {
        ?p dcat1:accessURL ?url .
    }
"""
#Apply the query to the graph and iterate to get all RINEX files URLs and download them
for r in g.query(q):
    url=r["url"]
    filename=url.rsplit('/', 1)[1]
    print(filename)
    r = requests.get(url, allow_redirects=True)
    open(filename, 'wb').write(r.content)

To be completed with additional examples and use cases.

Back to top

Get in touch
Contact us
  • Royal Observatory of Belgium (GNSS team)
    av. Circulaire 3,
    B-1180 Brussels, Belgium

  • +32-(0)2-3730211

  • Send a message

  • @be_GNSS

Funded by
ROB logo BELSPO logo

Royal Observatory of Belgium
and
Belgian Science Policy Office (GA B2/202/P2/FAIR-GNSS)

© Copyright 2023 - Royal Observatory of Belgium

  • Terms of use
  • Cookie declaration
  • Data policy
  • ROB general privacy policy
  • Disclaimer