Metadata in SensorThings - kwalificaties van wat er gemeten is

We zijn bezig met het opzetten van een datauitwisselingsformaat (https://www.csdif.info) op basis van SensorThings en SensorML. Het doel is om meetgegevens van allerlei community/citizen science initiatieven beter uitwisselbaar te maken, voorzien van rijke metadata over gebruikte sensoren, methodes, meetopstelling, etc. We hebben deze zomer een eerste ruw voorstel geschreven en zijn nu bezig met een proof-of-concept-implementatie om te kijken waar we tegen aan lopen. In deze post wil ik één van die dingen aan jullie voorleggen, op zoek naar input en praktijkervaring op dit gebied.

Binnen SensorThings/STA (en OGC O&M) bestaat er het concept “ObservedProperty” om aan te geven wat een observatie/meting precies geobserveerd heeft. Binnen STA ziet dat er bijvoorbeeld zo uit:

      {
         "name":"temperature",
         "definition":"http://qudt.org/vocab/quantitykind/Temperature",
         "description":"Temperature",
      },

Hierbij zou volgens mij de “definition” leidend moeten zijn, de “name” en “description” zij bedoeld voor weergave, maar zouden de betekenis van de ObservedProperty niet moeten veranderen.

Voor die definition kun je diverse URIs gebruiken, het systeem van QUDT quantityKinds leek ons hier het meest compleet en stabiel. Echter, als we deze quantityKinds gebruiken, missen we nog wel informatie en context over wat er gemeten wordt. Twee voorbeelden waar we tegen aan lopen:

  1. Hierboven wordt aangegeven dat er temperatuur gemeten wordt, maar wat voor temperatuur is dat? Is dat de luchttemperatuur? Watertemperatuur? Bodemtemperatuur? Temperatuur in een opslagtank? Etc.
  2. We meten ook fijnstof (particulate matter), en gebruiken hiervoor nu definition="https://qudt.org/vocab/quantitykind/MassDensity", maar het is relevant om aan te geven dat het gaat om deeltjes van een bepaalde maat. De gangbare term daarvoor is bijv PM10 voor deeltjes tot 10μm diameter, maar in QUDT kan ik daar niets voor terugvinden.

Mogelijk dat deze twee voorbeelden niets met elkaar te maken hebben en verschillende oplossingen hebben, maar in de basis gaat het in beide gevallen om kwalificeren wat er precies gemeten is.

We kunnen niet de eerste zijn die hier tegenaan loopt, dus hoe lossen andere mensen en systemen dit op (icm SensorThings of wellicht andere OGC-gerelateerde standaarden die ook uitgaan van een vergelijkbaar datamodel)?

Een aantal oplossingen die we voor ons zouden zien:

  1. Een andere ontologie dan QUDT zoeken die dit soort kwalificaties expliciet maakt in de gebruikte termen. Dit wordt bijvoorbeeld gedaan in het samenmeten platform van het RIVM, daar gebruiken ze bijvoorbeeld “https://www.eea.europa.eu/help/glossary/eea-glossary/pm10”. Dit is pragmatisch, maar leidt mogelijk wel tot een ratjetoe aan verschillende ontololgieën als je voor alles gaat rondshoppen naar waar iets gedefinieerd is. En het is weinig generiek: Het is gebruikelijk dat er gemeten wordt in bijvoorbeeld PM1, PM2.5, PM4 en PM10, maar er is niets dat me er van weerhoudt om een PM8-sensor te maken en die data te willen bewaren, dus een generiekere oplossing zou wellicht de voorkeur hebben.
  2. Als variant op de vorige optie zouden we onze eigen ontologie kunnen definieren voor alles, maar dat is veel werk en beperkt uitwisselbaar met bestaande datasets. Eventueel kunnen we dit alleen doen voor termen die we tekort komen.
  3. Door middel van parameters extra kwalificaties toevoegen aan de URIs, bijvoorbeeld https://qudt.org/vocab/quantitykind/MassDensity#pm_size=10 of https://qudt.org/vocab/quantitykind/MassDensity?pm_size=10. Dit heeft als voordeel dat de kwalificatie op een generieke manier in de URI verwerkt is (en consumenten die gewoon matchen op URI zien verder geen verschil). Echter, dit zou ik alleen willen gebruiken als de ontologie die de basis-uri definieert, ook specificeert wat voor parameters er toegevoegd kunnen worden en wat hun betekenis is. Zijn er ontologieën die dit doen?
  4. Op een andere plek in het datamodel deze kwalificaties toevoegen. Voor het onderscheid tussen bijv “luchttemperatuur” en “watertemperatuur” zou het wellicht zuiver zijn om dat als eigenschap van de “FeatureOfInterest” te modelleren. Echter, in SensorThings is “FeatureOfInterest” gereduceerd tot een (GeoJSON) locatie en is het me niet duidelijk of het gangbaar is daar nog dit soort extra attributen aan toe te voegen. Een andere plek zou kunnen zijn in de (SensorML) beschrijving van het Sensor Object, of wellicht in het “parameters” veld van de Observations (wat bedoeld is als parameters aan de “ombserving procedure” denk ik, dus wellicht niet helemaal de goede plek aangezien alle observations in de datastream dezelfde parameters zullen hebben).

Ik hoor graag jullie ideeën en ervaringen!

Hallo Matthijs,

Geen ervaring specifiek met deze materie, maar na je post te hebben gelezen twee observaties:

  1. Het is niet alleen essentieel om aan te geven wat er gemeten is, maar ook om aan te geven in welke eenheid dat gemeten is. Voor temperatuur bijvoorbeeld maakt het nogal een verschil of je in Kelvin, Fahrenheit of Celsius de waarden terug geeft. Voor fijnstofmetingen niet alleen de parts per volume, maar ook volume-eenheid, en eenheid van het fijnstof. Dus uit de Temperature-definitie moet m.i. minstens de qudt:applicableUnit toegevoegd zijn (tenzij die elders in het schema is opgenomen - maar hij mag niet missen, anders heb je niks aan eventuele waarden).

Zeer zeker is het gangbaar om attributen aan GeoJSON toe te voegen. Via geojson.org kun je RFC 7946 vinden uit 2016, waar GeoJSON beschreven word. Inclusief de definities van geometrie en eigenschappen (properties). En dat in die RFC gezegd word dat GeoJSON altijd in WGS 84 zou moeten zijn, kun je met een korreltje zout nemen: GeoJSON kan uitstekend in RD gevormd worden, en de meeste GIS- en (web-)Mapping software kan daar prima mee overweg.

En als laatste:

Dat lijkt mij geen goed idee, omdat je dan (zoals je zelf ook al aangeeft) uitwisselbaarheid opoffert. Terwijl er ruimte genoeg lijkt te zijn voor specifieke zaken, voor zover ik dat kan beoordelen zonder me er al te veel in te verdiepen.

Dank voor je reactie, ik reageer hieronder even.

Absoluut, maar daar heeft SensorThings aparte attributen voor, dus dat staat even los van dit topic (ik heb over het gebruik van UCUM-definities voor units in SensorThings ook nog wel wat vragen, maar die zal ik wellicht later apart nog wel eens stellen).

Ja, dat het mag volgens GeoJSON had ik al wel gevonden, maar de grote vraag is: Gebeurt het in de praktijk? En zijn er dan nog aanvullende standaarden over welke properties je kunt toevoegen (want wederom: We kunnen onze eigen properties verzinnen, maar dat is niet ideaal voor de uitwisselbaarheid).

Hoi Matthijs,

Als ik Observations, measurements and samples goed lees dan staat er: An ObservableProperty shall be defined as a quality (property, characteristic) of the feature-of-interest that can be observed.
Oftewel, ObservableProperty is een eigenschap van het ‘ding wat je meet’.

De Observation zelf heeft een eigenschap UoM: The Observation shall provide a unit of measure (UoM) if the result is measurable. If the UoM is not contained in the result, it shall be provided in the context of the Observation ; the provision modality is to be defined by communities.
Volgens mij wil je daar de relatie naar QUDT leggen.

In een van de voorbeelden van de Semantic Sensor Network Ontology zie je dat ook mooi terug:

<observation/1087>  rdf:type               sosa:Observation ;
  rdfs:label "observation #1087"@en ;
  sosa:hasFeatureOfInterest  <tree/124> ;
  sosa:observedProperty  <tree/124/height> ;
  sosa:madeBySensor <rangefinder/30> ;
  sosa:hasResult [ 
    qudt-1-1:unit qudt-unit-1-1:Meter ; 
    qudt-1-1:numericalValue "15.3"^^xsd:double ] .

# using SSN, one can explicitly link a property and its feature of interest.
 
<tree/124>  rdf:type    sosa:FeatureOfInterest ;
  rdfs:label "tree #124"@en ;
  ssn:hasProperty <tree/124#height> .

<tree/124#height>  rdf:type    sosa:ObservableProperty , ssn:Property ;
  rdfs:label "the height of tree #124"@en ;
  ssn:isPropertyOf <tree/124> .

De observatie heeft een observedProperty ‘height’ en een FeatureOfInterest (‘tree/124’) een een hasResult met een qudt unit en value.
(Semantic Sensor Network Ontology)

Hallo Matthijs, goed iniatief!

Paar comments/ideeen:

  • Qgis heeft sinds laatste versies een STA module beschikbaar, dat betekent dat je een STA service tegenwoordig aardig kunt visualiseren in QGIS
  • In jouw geval lijk je vooral het STA model te willen gebruiken in een rdf context, ik draai zelf wat experimenten om CSV data als SOSA (of schema.org/observation) te ontsluiten middels csvwlib soilwise-ontology/data-models/CSVW at main · soilwise-he/soilwise-ontology · GitHub
  • voor het beschrijven van de gemeten property (bij voorkeur als een uri uit een vocabulary, denk bv aan INSPIRE registry) is het i-adopt framework interessant, welke een property uitpakt in een chemical substance en in medium gemeten is, etc (eg aluminium, measured in water, …).
  • qudt is enkel voor de unit, OMS biedt voldoende ruimte om ook andere aspecten van de observatie te vangen, Observation - Schema.org Type is overigens ook behoorlijk compleet tegenwoordig
  • In ons geval (bodem data) is ook de gebruikt methode belangrijk, OMS biedt mogelijkheden om ook de gebruikte methode te refereren.
  • de featureofinterest is inderdaad een beetje een uitdagend concept (in ons geval, de bodem sample komt van 30cm diep, van een bodemprofiel op locatie x,y), in de OMS community stellen ze momenteel voor om een soort hierarchy te bouwen met featureofinterest en ultimate-featureofinterest. het voorbeeld wat ze vaak gebruiken, een sample uit de maag van een vis, die in een rivier zwemt, die door een berg gevoed wordt…