Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
SOSPilot - Prototype
Just van den Broecke 	

Geonovum	

Amersfoort - Oct 27, 2014	

just@justobjects.nl
ABOUT
Independent Open
Source Geospatial
Professional 	

justobjects.nl
Member of the 	

OpenGeoGroep (NL)	

www.opengeogr...
1.  Intro
Back into 

Environmental 

Chemistry
1.  Intro
1. Intro	

2. Data Transformation (ETL) 	

3. Services	

4. Clients	

5. Demo	

6. Discussion
Agenda
Home: sensors.geonovum.nl	

Doc: sospilot.rtfd.org 	

Code: github.com/Geonovum/sospilot	

TODO: GitHub issue tracker	

Pr...
Scope
1.  Intro
From: ”Building bridges: experiences and lessons learned from the implementation of INSPIRE and e-reportin...
Prototype Scope
1.  Intro
Clients
Services
Data and Transformations
2.  Data  Transformation  (ETL)
Data and
Transformations"
(ETL)
2.  Data  Transformation  (ETL)
Source: Hourly Measurements
Source: AQ Station Info (EIONET)
2.  Data  Transformation  (ETL)
Multistep ETL
2.  Data  Transformation  (ETL)
Step 1
Step 2
Step 3
2.  Data  Transformation  (ETL)
Multistep ETL -"
Advantages
• backup of source XML data files"
• incrementally build up of ...
2.  Data  Transformation  (ETL)
ETL Step 1"
File Harvester
Raw XML Files
“Blobs” + meta
in PostGIS
2.  Data  Transformation  (ETL)
ETL Step 2"
Raw AQ Measurements
“Blobs” + meta
in PostGIS
Records in 	

PostGIS
2.  Data  Transformation  (ETL)
ETL Step 2"
Stations
Edits + GDAL ogr2ogr
Stations CSV	

EIONET
Records in 	

PostGIS
2.  Data  Transformation  (ETL)
ETL Step 3"
SOS Publication
Via SOS-Transaction Protocol
Raw Records	

PostGIS
S	

O	

