diff --git a/workshop/content/docs/api-deep-dive/environmental-data-retrieval.md b/workshop/content/docs/api-deep-dive/environmental-data-retrieval.md index 406639b..aa59dd3 100644 --- a/workshop/content/docs/api-deep-dive/environmental-data-retrieval.md +++ b/workshop/content/docs/api-deep-dive/environmental-data-retrieval.md @@ -237,7 +237,7 @@ relation type. An extract from the landing page of a demo server is shown below. -``` json +```json { "title": "Environmental Data Retrevial API concept demonstrator", "description": "Example EDR API (not for operational use)", @@ -312,7 +312,7 @@ requirements specified in a standard. Below is an extract from the response to the request -``` json +```json { "conformsTo":[ "http://www.opengis.net/spec/ogcapi-common-1/1.0/conf/core", @@ -368,7 +368,7 @@ other information about the collection. Below is an extract from the response to the request -``` json +```json { "links": [ { @@ -847,7 +847,7 @@ reference systems, output formats, and parameter names. Below is an extract from the response to the request -``` json +```json { "id": "metar_demo", "title": "Metar observations EDR demonstrator", diff --git a/workshop/content/docs/api-deep-dive/features.md b/workshop/content/docs/api-deep-dive/features.md index 2d998a8..d4171e9 100644 --- a/workshop/content/docs/api-deep-dive/features.md +++ b/workshop/content/docs/api-deep-dive/features.md @@ -204,7 +204,7 @@ relation type. An extract from the landing page of a demo server is shown below. -``` json +```json { "title": "Daraa", "description": "This is a test dataset used in the Open Portrayal Framework thread in the OGC Testbed-15 as well as the OGC Vector Tiles Pilot Phase 2. The data is based on OpenStreetMap data from the region of Daraa, Syria, converted to the Topographic Data Store schema of NGA.", @@ -257,7 +257,7 @@ information provided by the resource. In this case the ```alternate``` link relation is referencing an HTML representation of the conformance declaration. -``` json +```json { "links": [ { @@ -285,7 +285,7 @@ There are conformance classes to provide the API definition using [Open API](htt This is an extract of an API definition, which uses Open API 3: -``` json +```json { "openapi" : "3.0.3", "info" : { @@ -383,7 +383,7 @@ collection: Below is an extract from the response to the request -``` json +```json { "title": "Daraa", "description": "This is a test dataset used in the Open Portrayal Framework thread in the OGC Testbed-15 as well as the OGC Vector Tiles Pilot Phase 2. The data is based on OpenStreetMap data from the region of Daraa, Syria, converted to the Topographic Data Store schema of NGA.", @@ -452,7 +452,7 @@ collection identified in a request. Below is an extract from the response to the request -``` json +```json { "title": "Aeronautic (Curves)", "description": "Aeronautical Facilities: Information about an area specifically designed and constructed for landing, accommodating, and launching military and/or civilian aircraft, rockets, missiles and/or spacecraft.
Aeronautical Aids to Navigation: Information about electronic equipment, housings, and utilities that provide positional information for direction or otherwise assisting in the navigation of airborne aircraft.", @@ -512,7 +512,7 @@ to the next page, if more features are selected than the page size. Below is an extract from the response to the request -``` json +```json { "type": "FeatureCollection", "numberReturned": 10, @@ -597,7 +597,7 @@ feature with an ```id``` of 1 is retrieved. The response is retrieved through the request -``` json +```json { "type": "Feature", "id": 1, diff --git a/workshop/content/docs/api-deep-dive/processes.md b/workshop/content/docs/api-deep-dive/processes.md index 41929ab..4380a12 100644 --- a/workshop/content/docs/api-deep-dive/processes.md +++ b/workshop/content/docs/api-deep-dive/processes.md @@ -142,7 +142,6 @@ the following table. /jobs/{jobID} Retrieves information about the status of a job. - Job results GET /jobs/{jobID}/results @@ -155,7 +154,7 @@ the following table. Retrieves the list of jobs. - Job Deletion + Job deletion DELETE /jobs/{jobID} Cancels and deletes a job. @@ -164,14 +163,312 @@ the following table. ### Example -This ZOO-Project [demonstration -server](http://tb17.geolabs.fr:8090/ogc-api/index.html) from OGC -Testbed-17 implements a variety of processing algorithms through an -interface that conforms to OGC API - Processes. +This [demonstration](https://demo.pygeoapi.io/master) server offers and executes various processes through an interface that conforms to OGC API - Processes. + +An example request that can be used to browse all the available processes can be found at . -The processes offered by the server can be browsed at - +Note that the response to the request is HTML in this case. + +Alternatively, the same data can be retrieved in GeoJSON format, through the request https://demo.pygeoapi.io/master/processes?f=json ## Resources -TODO +### Landing page + +Given OGC API - Processes uses OGC API - Common and OGC API - Features as building blocks, please see the [OGC API - Features](features.md#landing-page) deep dive +for a detailed explanation. + +### Conformance declarations + +Given OGC API - Processes uses OGC API - Common and OGC API - Features as building blocks, please see the [OGC API - Features](features.md#conformance-declarations) deep dive +for a detailed explanation. + +### API Definition + +Given OGC API - Processes OGC API - Common as a building block, please see the [OGC API - Features](features.md#api-definition) deep dive +for a detailed explanation of an example implementation. + +### Process list + +Processes offered through an implementation of **OGC API - Processes** are organized into one or more processes. The `/processes` +endpoint provides information about and access to the list of processes. + +For each process, there is a link to the detailed description of the +process (represented by the path **/processes/{processId}** and +link relation **self**). In addition, there are links for executing the +process as well as the list of jobs as a results of executing the process. + +Process information also includes whether the process can be run in synchronous +and / or asynchronous mode (job control options). Asynchronous mode is valuable +for executing long running jobs without blocking the HTTP request/response workflow. +This also means the client can check back for the status of the job as well as the +result once it is completed. + +Finally, there are definitions for the input structure required to run the process +(expressed as JSON Schema), as well as the output structure a client should expect +when receiving a response from the process execution. + +Below is an extract from the response to the request + + +```json +{ + "version": "0.2.0", + "id": "hello-world", + "title": "Hello World", + "description": "An example process that takes a name as input, and echoes it back as output. Intended to demonstrate a simple process with a single literal input.", + "jobControlOptions":[ + "sync-execute", + "async-execute" + ], + "keywords":[ + "hello world", + "example", + "echo" + ], + "links":[ + { + "type": "text/html", + "rel": "about", + "title": "information", + "href": "https://example.org/process", + "hreflang": "en-US" + }, + { + "type": "application/json", + "rel": "self", + "href": "https://demo.pygeoapi.io/master/processes/hello-world?f=json", + "title": "Process description as JSON", + "hreflang": "en-US" + }, + { + "type": "text/html", + "rel": "alternate", + "href": "https://demo.pygeoapi.io/master/processes/hello-world?f=html", + "title": "Process description as HTML", + "hreflang": "en-US" + }, + { + "type": "text/html", + "rel": "http://www.opengis.net/def/rel/ogc/1.0/job-list", + "href": "https://demo.pygeoapi.io/master/jobs?f=html", + "title": "jobs for this process as HTML", + "hreflang": "en-US" + }, + { + "type": "application/json", + "rel": "http://www.opengis.net/def/rel/ogc/1.0/job-list", + "href": "https://demo.pygeoapi.io/master/jobs?f=json", + "title": "jobs for this process as JSON", + "hreflang": "en-US" + }, + { + "type": "application/json", + "rel": "http://www.opengis.net/def/rel/ogc/1.0/execute", + "href": "https://demo.pygeoapi.io/master/processes/hello-world/execution?f=json", + "title": "Execution for this process as JSON", + "hreflang": "en-US" + } + ], + "inputs":{ + "name":{ + "title": "Name", + "description": "The name of the person or entity that you wish tobe echoed back as an output", + "schema":{ + "type": "string" + }, + "minOccurs":1, + "maxOccurs":1, + "metadata":null, + "keywords":[ + "full name", + "personal" + ] + }, + "message":{ + "title": "Message", + "description": "An optional message to echo as well", + "schema":{ + "type": "string" + }, + "minOccurs":0, + "maxOccurs":1, + "metadata":null, + "keywords":[ + "message" + ] + } + }, + "outputs":{ + "echo":{ + "title": "Hello, world", + "description": "A \"hello world\" echo with the name and (optional) message submitted for processing", + "schema":{ + "type": "object", + "contentMediaType": "application/json" + } + } + }, + "example":{ + "inputs":{ + "name": "World", + "message": "An optional message." + } + }, + "outputTransmission":[ + "value" + ] +} +``` + +### Process description + +The previous example demonstrated process information for all processes offered by an OGC API - Processes +server. To access process information for a single process, run the below request against the demo server: + + + +!!! note + Single process information requires the process identifier as part of the URL + +### Process execution + +Now that we have the appropriate process information, we can execute the process. Process execution +requires that requests are run using HTTP POST, with a payload as specified/required by the server (JSON). + +!!! note + Web browsers cannot easily make HTTP POST requests, so we use the [curl](https://curl.se) command. + You are welcome to use any tool that is able to execute HTTP POST requests per below. + +```bash +curl -X 'POST' \ + 'https://demo.pygeoapi.io/master/processes/hello-world/execution' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "inputs": { + "message": "Great to see you here", + "name": "OGC API workshop participant" + } +}' +``` + +The server will respond with an immediate response (synchronous mode by default) as per below: + +```json +{ + "id": "echo", + "value": "Hello OGC API workshop participant! Great to see you here" +} +``` + +To execute the same process in asynchronous mode, we need to add the **Prefer: respond-async** +HTTP header. As well, the response to an ascynchronous process execution is always empty, where +the HTTP **Location** header contains a URL to the resulting job information. + + +!!! note + We add the `-v` option to the curl command below to be able to inspect the response headers + +```bash +curl -v -X 'POST' \ + 'https://demo.pygeoapi.io/master/processes/hello-world/execution' \ + -H 'Prefer: respond-async' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "inputs": { + "message": "Great to see you here", + "name": "OGC API workshop participant" + } +}' +``` + +An extract of the response shows the **Location** (location) HTTP header: + +```bash +< HTTP/2 201 +< access-control-allow-origin: * +< content-language: en-US +< content-type: application/json +< date: Mon, 04 Dec 2023 16:33:06 GMT +< location: https://demo.pygeoapi.io/master/jobs/cdbc641c-92c2-11ee-9c88-0242ac120003 +< preference-applied: respond-async +< server: gunicorn +< x-powered-by: pygeoapi 0.16.dev0 +< content-length: 4 +``` + +!!! note + The URL of the `location` HTTP header will always be unique + +### Job status info + +Using the URL from the `location` HTTP header above, we can inspect the status of the job: + + + +```json +{ + "processID": "hello-world", + "jobID": "cdbc641c-92c2-11ee-9c88-0242ac120003", + "status": "successful", + "message": "Job complete", + "progress":100, + "parameters":null, + "job_start_datetime": "2023-12-04T16:33:06.806485Z", + "job_end_datetime": "2023-12-04T16:33:06.812615Z", + "links":[ + { + "href": "https://demo.pygeoapi.io/master/jobs/cdbc641c-92c2-11ee-9c88-0242ac120003/results?f=html", + "rel": "about", + "type": "text/html", + "title": "results of job cdbc641c-92c2-11ee-9c88-0242ac120003 as HTML" + }, + { + "href": "https://demo.pygeoapi.io/master/jobs/cdbc641c-92c2-11ee-9c88-0242ac120003/results?f=json", + "rel": "about", + "type": "application/json", + "title": "results of job cdbc641c-92c2-11ee-9c88-0242ac120003 as JSON" + } + ] +} +``` + +### Job results + +Here we see that the job is fully executed and complete, but does not contain the actual results. To inspect +the actual results, we use the link objects which provide the results accordingly: + + + +!!! note + We see that the the results of the synchronous and asynchronous request/responses are identical, and + that only the execution control is different. + + +### Job list + +In the same manner that an OGC API - Proceses server provides access to process information for all its +processes, the server provides the same for all of its jobs (from any process) using the following URL: + + + +### Job deletion + +If we wish to delete a given job, we can execute an HTTP DELETE request agains the the job ID. + +!!! note + Web browsers cannot easily make HTTP DELETE requests, so we use the [curl](https://curl.se) command. + You are welcome to use any tool that is able to execute HTTP DELETE requests per below. + +```bash +curl -X 'DELETE' https://demo.pygeoapi.io/master/jobs/cdbc641c-92c2-11ee-9c88-0242ac120003 +``` + +!!! note + Try running an HTTP GET on the job that was just deleted and verify that it no longer exists (HTTP 404). + +!!! note + Some servers may implement access control to prevent erroneous or unwanted deletion of a job or + other resource. diff --git a/workshop/content/docs/api-deep-dive/records.md b/workshop/content/docs/api-deep-dive/records.md index f00f85d..b84614d 100644 --- a/workshop/content/docs/api-deep-dive/records.md +++ b/workshop/content/docs/api-deep-dive/records.md @@ -191,11 +191,11 @@ illustrating a single record collection: ```json { - "id":"dutch-metadata", + "id": "dutch-metadata", "type": "Catalog", - "itemType":"record", - "title":"Sample metadata records from Dutch Nationaal georegister", - "description":"Sample metadata records from Dutch Nationaal georegister", + "itemType": "record", + "title": "Sample metadata records from Dutch Nationaal georegister", + "description": "Sample metadata records from Dutch Nationaal georegister", "keywords":[ "netherlands", "open data", @@ -203,16 +203,16 @@ illustrating a single record collection: ], "links":[ { - "type":"application/json", - "rel":"self", - "title":"This document as JSON", - "href":"https://demo.pygeoapi.io/master/collections/dutch-metadata?f=json" + "type": "application/json", + "rel": "self", + "title": "This document as JSON", + "href": "https://demo.pygeoapi.io/master/collections/dutch-metadata?f=json" }, { - "type":"application/geo+json", - "rel":"items", - "title":"items as GeoJSON", - "href":"https://demo.pygeoapi.io/master/collections/dutch-metadata/items?f=json" + "type": "application/geo+json", + "rel": "items", + "title": "items as GeoJSON", + "href": "https://demo.pygeoapi.io/master/collections/dutch-metadata/items?f=json" } ] } diff --git a/workshop/content/docs/api-deep-dive/sensorthings.md b/workshop/content/docs/api-deep-dive/sensorthings.md index d0b7a34..bc7a47b 100644 --- a/workshop/content/docs/api-deep-dive/sensorthings.md +++ b/workshop/content/docs/api-deep-dive/sensorthings.md @@ -153,9 +153,9 @@ station. ``` javascript {"@iot.count":2, "value":[ - {"@iot.id":4,"@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(4)","description":"A sensor for tracking how many docks are available in a bike station","name":"available_docks","encodingType":"text/plan","metadata":"https://member.bikesharetoronto.com/stations","Datastreams@iot.navigationLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(4)/Datastreams" + {"@iot.id":4,"@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(4)","description": "A sensor for tracking how many docks are available in a bike station","name": "available_docks","encodingType": "text/plan","metadata": "https://member.bikesharetoronto.com/stations","Datastreams@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(4)/Datastreams" }, - {"@iot.id":3,"@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(3)","description":"A sensor for tracking how many bikes are available in a bike station","name":"available_bikes","encodingType":"text/plan","metadata":"https://member.bikesharetoronto.com/stations","Datastreams@iot.navigationLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(3)/Datastreams" + {"@iot.id":3,"@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(3)","description": "A sensor for tracking how many bikes are available in a bike station","name": "available_bikes","encodingType": "text/plan","metadata": "https://member.bikesharetoronto.com/stations","Datastreams@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Sensors(3)/Datastreams" } ] } @@ -199,11 +199,11 @@ of the requested entity are presented in a JSON array. ``` javascript {"@iot.count":1594349, - "@iot.nextLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations?$top=100&$skip=100","value": + "@iot.nextLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations?$top=100&$skip=100","value": [ - {"@iot.id":1595550,"@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595550)","phenomenonTime":"2017-02-16T21:55:12.841Z","result":"7","resultTime":null,"Datastream@iot.navigationLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595550)/Datastream","FeatureOfInterest@iot.navigationLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595550)/FeatureOfInterest" + {"@iot.id":1595550,"@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595550)","phenomenonTime": "2017-02-16T21:55:12.841Z","result": "7","resultTime":null,"Datastream@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595550)/Datastream","FeatureOfInterest@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595550)/FeatureOfInterest" }, - {"@iot.id":1595551,"@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595551)","phenomenonTime":"2017-02-16T21:55:12.841Z","result":"4","resultTime":null,"Datastream@iot.navigationLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595551)/Datastream","FeatureOfInterest@iot.navigationLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595551)/FeatureOfInterest" + {"@iot.id":1595551,"@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595551)","phenomenonTime": "2017-02-16T21:55:12.841Z","result": "4","resultTime":null,"Datastream@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595551)/Datastream","FeatureOfInterest@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595551)/FeatureOfInterest" }, ... ] @@ -389,20 +389,20 @@ only the result and phenomenonTime properties listed. { "value":[ { - "name":"Things", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/Things" + "name": "Things", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/Things" }, { - "name":"Locations", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/Locations" + "name": "Locations", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/Locations" }, { - "name":"HistoricalLocations", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/HistoricalLocations" + "name": "HistoricalLocations", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/HistoricalLocations" }, { - "name":"Datastreams", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/Datastreams" + "name": "Datastreams", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/Datastreams" }, ``` @@ -410,20 +410,20 @@ only the result and phenomenonTime properties listed. ``` properties { - "name":"Sensors", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/Sensors" + "name": "Sensors", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/Sensors" }, { - "name":"Observations", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/Observations" + "name": "Observations", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/Observations" }, { - "name":"ObservedProperties", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/ObservedProperties" + "name": "ObservedProperties", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/ObservedProperties" }, { - "name":"FeaturesOfInterest", - "url":"http://pm25-march.singapore2017.sensorup.com/v1.0/FeaturesOfInterest" + "name": "FeaturesOfInterest", + "url": "http://pm25-march.singapore2017.sensorup.com/v1.0/FeaturesOfInterest" } ] } @@ -436,15 +436,15 @@ only the result and phenomenonTime properties listed. > ``` properties > { > "@iot.count":199, -> "@iot.nextLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/ +> "@iot.nextLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/ > Things?$top=100&$skip=100", > "value":[ > { > "@iot.id":206047, -> "@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Things(206047)", -> "description":"Bloor St / Brunswick Ave Toronto bike share station with data +> "@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Things(206047)", +> "description": "Bloor St / Brunswick Ave Toronto bike share station with data > of available bikes and available docks", -> "name":"7061:Bloor St / Brunswick Ave", +> "name": "7061:Bloor St / Brunswick Ave", > "properties":{ > > }, @@ -465,13 +465,13 @@ only the result and phenomenonTime properties listed. "http://toronto-bike-snapshot.sensorup.com/v1.0/Datastreams(206051)", "description": "... available docks count for the Toronto bike share station Bloor St ", - "name":"7061:Bloor St / Brunswick Ave:available_docks", + "name": "7061:Bloor St / Brunswick Ave:available_docks", "observationType": "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_CountObservation", "unitOfMeasurement":{ - "symbol":"{TOT}", - "name":"dock count", - "definition":"http://unitsofmeasure.org/ucum.html#para-50" + "symbol": "{TOT}", + "name": "dock count", + "definition": "http://unitsofmeasure.org/ucum.html#para-50" }, .... ``` @@ -483,9 +483,9 @@ only the result and phenomenonTime properties listed. > "observationType": > "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_CountObservation", > "unitOfMeasurement":{ - > "symbol":"{TOT}", - > "name":"dock count", - > "definition":"http://unitsofmeasure.org/ucum.html#para-50" + > "symbol": "{TOT}", + > "name": "dock count", + > "definition": "http://unitsofmeasure.org/ucum.html#para-50" > }, > ``` @@ -503,8 +503,8 @@ only the result and phenomenonTime properties listed. "@iot.id":1595467, "@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595467)", - "phenomenonTime":"2017-02-16T21:55:12.233Z", - "result":"23", + "phenomenonTime": "2017-02-16T21:55:12.233Z", + "result": "23", "resultTime":null, "Datastream@iot.navigationLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595467)/Datastream", @@ -540,26 +540,26 @@ only the result and phenomenonTime properties listed. > "value":[ > { > "@iot.id":5, -> "@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Things(5)", +> "@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Things(5)", > "description": > "Ft. York / Capreol Crt. Toronto bike share station available bikes and docks", -> "name":"7000:Ft. York / Capreol Crt.", +> "name": "7000:Ft. York / Capreol Crt.", > "properties":{ > > }, > "Datastreams":[ > { > "@iot.id":9, -> "@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Datastreams(9)", +> "@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Datastreams(9)", > "description": > "...available docks count for the Toronto bike share station Ft. York / Capreol Crt.", -> "name":"7000:Ft. York / Capreol Crt.:available_docks", +> "name": "7000:Ft. York / Capreol Crt.:available_docks", > "observationType": > "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_CountObservation", > "unitOfMeasurement":{ -> "symbol":"{TOT}", -> "name":"dock count", -> "definition":"http://unitsofmeasure.org/ucum.html#para-50" +> "symbol": "{TOT}", +> "name": "dock count", +> "definition": "http://unitsofmeasure.org/ucum.html#para-50" > }, > ``` @@ -571,16 +571,16 @@ only the result and phenomenonTime properties listed. > "Observations":[ > { > "@iot.id":1595545, -> "@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595545)", -> "phenomenonTime":"2017-02-16T21:55:12.797Z", -> "result":"10", +> "@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/Observations(1595545)", +> "phenomenonTime": "2017-02-16T21:55:12.797Z", +> "result": "10", > "resultTime":null, > "Datastream@iot.navigationLink": > ".... /v1.0/Observations(1595545)/Datastream", > "FeatureOfInterest":{ > "@iot.id":10, -> "@iot.selfLink":"http://toronto-bike-snapshot.sensorup.com/v1.0/FeaturesOfInterest(10)", -> "description":" ... +> "@iot.selfLink": "http://toronto-bike-snapshot.sensorup.com/v1.0/FeaturesOfInterest(10)", +> "description": " ... > ``` ## References @@ -592,4 +592,4 @@ things](http://www.itu.int/ITU-T/recommendations/rec.aspx?rec=y.2060) ## Summary -The OGC SensorThings API provides an open and unified way to interconnect IoT devices, data, and applications over the Web. It builds on Web protocols and the OGC Sensor Web Enablement standards, and applies an easy-to-use REST-like style. This deep dive provides an overview of the entities and main operations made available by this standard. \ No newline at end of file +The OGC SensorThings API provides an open and unified way to interconnect IoT devices, data, and applications over the Web. It builds on Web protocols and the OGC Sensor Web Enablement standards, and applies an easy-to-use REST-like style. This deep dive provides an overview of the entities and main operations made available by this standard. diff --git a/workshop/content/docs/api-deep-dive/tiles.md b/workshop/content/docs/api-deep-dive/tiles.md index 3e6a51d..6709ae8 100644 --- a/workshop/content/docs/api-deep-dive/tiles.md +++ b/workshop/content/docs/api-deep-dive/tiles.md @@ -295,7 +295,7 @@ This endpoint retrieves a list of links to the descriptions of the tile matrix s As an example, we can see an extract of the response to this request: -``` json +```json "tileMatrixSets": [ { "title": "Google Maps Compatible for the World", @@ -569,4 +569,4 @@ You can see [here](https://maps.gnosis.earth/ogcapi/collections/blueMarble/map/t ## Summary -OGC API - Tiles specifies a standard for Web APIs that provide tiles of geospatial information. Different forms of geospatial information are supported, such as tiles of vector features ("vector tiles"), coverages, maps (or imagery) and potentially eventually additional types of tiles of geospatial information. This deep dive provided an overview of the standard and the various Resources and endpoints that are supported. \ No newline at end of file +OGC API - Tiles specifies a standard for Web APIs that provide tiles of geospatial information. Different forms of geospatial information are supported, such as tiles of vector features ("vector tiles"), coverages, maps (or imagery) and potentially eventually additional types of tiles of geospatial information. This deep dive provided an overview of the standard and the various Resources and endpoints that are supported.