diff --git a/api/joins/index.html b/api/joins/index.html
new file mode 100644
index 0000000..9313b6b
--- /dev/null
+++ b/api/joins/index.html
@@ -0,0 +1,24 @@
+
+
+
+ ReDoc
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/api/joins/openapi.yaml b/api/joins/openapi.yaml
new file mode 100644
index 0000000..6dc541c
--- /dev/null
+++ b/api/joins/openapi.yaml
@@ -0,0 +1,845 @@
+openapi: 3.0.1
+info:
+ title: 'Example for OGC API - Joins - Part 1: Core service'
+ description: 'This is an example an API definition conforming to the OGC API - Joins - Part 1: Core candidate Standard.'
+ contact:
+ name: Pekka Latvala
+ email: pekka.latvala@nls.fi
+ license:
+ name: OGC License
+ x-logo:
+ url: 'https://www.ogc.org/pub/www/files/OGC_Logo_2D_Blue_x_0_0.png'
+ version: 1.0.0-draft20240927
+paths:
+ /:
+ get:
+ summary: Landing page of the OGC API - Joins
+ description: 'The landing page provides links to the API definition, the conformance
+ statements, the feature collections and to the created joins. The landing
+ page conforms to OGC API - Common - Part 1: Core'
+ operationId: landingPage
+ responses:
+ 200:
+ description: Links to the API definition, the conformance statements, the
+ feature collections and to the created joins.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/LandingPageResponseObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /conformance:
+ get:
+ summary: Declaration of conformance classes of OGC API - Joins implementation
+ description: 'Conformance classes of OGC API - Joins implementation. The response
+ conforms OGC API - Common - Part 1: Core.'
+ operationId: conformance
+ responses:
+ 200:
+ description: List of the conformance lasses that the API conforms to.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConformanceResponseObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /collections:
+ get:
+ summary: Get list of all available collections.
+ description: Get a list of all available collections.
+ operationId: collections
+ parameters:
+ - name: bbox
+ in: query
+ description: Filtes collections by bbox
+ required: false
+ schema:
+ type: array
+ oneOf:
+ - minItems: 4
+ maxItems: 4
+ - minItems: 6
+ maxItems: 6
+ items:
+ type: number
+ style: form
+ explode: false
+ - name: datetime
+ in: query
+ description: Filter collections by datetime
+ required: false
+ schema:
+ type: string
+ style: form
+ explode: false
+ - name: limit
+ in: query
+ description: Limit the amount of returned results
+ required: false
+ schema:
+ type: integer
+ minimum: 1
+ maximum: 10000
+ default: 10
+ style: form
+ explode: false
+ responses:
+ 200:
+ description: A list of available collections
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CollectionsResponseObject'
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Collections not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /collections/{collectionId}:
+ get:
+ summary: Get metadata of a specific collection
+ description: Get metadata of a specific collection
+ operationId: collectionId
+ parameters:
+ - name: collectionId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Metadata on a specific collection
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CollectionObject'
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Collection not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /collections/{collectionId}/keys:
+ get:
+ summary: Get key fields of specific collection
+ description: Get key fields of specific collection
+ operationId: getCollectionKeys
+ parameters:
+ - name: collectionId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Key fields of a specific collection
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CollectionKeysResponseObject'
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Spatial dataset keys not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /collections/{collectionId}/keys/{keyFieldId}:
+ get:
+ summary: Get key values from a specific collection key field.
+ description: Get key values of a specific collection key field.
+ operationId: getCollectionKeyFieldKeyValues
+ parameters:
+ - name: collectionId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: keyFieldId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: key
+ in: query
+ description: Filters by specific key value
+ schema:
+ type: string
+ - name: limit
+ in: query
+ description: Limit the amount of returned results
+ required: false
+ schema:
+ type: integer
+ minimum: 1
+ maximum: 10000
+ default: 10
+ style: form
+ explode: false
+ responses:
+ 200:
+ description: Key values of a specific key field of a collection.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CollectionKeysKeyFieldResponseObject'
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Collection key field values not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /joins:
+ get:
+ summary: Get list of all available joins.
+ description: Get list of all available joins.
+ operationId: getAllJoins
+ parameters:
+ - name: limit
+ in: query
+ description: Limit the amount of returned results
+ required: false
+ schema:
+ type: integer
+ minimum: 1
+ maximum: 10000
+ default: 10
+ style: form
+ explode: false
+ - name: datetime
+ in: query
+ description: Filter collections by datetime
+ required: false
+ schema:
+ type: string
+ style: form
+ explode: false
+ responses:
+ 200:
+ description: A list of available joins
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JoinsResponseObject'
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Joins not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ post:
+ summary: Joins data from an input file with a collection.
+ description: Joins data from an input file with a collection.
+ operationId: joinData
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ collection-id:
+ type: string
+ collection-key:
+ type: string
+ right-dataset-format:
+ type: string
+ enum:
+ - http://www.opengis.net/spec/ogcapi-joins-1/1.0/conf/input/csv
+ right-dataset-file:
+ $ref: '#/components/schemas/FormDataContentDisposition'
+ right-dataset-url:
+ type: string
+ right-dataset-key:
+ type: string
+ right-dataset-data-value-list:
+ type: string
+ csv-file-delimiter:
+ type: string
+ csv-file-header-row-number:
+ type: integer
+ default: 1
+ csv-file-data-start-row-number:
+ type: integer
+ default: 2
+ output-formats:
+ type: string
+ default: http://www.opengis.net/spec/ogcapi-joins-1/1.0/conf/output/geojson
+ enum:
+ - http://www.opengis.net/spec/ogcapi-joins-1/1.0/conf/output/geojson
+ - http://www.opengis.net/spec/ogcapi-joins-1/1.0/conf/output/geojson-direct
+ include-join-metadata:
+ type: string
+ default: "false"
+ enum:
+ - "true"
+ - "false"
+ responses:
+ 200:
+ description: Joined dataset that is returned directly in the GeoJSON format
+ content:
+ application/geo+json: {}
+ 201:
+ description: Creates a join resource
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JoinResponseObject'
+ 400:
+ description: Bad Request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Spatial dataset not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /joins/{joinId}:
+ get:
+ summary: Get metadata of a specific join
+ description: Get metadata of a specific join
+ operationId: getJoinId
+ parameters:
+ - name: joinId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Metadata on a specific join
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JoinResponseObject'
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Join not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ delete:
+ summary: Deletes a specific join
+ description: Deletes a specific join
+ operationId: deleteJoin
+ parameters:
+ - name: joinId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ 204:
+ description: Join deleted
+ 400:
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 404:
+ description: Join not found
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ /filejoin:
+ post:
+ summary: Join data between two input files
+ description: Join data between two input files
+ operationId: filejoin
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ left-dataset-format:
+ type: string
+ enum:
+ - http://www.opengis.net/spec/ogcapi-joins-1/1.0/conf/input/geojson
+ left-dataset-file:
+ $ref: '#/components/schemas/FormDataContentDisposition'
+ left-dataset-url:
+ type: string
+ left-dataset-key:
+ type: string
+ right-dataset-format:
+ type: string
+ enum:
+ - http://www.opengis.net/spec/ogcapi-joins-1/1.0/conf/input/csv
+ right-dataset-file:
+ $ref: '#/components/schemas/FormDataContentDisposition'
+ right-dataset-url:
+ type: string
+ right-dataset-key:
+ type: string
+ right-dataset-data-value-list:
+ type: string
+ csv-file-delimiter:
+ type: string
+ csv-file-header-row-number:
+ type: integer
+ default: 1
+ csv-file-data-start-row-number:
+ type: integer
+ default: 2
+ responses:
+ 200:
+ description: Response of the join operation
+ content:
+ application/geo+json: {}
+ 400:
+ description: Bad Request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+ 500:
+ description: A server error occurred
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExceptionObject'
+components:
+ schemas:
+ CollectionObject:
+ required:
+ - id
+ - links
+ type: object
+ properties:
+ attribution:
+ type: string
+ crs:
+ type: array
+ items:
+ type: string
+ default:
+ - http://www.opengis.net/def/crs/OGC/1.3/CRS84
+ extent:
+ $ref: '#/components/schemas/ExtentObject'
+ description:
+ type: string
+ id:
+ type: string
+ itemType:
+ type: string
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ title:
+ type: string
+ KeyObject:
+ required:
+ - key
+ type: object
+ properties:
+ key:
+ type: string
+ title:
+ type: string
+ ConformanceResponseObject:
+ required:
+ - conformsTo
+ type: object
+ properties:
+ conformsTo:
+ type: array
+ items:
+ type: string
+ SpatialExtentObject:
+ type: object
+ properties:
+ bbox:
+ type: array
+ minItems: 1
+ items:
+ type: array
+ oneOf:
+ - minItems: 4
+ maxItems: 4
+ - minItems: 6
+ maxItems: 6
+ items:
+ type: number
+ crs:
+ type: string
+ default: http://www.opengis.net/def/crs/OGC/1.3/CRS84
+ enum:
+ - http://www.opengis.net/def/crs/OGC/1.3/CRS84
+ CollectionKeysKeyFieldResponseObject:
+ required:
+ - keys
+ - links
+ type: object
+ properties:
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ keys:
+ type: array
+ items:
+ $ref: '#/components/schemas/KeyObject'
+ numberMatched:
+ type: integer
+ numberReturned:
+ type: integer
+ JoinsResponseObject:
+ required:
+ - joins
+ - links
+ type: object
+ properties:
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ joins:
+ type: array
+ items:
+ $ref: '#/components/schemas/JoinsObject'
+ numberMatched:
+ type: integer
+ numberReturned:
+ type: integer
+ timeStamp:
+ type: string
+ format: date-time
+ JoinResponseObject:
+ required:
+ - join
+ - links
+ type: object
+ properties:
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ join:
+ $ref: '#/components/schemas/JoinObject'
+ JoinsObject:
+ required:
+ - id
+ - links
+ - timeStamp
+ type: object
+ properties:
+ id:
+ type: string
+ timeStamp:
+ type: string
+ format: date-time
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ JoinInputsObject:
+ required:
+ - attributeDataset
+ - collection
+ type: object
+ properties:
+ attributeDataset:
+ type: string
+ collection:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ CollectionsResponseObject:
+ required:
+ - collections
+ - links
+ type: object
+ properties:
+ collections:
+ type: array
+ items:
+ $ref: '#/components/schemas/CollectionObject'
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ numberMatched:
+ type: integer
+ minimum: 0
+ numberReturned:
+ type: integer
+ minimum: 0
+ timeStamp:
+ type: string
+ format: date-time
+ CollectionKeysObject:
+ required:
+ - id
+ - isDefault
+ - links
+ type: object
+ properties:
+ isDefault:
+ type: boolean
+ language:
+ type: string
+ id:
+ type: string
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ ExceptionObject:
+ required:
+ - type
+ type: object
+ properties:
+ type:
+ type: string
+ title:
+ type: string
+ status:
+ type: integer
+ detail:
+ type: string
+ instance:
+ type: string
+ TemporalExtentObject:
+ type: object
+ properties:
+ interval:
+ type: array
+ minItems: 1
+ items:
+ type: array
+ minItems: 2
+ maxItems: 2
+ items:
+ type: string
+ format: date-time
+ nullable: true
+ trs:
+ type: string
+ default: http://www.opengis.net/def/uom/ISO-8601/0/Gregorian
+ enum:
+ - http://www.opengis.net/def/uom/ISO-8601/0/Gregorian
+ CollectionKeysResponseObject:
+ required:
+ - keys
+ - links
+ type: object
+ properties:
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ keys:
+ type: array
+ items:
+ $ref: '#/components/schemas/CollectionKeysObject'
+ FormDataContentDisposition:
+ type: object
+ properties:
+ type:
+ type: string
+ parameters:
+ type: object
+ additionalProperties:
+ type: string
+ fileName:
+ type: string
+ creationDate:
+ type: string
+ format: date-time
+ modificationDate:
+ type: string
+ format: date-time
+ readDate:
+ type: string
+ format: date-time
+ size:
+ type: integer
+ format: int64
+ name:
+ type: string
+ JoinInformationObject:
+ type: object
+ properties:
+ numberOfMatchedCollectionKeys:
+ type: integer
+ numberOfUnmatchedCollectionKeys:
+ type: integer
+ numberOfAdditionalAttributeKeys:
+ type: integer
+ matchedCollectionKeys:
+ type: array
+ items:
+ type: string
+ unmatchedCollectionKeys:
+ type: array
+ items:
+ type: string
+ additionalAttributeKeys:
+ type: array
+ items:
+ type: string
+ duplicateAttributeKeys:
+ type: array
+ items:
+ type: string
+ numberOfDuplicateAttributeKeys:
+ type: integer
+ LandingPageResponseObject:
+ required:
+ - links
+ type: object
+ properties:
+ title:
+ type: string
+ description:
+ type: string
+ attribution:
+ type: string
+ links:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ JoinObject:
+ required:
+ - id
+ - inputs
+ - outputs
+ - timeStamp
+ type: object
+ properties:
+ id:
+ type: string
+ timeStamp:
+ type: string
+ format: date-time
+ inputs:
+ $ref: '#/components/schemas/JoinInputsObject'
+ outputs:
+ type: array
+ items:
+ $ref: '#/components/schemas/Link'
+ joinInformation:
+ $ref: '#/components/schemas/JoinInformationObject'
+ Link:
+ required:
+ - href
+ - rel
+ type: object
+ properties:
+ href:
+ type: string
+ rel:
+ type: string
+ type:
+ type: string
+ hreflang:
+ type: string
+ title:
+ type: string
+ length:
+ type: integer
+ ExtentObject:
+ type: object
+ properties:
+ spatial:
+ $ref: '#/components/schemas/SpatialExtentObject'
+ temporal:
+ $ref: '#/components/schemas/TemporalExtentObject'