diff --git a/workshop/content/docs/advanced/bridges.md b/workshop/content/docs/advanced/bridges.md index 2dfd5f5d..a8e5da7e 100644 --- a/workshop/content/docs/advanced/bridges.md +++ b/workshop/content/docs/advanced/bridges.md @@ -1,10 +1,10 @@ --- -title: Exercise 8 - pygeoapi as a Bridge to Other Services +title: Exercise 8 - pygeoapi as a bridge to other services --- -# Exercise 8 - pygeoapi as a Bridge to Other Services +# Exercise 8 - pygeoapi as a bridge to other services -In this section we explore how pygeoapi can be used as a facade, or a bridge, to re-publish web services with different interfaces. These bridges can help [organisations migrating from OWS to OGC API](https://ogcapi-workshop.ogc.org/transition-and-migration/). +In this section we explore how pygeoapi can be used as a facade, or a bridge, to re-publish web services with different interfaces. These bridges can help [organisations migrating from OWS to OGC API](https://ogcapi-workshop.ogc.org/transition-and-migration). ## Publishing WFS as OGC API - Features @@ -64,7 +64,7 @@ a wider audience. Let's set up an API on top of an existing WFS hosted by the ci layer: territorio:suol_epicentri_storici ``` -Save the file and restart Docker Compose. Navigate to `http://localhost:5000/collections` +Save the file and restart Docker Compose. Navigate to to evaluate whether the new dataset has been published. Note these important configuration slices under `providers`: @@ -136,9 +136,9 @@ We can use the pygeoapi's WMSFacade provider to publish OGC Web Map Service (WMS Run the following requests in your web browser: -- default map: [http://localhost:5000/collections/wms-facade-demo/map?f=png](http://localhost:5000/collections/wms-facade-demo/map?f=png) -- specific width/height: [http://localhost:5000/collections/wms-facade-demo/map?f=png&width=800&height=600](http://localhost:5000/collections/wms-facade-demo/map?f=png&width=800&height=600) -- specific area of interest (bbox of Canada): [http://localhost:5000/collections/wms-facade-demo/map?f=png&width=800&height=600](http://localhost:5000/collections/wms-facade-demo/map?f=png&bbox=-142,42,-52,84) +- default map: +- specific width/height: +- specific area of interest (bbox of Canada): ![](../assets/images/maps-response.png){ width=80% } @@ -148,7 +148,7 @@ Run the following requests in your web browser: ## Publishing CSW as OGC API - Records -In this section we'll have a look at how to publish Catalogue Services for the Web (CSW) as OGC API - Records. For that, we will use the [pycsw OGC CITE demo](https://demo.pycsw.org/cite/) CSW service. +In this section we'll have a look at how to publish Catalogue Service for the Web (CSW) as OGC API - Records. For that, we will use the [pycsw OGC CITE demo](https://demo.pycsw.org/cite/) CSW service. !!! question "Update the pygeoapi configuration" @@ -225,4 +225,4 @@ In this section we'll have a look at how to Publish a SensorThings API `Thing` a name: SensorThings data: https://toronto-bike-snapshot.sensorup.com/v1.0/ entity: Things - ``` \ No newline at end of file + ``` diff --git a/workshop/content/docs/advanced/crs.md b/workshop/content/docs/advanced/crs.md index a5aaa928..783b61fe 100644 --- a/workshop/content/docs/advanced/crs.md +++ b/workshop/content/docs/advanced/crs.md @@ -101,11 +101,11 @@ We can even do this in the Swagger UI, but using the browser is quite fast and c !!! question "Collection Metadata" Open the URL: - [http://localhost:5000/collections/firenze-terrains-vec](http://localhost:5000/collections/firenze-terrains-vec) + Your configured CRSs are displayed at the bottom of the page: "Reference Systems" and "Storage CRS". See these in JSON format, also at the bottom: - http://localhost:5000/collections/firenze-terrains-vec?f=json + ```yaml . . @@ -124,7 +124,7 @@ We can even do this in the Swagger UI, but using the browser is quite fast and c !!! question "Using the CRS query parameter" Open the URL: - [http://localhost:5000/collections/firenze-terrains-vec/items?f=json&crs=http://www.opengis.net/def/crs/EPSG/0/4258](http://localhost:5000/collections/firenze-terrains-vec/items?f=json&crs=http://www.opengis.net/def/crs/EPSG/0/4258) + This is ETRS89, similar to WGS84, but for the European Continent (Datum) and in lat,lon order. This is e.g. used in INSPIRE. diff --git a/workshop/content/docs/assets/images/oaproc-squared-1.png b/workshop/content/docs/assets/images/oaproc-squared-1.png new file mode 100644 index 00000000..cf79492c Binary files /dev/null and b/workshop/content/docs/assets/images/oaproc-squared-1.png differ diff --git a/workshop/content/docs/assets/images/oaproc-squared-2.png b/workshop/content/docs/assets/images/oaproc-squared-2.png new file mode 100644 index 00000000..6fa330ea Binary files /dev/null and b/workshop/content/docs/assets/images/oaproc-squared-2.png differ diff --git a/workshop/content/docs/assets/images/oaproc-squared-3.png b/workshop/content/docs/assets/images/oaproc-squared-3.png new file mode 100644 index 00000000..502ac46b Binary files /dev/null and b/workshop/content/docs/assets/images/oaproc-squared-3.png differ diff --git a/workshop/content/docs/publishing/first.md b/workshop/content/docs/publishing/first.md index 4e63ab42..0417c1b5 100644 --- a/workshop/content/docs/publishing/first.md +++ b/workshop/content/docs/publishing/first.md @@ -38,7 +38,7 @@ To test: docker-compose up ``` - 1. Open `http://localhost:5000` in your browser, verify some collections + 1. Open in your browser, verify some collections 1. Close by typing `CTRL-C` !!! note @@ -145,7 +145,7 @@ we have also mounted (made available) the entire local directory `./data`. 1. Start by typing `docker-compose up` 1. Observe logging output - 1. If no errors: open http://localhost:5000 + 1. If no errors: open 1. Look for the Point of interest collection 1. Browse through the items of the collection 1. Check the json representation by adding ?f=json to url (or click 'json' in top right) diff --git a/workshop/content/docs/publishing/index.md b/workshop/content/docs/publishing/index.md index 0f3c34ae..b9a0684e 100644 --- a/workshop/content/docs/publishing/index.md +++ b/workshop/content/docs/publishing/index.md @@ -6,7 +6,7 @@ title: Publishing data !!! note - Ensure that you have pygeoapi setup and can navigate the default configuration and service (`http://localhost:5000`). + Ensure that you have pygeoapi setup and can navigate the default configuration and service running at . In this section, you will learn how to publish different types of geospatial data and metadata through the following exercises: @@ -17,4 +17,6 @@ through the following exercises: - [Exercise 4 - Tiles of geospatial data via OGC API - Tiles](ogcapi-tiles.md) - [Exercise 5 - Maps of geospatial data via OGC API - Maps](ogcapi-maps.md) - [Exercise 6 - Metadata via OGC API - Records](ogcapi-records.md) -- [Exercise 7 - Environmental data via OGC - Environmental Data Retrieval](ogcapi-edr.md) +- [Exercise 7 - Environmental data via OGC API - Environmental Data Retrieval](ogcapi-edr.md) +- [Exercise 8 - Functions via OGC API - Processes](ogcapi-processes.md) +- [Exercise 9 - Functions via OGC API - Processes](ogcapi-processes.md) diff --git a/workshop/content/docs/publishing/ogcapi-coverages.md b/workshop/content/docs/publishing/ogcapi-coverages.md index 2c734834..8d6cb099 100644 --- a/workshop/content/docs/publishing/ogcapi-coverages.md +++ b/workshop/content/docs/publishing/ogcapi-coverages.md @@ -70,7 +70,7 @@ You can now add `53_ED1_G.tif` to pygeoapi: The rasterio provider `format.name` directive **requires** a valid [GDAL raster driver short name](https://gdal.org/drivers/raster/index.html) -Save the configuration and restart Docker Compose. Navigate to `http://localhost:5000/collections` to evaluate whether the new dataset has been published. +Save the configuration and restart Docker Compose. Navigate to to evaluate whether the new dataset has been published. ## Client access diff --git a/workshop/content/docs/publishing/ogcapi-edr.md b/workshop/content/docs/publishing/ogcapi-edr.md index 85279843..a6089744 100644 --- a/workshop/content/docs/publishing/ogcapi-edr.md +++ b/workshop/content/docs/publishing/ogcapi-edr.md @@ -1,8 +1,8 @@ --- -title: Exercise 7 - Environmental data via OGC - Environmental Data Retrieval +title: Exercise 7 - Environmental data via OGC API - Environmental Data Retrieval --- -# Exercise 7 - Environmental data via OGC - Environmental Data Retrieval +# Exercise 7 - Environmental data via OGC API - Environmental Data Retrieval [OGC API - Environmental Data Retrieval](https://ogcapi.ogc.org/edr) provides a Web API to access environmental data using well defined query patterns: @@ -63,7 +63,7 @@ Let's try publishing some ICOADS data via the EDR xarray plugin. The sample ICOA mimetype: application/x-netcdf ``` -Save the configuration and restart Docker Compose. Navigate to `http://localhost:5000/collections` to evaluate whether the new dataset has been published. +Save the configuration and restart Docker Compose. Navigate to to evaluate whether the new dataset has been published. At first glance, the `icoads-sst` collection appears as a normal OGC API - Coverages collection. Let's look a bit closer at the colleciton description: diff --git a/workshop/content/docs/publishing/ogcapi-features.md b/workshop/content/docs/publishing/ogcapi-features.md index 58e6aac1..d5c3d9b7 100644 --- a/workshop/content/docs/publishing/ogcapi-features.md +++ b/workshop/content/docs/publishing/ogcapi-features.md @@ -76,7 +76,7 @@ Let's add the file `workshop/exercises/data/osm_places_kosovo.gpkg`: table: gis_osm_places_free_1 # table name within gpkg ``` -Save the file and restart Docker Compose. Navigate to `http://localhost:5000/collections` to evaluate whether the new dataset with +Save the file and restart Docker Compose. Navigate to to evaluate whether the new dataset with title *"Places in Kosovo 2023"* has been published. !!! note diff --git a/workshop/content/docs/publishing/ogcapi-processes.md b/workshop/content/docs/publishing/ogcapi-processes.md new file mode 100644 index 00000000..1ede0771 --- /dev/null +++ b/workshop/content/docs/publishing/ogcapi-processes.md @@ -0,0 +1,70 @@ +--- +title: Exercise 8 - Functions via OGC API - Processes +--- + +# Exercise 8 - Functions via OGC API - Processes + +[OGC API - Processes](https://ogcapi.ogc.org/processes) supports the wrapping of computational tasks into +executable processes that can be offered by a server through a Web API and be invoked by a client application. + +* [OGC API - Processes: Part 1: Core](https://docs.ogc.org/is/18-062r2/18-062r2.html) + +OGC API - Processes uses OGC API - Common as a building block, thus enabling streamlined deployment and integration +for clients and users. + +## pygeoapi support + +pygeoapi supports the OGC API - Processes specification, with the ability to publish Python code (no matter how +simple or complex) as an OGC API Process definition. pygeoapi also support synchronous or asynchronous processing, +with the ability to store and retrive the status/results of 'jobs'. + +!!! note + + See [the official documentation](https://docs.pygeoapi.io/en/latest/data-publishing/ogcapi-processes.html) for more information + on publishing processes in pygeoapi + + +## Publishing Python code as a process in pygeoapi + +With pygeoapi we can setup OGC API - Processes using Python code that implements the pygeoapi `BaseProcessor`, which is a core pygeoapi +abstract base class. In this exercise we will implemented a "squared" function as a process using the sample Python code in +`workshop/exercises/plugins/process/squared.py`. The process is already defined to be part of the pygeoapi environment and configuration. + +!!! question "Update the pygeoapi configuration" + + Open the pygeoapi configuration file in a text editor. Add a new process section as follows: + +``` {.yaml linenums="1"} + squared: + type: process + processor: + name: pygeoapi.process.squared.SquaredProcessor +``` + +!!! question "Update Python code" + + Open the Python code at `workshop/exercises/plugins/process/squared.py`. Find the `execute` function and update the Python + code to calculate the input value squared. + + +Save the configuration and restart Docker Compose. Navigate to to evaluate whether the new process has +been published. Inspect the detailed process metadata by navigating to to inspect how the process +metadata defined in the Python code/file is made available in JSON.. + +## Client access + +### Swagger + +The easiest way to test the new process is by using pygeoapi's built in Swagger interface. Navigate to and try out +the process in the Swagger UI. + +![Squared function process execution](../assets/images/oaproc-squared-1.png){ width=120% } + +![Squared function process execution](../assets/images/oaproc-squared-2.png){ width=120% } + +![Squared function process execution](../assets/images/oaproc-squared-3.png){ width=120% } + + +# Summary + +Congratulations! You are now able to publish Python code as a process to pygeoapi. diff --git a/workshop/content/docs/publishing/ogcapi-records.md b/workshop/content/docs/publishing/ogcapi-records.md index 31f83fb1..ff334749 100644 --- a/workshop/content/docs/publishing/ogcapi-records.md +++ b/workshop/content/docs/publishing/ogcapi-records.md @@ -59,7 +59,7 @@ Catalogue backend. We will use the sample catalogue in `workshop/exercises/data/ title_field: title ``` -Save the configuration and restart Docker Compose. Navigate to `http://localhost:5000/collections` to evaluate whether the new dataset has been published. +Save the configuration and restart Docker Compose. Navigate to to evaluate whether the new dataset has been published. ## Metadata formats diff --git a/workshop/content/docs/publishing/ogcapi-tiles.md b/workshop/content/docs/publishing/ogcapi-tiles.md index d134bd18..a70976cc 100644 --- a/workshop/content/docs/publishing/ogcapi-tiles.md +++ b/workshop/content/docs/publishing/ogcapi-tiles.md @@ -98,12 +98,12 @@ tippecanoe --output-to-directory=/data/tiles/ --force --maximum-zoom=16 --drop-d mimetype: application/vnd.mapbox-vector-tile ``` -Save the file and restart Docker Compose. Navigate to `http://localhost:5000/collections` to evaluate whether the new dataset has been published. +Save the file and restart Docker Compose. Navigate to to evaluate whether the new dataset has been published. Additional check for the following tile specific endpoints in the `Hyderabad` collection: -- tile links in [http://localhost:5000/collections/hyderabad/tiles](http://localhost:5000/collections/hyderabad/tiles) -- tile metadata in [http://localhost:5000/collections/hyderabad/tiles/WorldCRS84Quad/metadata](http://localhost:5000/collections/hyderabad/tiles/WorldCRS84Quad/metadata) +- tile links in +- tile metadata in ![TileSet](../assets/images/vtiles-hyderabad.png) @@ -188,9 +188,9 @@ QGIS supports OGC API Vector Tiles via the [Vector Tiles Layer](https://docs.qgi Before entering QGIS, access your pygeoapi installation page on the browser and follow these steps. - - access the collection page of the tiles dataset: `http://localhost:5000/collections/Hyderabad` - - navigate to the tiles page by clicking on `tiles`: `http://localhost:5000/collections/Hyderabad/tiles` - - click in `Tiles metadata in tilejson format`: `http://localhost:5000/collections/Cycle/Hyderabad/WorldCRS84Quad/metadata` + - access the collection page of the tiles dataset: + - navigate to the tiles page by clicking on `tiles`: + - click in `Tiles metadata in tilejson format`: `http://localhost:5000/collections/Cycle/Hyderabad/WorldCRS84Quad/metadata> - note the URL in `tiles`: `http://localhost:5000/collections/Hyderabad/tiles/WorldCRS84Quad/{tileMatrix}/{tileRow}/{tileCol}?f=mvt` and of the values of minZoom and maxZoom Follow these steps to connect to a service and access vector tiles: diff --git a/workshop/content/docs/setup.md b/workshop/content/docs/setup.md index 3078709e..9498ac23 100644 --- a/workshop/content/docs/setup.md +++ b/workshop/content/docs/setup.md @@ -150,7 +150,7 @@ data is a one-liner. -That's all! Open your browser and navigate to `http://localhost:5000`, the pygeoapi page will display. +That's all! Open your browser and navigate to , the pygeoapi page will display. As part of the initial `docker run`, Docker will download the pygeoapi Docker Image from [Docker hub](https://hub.Docker.com/r/geopython/pygeoapi). This may take some time, as the Docker image includes all dependencies (such as GDAL, etc.). Be patient! This is a one-time download for the entire workshop, or you may want to do this beforehand. @@ -200,7 +200,7 @@ within the container by a local file which you can edit in your favourite text e ``` - At this point, navigate to `http://localhost:5000` to verify the new title and description. + At this point, navigate to to verify the new title and description. By using a Docker volume mount (`-v` option), Docker attaches or 'mounts' a diff --git a/workshop/content/mkdocs.yml b/workshop/content/mkdocs.yml index 3051aac6..6dd7fea6 100644 --- a/workshop/content/mkdocs.yml +++ b/workshop/content/mkdocs.yml @@ -17,7 +17,8 @@ nav: - Exercise 4 - Tiles of geospatial data via OGC API - Tiles: publishing/ogcapi-tiles.md - Exercise 5 - Maps of geospatial data via OGC API - Maps: publishing/ogcapi-maps.md - Exercise 6 - Metadata via OGC API - Records: publishing/ogcapi-records.md - - Exercise 7 - Environmental data via OGC - Environmental Data Retrieval: publishing/ogcapi-edr.md + - Exercise 7 - Environmental data via OGC API - Environmental Data Retrieval: publishing/ogcapi-edr.md + - Exercise 8 - Functions via OGC API - Processes: publishing/ogcapi-processes.md - Advanced topics: - advanced/index.md - Multilingual support: advanced/i18n.md @@ -29,7 +30,7 @@ nav: - Semantic Web and Linked Data: advanced/semantic-web-linked-data.md - Cloud deployment: advanced/cloud.md - INSPIRE support: advanced/inspire.md - - Exercise 8 - pygeoapi as a Bridge to Other Services: advanced/bridges.md + - Exercise 9 - pygeoapi as a bridge to other services: advanced/bridges.md - Conclusion: conclusion.md use_directory_urls: true diff --git a/workshop/exercises/README.md b/workshop/exercises/README.md index 1b2f5ec8..cad6398b 100644 --- a/workshop/exercises/README.md +++ b/workshop/exercises/README.md @@ -9,7 +9,7 @@ To start Docker Compose, from `workshop/exercises`, run the following command: docker-compose up -d ``` -This will start a Docker container with pygeoapi (reachable from the browser at [this address](http://localhost:5000/)). +This will start a Docker container with pygeoapi (reachable from the browser at ). To stop, use the command: diff --git a/workshop/exercises/docker-compose.yml b/workshop/exercises/docker-compose.yml index be230d87..6c66de81 100644 --- a/workshop/exercises/docker-compose.yml +++ b/workshop/exercises/docker-compose.yml @@ -45,3 +45,4 @@ services: volumes: - ./pygeoapi.config.yml:/pygeoapi/local.config.yml # - ./data:/data # Exercise 1 - First - Ready to pull data from here + - ./plugins/process/squared.py:/pygeoapi/pygeoapi/process/squared.py # Exercise 8 diff --git a/workshop/exercises/plugins/process/squared.py b/workshop/exercises/plugins/process/squared.py new file mode 100644 index 00000000..1b065eb6 --- /dev/null +++ b/workshop/exercises/plugins/process/squared.py @@ -0,0 +1,125 @@ +# ================================================================= +# +# Authors: Tom Kralidis +# +# Copyright (c) 2023 Tom Kralidis +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# ================================================================= + +import logging + +from pygeoapi.process.base import BaseProcessor, ProcessorExecuteError + + +LOGGER = logging.getLogger(__name__) + +#: Process metadata and description +PROCESS_METADATA = { + 'version': '0.1.0', + 'id': 'squared', + 'title': { + 'en': 'Squared processor' + }, + 'description': { + 'en': 'An example process that takes a number or integer and returns ' + 'the squared result' + }, + 'jobControlOptions': ['sync-execute', 'async-execute'], + 'keywords': ['squared'], + 'links': [{ + 'type': 'text/html', + 'rel': 'about', + 'title': 'information', + 'href': 'https://example.org/process', + 'hreflang': 'en-US' + }], + 'inputs': { + 'number-or-integer': { + 'title': 'Number', + 'description': 'number or integer', + 'schema': { + 'oneOf': ['number', 'integer'], + }, + 'minOccurs': 1, + 'maxOccurs': 1, + 'metadata': None, # TODO how to use? + 'keywords': ['number'] + } + }, + 'outputs': { + 'squared': { + 'title': 'Squared', + 'description': 'An example process that takes a number or ' + 'integer and returns the squared result', + 'schema': { + 'type': 'object', + 'contentMediaType': 'application/json' + } + } + }, + 'example': { + 'inputs': { + 'number-or-integer': 3 + } + } +} + + +class SquaredProcessor(BaseProcessor): + """Squared Processor example""" + + def __init__(self, processor_def): + """ + Initialize object + + :param processor_def: provider definition + + :returns: pygeoapi.process.squared.SquaredProcessor + """ + + super().__init__(processor_def, PROCESS_METADATA) + + def execute(self, data): + + value = None + mimetype = 'application/json' + number_or_integer = data.get('number-or-integer') + + if number_or_integer is None: + raise ProcessorExecuteError('Cannot process without input') + + # EXERCISE 8: fill in code to calculate the number or integer squared + # and save to the "value" variable (that is defined as "None" at the + # top of this function) + # tip: ensure the input is indeed a number or integer! + + outputs = { + 'id': 'squared', + 'value': value + } + + return mimetype, outputs + + def __repr__(self): + return f' {self.name}' diff --git a/workshop/exercises/pygeoapi.config.yml b/workshop/exercises/pygeoapi.config.yml index eb64ce8c..6c279e8c 100644 --- a/workshop/exercises/pygeoapi.config.yml +++ b/workshop/exercises/pygeoapi.config.yml @@ -48,6 +48,10 @@ server: url: https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png attribution: 'Wikimedia maps | Map data © OpenStreetMap contributors' ogc_schemas_location: /schemas.opengis.net + manager: + name: TinyDB + connection: /tmp/pygeoapi-process-manager.db + output_dir: /tmp/ logging: level: ERROR @@ -55,7 +59,7 @@ logging: metadata: identification: - title: pygeoapi default instance + title: Diving into pygeoapi default instance description: pygeoapi provides an API to geospatial data keywords: - geospatial @@ -63,7 +67,7 @@ metadata: - api keywords_type: theme terms_of_service: https://creativecommons.org/licenses/by/4.0/ - url: https://github.com/geopython/pygeoapi + url: https://dive.pygeoapi.io license: name: CC-BY 4.0 license url: https://creativecommons.org/licenses/by/4.0/ @@ -71,19 +75,19 @@ metadata: name: pygeoapi Development Team url: https://pygeoapi.io contact: - name: Kralidis, Tom - position: Lead Dev - address: Mailing Address - city: City - stateorprovince: Administrative Area - postalcode: Zip or Postal Code - country: Canada + name: pygeoapi Development Team + position: pygeoapi Development Team + address: 9450 SW Gemini Dr. #42523 + city: Beaverton + stateorprovince: Oregon + postalcode: 97008 + country: United States of America phone: +xx-xxx-xxx-xxxx fax: +xx-xxx-xxx-xxxx - email: you@example.org - url: Contact URL - hours: Hours of Service - instructions: During hours of service. Off on weekends. + email: pygeoapi@gmail.com + url: https://pygeoapi.io + hours: 24/7 + instructions: During hours of service. role: pointOfContact resources: @@ -378,7 +382,7 @@ resources: # title_field: title ## END - EXERCISE 6 - Metadata -## START EXERCISE 7 - Environmental data via OGC - Environmental Data Retrieval +## START EXERCISE 7 - Environmental data via OGC API - Environmental Data Retrieval # icoads-sst: # type: collection # title: International Comprehensive Ocean-Atmosphere Data Set (ICOADS) @@ -407,9 +411,22 @@ resources: # format: # name: NetCDF # mimetype: application/x-netcdf -## END EXERCISE 7 - Environmental data via OGC - Environmental Data Retrieval +## END EXERCISE 7 - Environmental data via OGC API - Environmental Data Retrieval + + hello-world: + type: process + processor: + name: HelloWorld -## START - EXERCISE 8 - WFS Proxy +## START EXERCISE 8 - Functions via OGC API - Processes + # squared: + # type: process + # processor: + # name: pygeoapi.process.squared.SquaredProcessor +## END EXERCISE 8 - Functions via OGC API - Processes + + +## START - EXERCISE 9 - WFS Proxy # suol_epicentri_storici: # type: collection # title: Epicenters of the main historical earthquakes @@ -449,9 +466,9 @@ resources: # storage_crs: http://www.opengis.net/def/crs/EPSG/0/3003 # title_field: d # layer: territorio:suol_epicentri_storici -## END - EXERCISE 8 - WFS Proxy +## END - EXERCISE 9 - WFS Proxy -## START - EXERCISE 8 - WMS Proxy +## START - EXERCISE 9 - WMS Proxy # wms-facade-demo: # type: collection # title: WMS Facade demo @@ -478,9 +495,9 @@ resources: # format: # name: png # mimetype: image/png -## END - EXERCISE 8 - WMS Proxy +## END - EXERCISE 9 - WMS Proxy -## START - EXERCISE 8 - CSW Proxy +## START - EXERCISE 9 - CSW Proxy # cite_demo: # type: collection # title: pycsw OGC CITE demo and Reference Implementation @@ -501,9 +518,9 @@ resources: # id_field: identifier # time_field: datetime # title_field: title -## END - EXERCISE 8 - CSW Proxy +## END - EXERCISE 9 - CSW Proxy -## START - EXERCISE 8 - SensorThings Proxy +## START - EXERCISE 9 - SensorThings Proxy # toronto_bikes: # type: collection # title: Toronto Bikes SensorThings @@ -519,9 +536,4 @@ resources: # name: SensorThings # data: https://toronto-bike-snapshot.sensorup.com/v1.0/ # entity: Things -## END - EXERCISE 8 - SensorThings Proxy - - # hello-world: - # type: process - # processor: - # name: HelloWorld +## END - EXERCISE 9 - SensorThings Proxy