S	
...
2.  Data  Transformation  (ETL)
ETL Step 3"
SOS-T Templates - InsertSensor
{{!
"request": "InsertSensor",!
"service": "SOS...
2.  Data  Transformation  (ETL)
{{!
"request": "InsertObservation",!
"service": "SOS",!
"version": "2.0.0",!
"offering": "...
2.  Data  Transformation  (ETL)
ETL Tech"
Progress Tracking
Track	

Last Processed	

Record in DB
2.  Data  Transformation  (ETL)
ETL Tech"
Tool: Stetl
• Framework for Streaming ETL"
• Proven for Dutch datasets (Top10NL ...
2.  Data  Transformation  (ETL)
ETL Tech"
Tool: Stetl
Input Filter Output
gml
Filter
2.  Data  Transformation  (ETL)
[etl]!
chains = input_measurements_dbquery|output_sos_observation_insert!
"
# for reading ...
2.  Data  Transformation  (ETL)
"
options="database=sensors schema=rivm_lml host=localhost port=80 

user=** password=** h...
3.  Services
Services"
WMS/WFS
• On RAW AQ Data tables"
• Prepare data via Postgres VIEWs"
• Using GeoServer"
• Using WMS-...
CREATE VIEW rivm_lml.measurements_stations AS!
SELECT m.gid, m.station_id, s.municipality, m.component, m.sample_time,
m.s...
Services "
WMS/WFS via VIEWs
3.  Services
Measurements with Station info, a.o. GeoLocation
-- per component last-captured measurements!
CREATE VIEW rivm_lml.v_last_measurements_NO2 AS!
SELECT DISTINCT ON (station_...
Services "
WMS/WFS via VIEWs
3.  Services
Last Measurements for Ozone
3.  Services
Services"
WMS/WFS
WMS Time
3.  Services
Services"
SOS
• Using 52North SOS"
• Easy setup via Tomcat deploy + Admin GUI"
• Data population via SOS-T"
"...
3.  Services
Services -SOS
4.  Clients
Clients
• WMS/WFS - “HeronViewer”"
• SensorWebClient - 52North"
• SOS.js - JavaScript - 52 North"
"
Links via ...
Clients - WMS/WFS - HeronViewer
4.  Clients
4.  Clients
Clients - SOS - SWClient - 52N
4.  Clients
Clients - SOS - SWClient - 52N
Clients - SOS - SOS.js - 52N
4.  Clients
Automated AQ
Reporting

Geonovum PoC using Web services
with Stetl
AQ Reporting - Architecture
4.  Clients
AQ
ETL
EU
Database Database
Web Services
JSON Docs
Dataflows
B,C,D,E,F
WFS SOS Cust...
AQ Reporting - ETL
4.  Clients
Stetl
Dataflows
B,C,D,E,F
XML Docs
XML Template
Docs (Jinja2)
Custom
Python
Stetl
ETL Config
...
# Example dataflow-D (Assessment Methods metadata) report generation using Stetl with Jinja2 templating filter.
# The inpu...
{"type": "FeatureCollection", "totalFeatures": 109, "features": [!
{!
"type": "Feature",!
"id": "active_stations.fid-7d46f...
<!-- START STATIONS -->!
{% for feature in features %}!
<gml:featureMember>!
<aqd:AQD_Station gml:id="{{ feature.propertie...
AQ Reporting Status
• Dataflows B,C,D more or less done	

• Main issue is lack of source data	

• See GitHub for code:

htt...
AQ Reporting
Recommendations
• Store all relevant data in database(s) - PostgreSQL! 	

• Expose data via web services:WFS,...
Weather Station	

Geonovum Weather station -
datastream integrated 

into WMS/WFS and SOS
Architecture
WMS WFS SOS
SSH/PostgreSQL
Architecture
Weather
Communities
Wunderground etc
Davis Weather
Station
ETL
52N
SOS Server
GeoServer
SOS WMS/WFS
Weather
C...
Architecture
Archive
Recs
SQLite
Stetl
Sync
weewx
Weather
Data
PostGIS
52N
SOS Data
PostGIS
Stetl
SOS
USB
SOS-T
52N
SOS Se...
Result - Reporting
Result - Publish to Weather Community
Result - Publish to Weather Community
Result - WMS-Time/WFS
Result - SOS Integration
Demo
5.Demos
Discussion
6.  Discussion
Open Items/TODO
6.  Discussion
• Source data"
• http://www.lml.rivm.nl/xml or"
• http://www.lml.rivm.nl/sos "
• Stations i...
Upcoming SlideShare
Loading in …5
×

SensorWeb SOS Pilot RIVM/Geonovum - Status

1,909 views

Published on

Presenting the status of the "SOSPilot". A SensorWeb/IoT project where raw AirQuality data from The Netherlands is transformed (ETL) into Web Services like WMS-Time/WFS and in particular the OGC Sensor Observation Service (SOS). Project at Geonovum with partners, a.o.: RIVM, 52 North, and IRCEL - CELINE (Belgium). Work in progress, striving for EIONET IPR and INSPIRE compliance.
Combined tools like Stetl, PostGIS, HeronViewer, GeoServer, and 52North SWE-line. All FOSS. All promising tools as it all just worked, also thanks to the partners' support, within my 100-hour effort. Find more on http://sensors.geonovum.nl

Original version july 2, 2014. Updated with eionet-reporting and Geonovum weather station on okt 27, 2014.

Published in: Software, Technology
  • Be the first to comment

SensorWeb SOS Pilot RIVM/Geonovum - Status

  1. 1. SOSPilot - Prototype Just van den Broecke Geonovum Amersfoort - Oct 27, 2014 just@justobjects.nl
  2. 2. ABOUT Independent Open Source Geospatial Professional justobjects.nl Member of the OpenGeoGroep (NL) www.opengeogroep.nl Secretary 
 OSGeo.nl 1.  Intro
  3. 3. 1.  Intro
  4. 4. Back into 
 Environmental 
 Chemistry 1.  Intro
  5. 5. 1. Intro 2. Data Transformation (ETL) 3. Services 4. Clients 5. Demo 6. Discussion Agenda
  6. 6. Home: sensors.geonovum.nl Doc: sospilot.rtfd.org Code: github.com/Geonovum/sospilot TODO: GitHub issue tracker Project Links 1.  Intro
  7. 7. Scope 1.  Intro From: ”Building bridges: experiences and lessons learned from the implementation of INSPIRE and e-reporting of air quality data in Europe" 
 by: Alexander Kotsev, Olav Peeters, Paul Smits and Michel Grothe. - Earth Sci Inform DOI 10.1007/s12145-014-0160-8 SOS WMS WFS Data
  8. 8. Prototype Scope 1.  Intro Clients Services Data and Transformations
  9. 9. 2.  Data  Transformation  (ETL) Data and Transformations" (ETL)
  10. 10. 2.  Data  Transformation  (ETL) Source: Hourly Measurements
  11. 11. Source: AQ Station Info (EIONET)
  12. 12. 2.  Data  Transformation  (ETL) Multistep ETL
  13. 13. 2.  Data  Transformation  (ETL) Step 1 Step 2 Step 3
  14. 14. 2.  Data  Transformation  (ETL) Multistep ETL -" Advantages • backup of source XML data files" • incrementally build up of history past the last month" • in case of (design) errors we can always restart anew" • simpler ETL scripts than “all-in-one” (divide & conquer)" • migration with changed in 52N SOS DB schema simpler" • prepared for IPR/INSPIRE ETL " • OWS server (WMS/WFS evt WCS) can directly use Core AQ DB" • many possibilities with VIEWs on Core AQ DB" • aggregations" • last measured values" • peak values" • Voronoi polygons
  15. 15. 2.  Data  Transformation  (ETL) ETL Step 1" File Harvester Raw XML Files “Blobs” + meta in PostGIS
  16. 16. 2.  Data  Transformation  (ETL) ETL Step 2" Raw AQ Measurements “Blobs” + meta in PostGIS Records in PostGIS
  17. 17. 2.  Data  Transformation  (ETL) ETL Step 2" Stations Edits + GDAL ogr2ogr Stations CSV EIONET Records in PostGIS
  18. 18. 2.  Data  Transformation  (ETL) ETL Step 3" SOS Publication Via SOS-Transaction Protocol Raw Records PostGIS S O S - T 52N SOS PostGIS DB
  19. 19. 2.  Data  Transformation  (ETL) ETL Step 3" SOS-T Templates - InsertSensor {{! "request": "InsertSensor",! "service": "SOS",! "version": "2.0.0",! "procedureDescriptionFormat": "http://www.opengis.net/sensorML/1.0.1",! "procedureDescription": "{procedure-desc.xml}",! "observableProperty": [! "http://sensors.geonovum.nl/rivm-lml/observableProperty/benzeen",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/CO",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/NH3",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/NO",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/NO2",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/O3",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/PM10",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/PM25",! "http://sensors.geonovum.nl/rivm-lml/observableProperty/SO2"! ],! "observationType": [! "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement"! ],! "featureOfInterestType": "http://www.opengis.net/def/samplingFeatureType/OGC-OM/2.0/ SF_SamplingPoint"! }}
  20. 20. 2.  Data  Transformation  (ETL) {{! "request": "InsertObservation",! "service": "SOS",! "version": "2.0.0",! "offering": "http://sensors.geonovum.nl/rivm-lml/offering/{station_id}",! "observation": {{! "identifier": {{! .! "procedure": "http://sensors.geonovum.nl/rivm-lml/procedure/{station_id}",! "observedProperty": "http://sensors.geonovum.nl/rivm-lml/observableProperty/{component}",! "featureOfInterest": {{! "identifier": {{! "value": "http://sensors.geonovum.nl/rivm-lml/featureOfInterest/{station_id}",! "codespace": "http://www.opengis.net/def/nil/OGC/0/unknown"! }},! "name": [! {{! "value": "{municipality}",! "codespace": "http://www.opengis.net/def/nil/OGC/0/unknown"! }}! ],! "geometry": {{! "type": "Point",! "coordinates": [! {station_lat},! {station_lon}! ],! .! .! }}! }},! "phenomenonTime": "{sample_time}",! "resultTime": "{sample_time}",! "result": {{! "uom": "ug/m3",! "value": {sample_value}! }}! }}! ETL Step 3" SOS-T Templates - InsertObservation
  21. 21. 2.  Data  Transformation  (ETL) ETL Tech" Progress Tracking Track Last Processed Record in DB
  22. 22. 2.  Data  Transformation  (ETL) ETL Tech" Tool: Stetl • Framework for Streaming ETL" • Proven for Dutch datasets (Top10NL and BGT)" • Proven for INSPIRE ETL (BAG to AD, Top10 to TN)" • Integration with native libs: libXML, libXSLT, GDAL/OGR" • Declarative programming using config files" • Call-back programming model" • Extensibility via own custom modules" • Free and Open Source (GPL) in Python" " More on stetl.org and presentation
  23. 23. 2.  Data  Transformation  (ETL) ETL Tech" Tool: Stetl Input Filter Output gml Filter
  24. 24. 2.  Data  Transformation  (ETL) [etl]! chains = input_measurements_dbquery|output_sos_observation_insert! " # for reading files from Apache dir listing! [input_measurements_dbquery]! class = measurementsdbinput.MeasurementsDbInput! host = {host}! database = {database}! user = {user}! password = {password}! schema = {schema}! table = measurements_stations! query = SELECT * from measurements_stations WHERE gid > %d ORDER BY gid LIMIT 500! progress_query = SELECT * from etl_progress WHERE worker = 'measurements2sos'! progress_update = UPDATE etl_progress SET last_id = %d, last_update = current_timestamp WHERE worker = 'measurements2sos'! " [output_std]! class = outputs.standardoutput.StandardOutput! " # For inserting sensors! [output_sos_observation_insert]! class = sosoutput.SOSTOutput! host = {http_host}! port = {http_port}! path = {http_path}! user = {http_user}! password = {http_password}! method = POST! content_type = application/json;charset=UTF-8! sos_request = insert-observation! template_file_ext = json! template_file_root = sostemplates! measurements2sos.cfg ETL Tech" Stetl Config - Step 3" SOS-T Publication
  25. 25. 2.  Data  Transformation  (ETL) " options="database=sensors schema=rivm_lml host=localhost port=80 
 user=** password=** http_host=sensors.geonovum.nl 
 http_port=80 http_user=** http_password=** 
 http_path=/sos/service"! " stetl -c measurements2sos.cfg -a "$options"! ETL Tech" Stetl Command - Step 3" SOS-T Publication
  26. 26. 3.  Services Services" WMS/WFS • On RAW AQ Data tables" • Prepare data via Postgres VIEWs" • Using GeoServer" • Using WMS-Time" " Service URL " sensors.geonovum.nl/gs/ows
 
 Viewer
 sensors.geonovum.nl/heronviewer
  27. 27. CREATE VIEW rivm_lml.measurements_stations AS! SELECT m.gid, m.station_id, s.municipality, m.component, m.sample_time, m.sample_value, s.point, m.validated,! m.file_name, m.insert_time, m.sample_id,! s.local_id, s.eu_station_code, s.altitude, s.area_classification,! s.activity_begin, s.activity_end! FROM rivm_lml.measurements as m! INNER JOIN rivm_lml.stations as s ON m.station_id = s.natl_station_code; Services " WMS/WFS via VIEWs 3.  Services Measurements with Station info, a.o. GeoLocation
  28. 28. Services " WMS/WFS via VIEWs 3.  Services Measurements with Station info, a.o. GeoLocation
  29. 29. -- per component last-captured measurements! CREATE VIEW rivm_lml.v_last_measurements_NO2 AS! SELECT DISTINCT ON (station_id) station_id,! municipality, sample_time, sample_value, point, validated, gid, sample_id! FROM rivm_lml.measurements_stations WHERE component = 'NO2' ORDER BY station_id, gid DESC;! " CREATE VIEW rivm_lml.v_last_measurements_O3 AS! SELECT DISTINCT ON (station_id) station_id,! municipality, sample_time, sample_value, point, validated, gid, sample_id! FROM rivm_lml.measurements_stations WHERE component = 'O3' ORDER BY station_id, gid DESC;! " .! .! " -- per component time-series measurements! CREATE VIEW rivm_lml.v_measurements_NO2 AS! SELECT station_id,! municipality, sample_time, sample_value, point, validated, gid, sample_id! FROM rivm_lml.measurements_stations WHERE component = 'NO2';! Services " WMS/WFS via VIEWs 3.  Services
  30. 30. Services " WMS/WFS via VIEWs 3.  Services Last Measurements for Ozone
  31. 31. 3.  Services Services" WMS/WFS WMS Time
  32. 32. 3.  Services Services" SOS • Using 52North SOS" • Easy setup via Tomcat deploy + Admin GUI" • Data population via SOS-T" " Service URL " http://sensors.geonovum.nl/sos/service?
  33. 33. 3.  Services Services -SOS
  34. 34. 4.  Clients Clients • WMS/WFS - “HeronViewer”" • SensorWebClient - 52North" • SOS.js - JavaScript - 52 North" " Links via " sensors.geonovum.nl
  35. 35. Clients - WMS/WFS - HeronViewer 4.  Clients
  36. 36. 4.  Clients Clients - SOS - SWClient - 52N
  37. 37. 4.  Clients Clients - SOS - SWClient - 52N
  38. 38. Clients - SOS - SOS.js - 52N 4.  Clients
  39. 39. Automated AQ Reporting
 Geonovum PoC using Web services with Stetl
  40. 40. AQ Reporting - Architecture 4.  Clients AQ ETL EU Database Database Web Services JSON Docs Dataflows B,C,D,E,F WFS SOS Custom
  41. 41. AQ Reporting - ETL 4.  Clients Stetl Dataflows B,C,D,E,F XML Docs XML Template Docs (Jinja2) Custom Python Stetl ETL Config Web Services WFS SOS Custom
  42. 42. # Example dataflow-D (Assessment Methods metadata) report generation using Stetl with Jinja2 templating filter. # The input data comes directly from a WFS providing station info.! # The template files and global variables (globals.json) are under templates folder.! #! # All rendered output under output/! #! [etl]! chains = input_json|dataflow-D_template | output_dataflow-D_file! " [input_json]! class = inputs.fileinput.JsonFileInput! file_path = http://sensors.geonovum.nl/gs/ows?service=WFS&request=GetFeature
 &typeName=sensors:active_stations&outputformat=JSON&srsName=EPSG:4326! " # Advanced gml templating with globals for more or less static content! # in rivm-globals.json like id-prefixes and contact info etc! [dataflow-D_template]! class = filters.templatingfilter.Jinja2TemplatingFilter! template_file = templates/dataflow-D.jinja2! template_globals_path = input/globals-rivm.json! " [output_dataflow-D_file]! class = outputs.fileoutput.FileOutput! file_path = output/dataflow-D.xml! Stetl Config - Dataflow D 4.  Clients ETL Chain WFS Input XML
 Template Output File
  43. 43. {"type": "FeatureCollection", "totalFeatures": 109, "features": [! {! "type": "Feature",! "id": "active_stations.fid-7d46fd2a_14864b87f63_17c8",! "geometry": {! "type": "Point",! "coordinates": [3.91694736, 51.63555908]! },! "geometry_name": "point",! "properties": {! "gid": 19,! "local_id": "STA-NL00301",! "natl_station_code": "301",! "eu_station_code": "NL00301",! "name": "Zierikzee-Lange Slikweg",! "municipality": "Schouwen-Duiveland",! "altitude": -1,! "altitude_unit": "m",! "area_classification": "http://dd.eionet.europa.eu/vocabulary/aq/areaclassification/rural",! "activity_begin": "1976-01-01T23:00:00Z",! "activity_end": null,! "version": "",! "zone_name": "Zuid",! "lon": "3.91694736",! "lat": "51.63555908",! "zone_code": "NL00300",! "pollutants": "NO,NO2,O3"! }! },! {! "type": "Feature",! "id": "active_stations.fid-7d46fd2a_14864b87f63_17c9",! "geometry": {! "type": "Point",! "coordinates": [5.85361385, 51.54111099]! Stetl Config - Dataflow D - WFS Data 4.  Clients
  44. 44. <!-- START STATIONS -->! {% for feature in features %}! <gml:featureMember>! <aqd:AQD_Station gml:id="{{ feature.properties.local_id }}">! <ef:inspireId>! {{ macros_inspire.render_inspire_id(globs.namespace, feature.properties.local_id) }}! </ef:inspireId>! <ef:name>{{ feature.properties.name }}</ef:name>! <ef:mediaMonitored xlink:href="http://inspire.ec.europa.eu/codeList/MediaValue/air"/>! <ef:geometry>! {% set gml_id = 'STA_G-%s' % feature.properties.local_id %}! {{ feature.geometry | geojson2gml(source_crs=crs, target_crs=4258, gml_id=gml_id, ml_format='GML3', gml_longsrs='YES') }}! </ef:geometry>! <ef:measurementRegime 
 xlink:href="http://inspire.ec.europa.eu/codeList/MeasurementRegimeValue/continuousDataCollection"/>! <ef:mobile>false</ef:mobile>! <ef:operationalActivityPeriod>! <ef:OperationalActivityPeriod gml:id="STA_P-{{ feature.properties.local_id }}">! <ef:activityTime>! <gml:TimePeriod gml:id="STA_T-{{ feature.properties.local_id }}">! <gml:beginPosition>{{ feature.properties.activity_begin }}</gml:beginPosition>! <gml:endPosition indeterminatePosition="unknown"/>! </gml:TimePeriod>! </ef:activityTime>! </ef:OperationalActivityPeriod>! </ef:operationalActivityPeriod>! <ef:belongsTo xlink:href="{{ globs.namespace }}/NET-NL010A"/>! <aqd:natlStationCode>{{ feature.properties.natl_station_code }}</aqd:natlStationCode>! <aqd:municipality>{{ feature.properties.municipality }}</aqd:municipality>! <aqd:EUStationCode>{{ feature.properties.local_id }}</aqd:EUStationCode>! <aqd:meteoParams xlink:href="{{ globs.dataflow_D.meteo_params }}"/>! <aqd:areaClassification xlink:href="{{ feature.properties.area_classification }}"/>! <aqd:altitude uom="{{ feature.properties.altitude_unit }}">{{ feature.properties.altitude }}</ qd:altitude>! Stetl Config - Dataflow D - Template 4.  Clients
  45. 45. AQ Reporting Status • Dataflows B,C,D more or less done • Main issue is lack of source data • See GitHub for code:
 https://github.com/Geonovum/sospilot/tree/ master/src/aq-report • Very quick way to develop, about one day per dataflow
  46. 46. AQ Reporting Recommendations • Store all relevant data in database(s) - PostgreSQL! • Expose data via web services:WFS, SOS, Custom • Let these web services provide JSON (i.s.o. XML) • Keep the SOS basic/let ETL do the AQ reporting • Use template substitution as ETL mechanism
  47. 47. Weather Station Geonovum Weather station - datastream integrated 
 into WMS/WFS and SOS
  48. 48. Architecture WMS WFS SOS SSH/PostgreSQL
  49. 49. Architecture Weather Communities Wunderground etc Davis Weather Station ETL 52N SOS Server GeoServer SOS WMS/WFS Weather Communities Wunderground etc Reports Web API
  50. 50. Architecture Archive Recs SQLite Stetl Sync weewx Weather Data PostGIS 52N SOS Data PostGIS Stetl SOS USB SOS-T 52N SOS Server GeoServer SOS WMS-T/WFS Weather Communities Wunderground etc Apache HTTP Server HTTP APIs Davis Weather Station rsync Weather Reports HTML Ubuntu Linux VPS SSHTun SSH
  51. 51. Result - Reporting
  52. 52. Result - Publish to Weather Community
  53. 53. Result - Publish to Weather Community
  54. 54. Result - WMS-Time/WFS
  55. 55. Result - SOS Integration
  56. 56. Demo 5.Demos
  57. 57. Discussion 6.  Discussion
  58. 58. Open Items/TODO 6.  Discussion • Source data" • http://www.lml.rivm.nl/xml or" • http://www.lml.rivm.nl/sos " • Stations info " • name attribute Eionet only municipality" • Standardize/Harmonize SOS Model Elements" • pollutant naming, codelists" • Time format (timezone) from source to SOS" • INSPIRE-related" • 2 Client-frameworks: SOS.js and SWC" • (Historical) weather data in WMS-T and SOS" " Tracked on https://github.com/Geonovum/sospilot/issues

×