Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
b8bfc4e
TinyDB: fix spatial queries against null geometries
tomkralidis Jan 15, 2026
402a792
fix test
tomkralidis Jan 16, 2026
f98d5f9
Merge pull request #2209 from geopython/tinydb-query-nogeom
tomkralidis Jan 16, 2026
734dabe
update EDR and Maps to support MetOcean access and visualization work…
tomkralidis Jan 20, 2026
0081549
Fix admin with empty resources (#2208)
nicokant Jan 22, 2026
4982458
Docs: fix typos and clarify get_srid docstring (#2219)
Prinxeeee Jan 28, 2026
4a8b8ea
pin gunicorn (#2221) (#2222)
tomkralidis Jan 28, 2026
99446d5
Update ESRI Provider (#2225)
webb-ben Jan 28, 2026
41011f1
Cleanup xarray provider (#2224)
webb-ben Jan 28, 2026
84f4412
HTML: set clear opacity if collection has a map (#2226)
tomkralidis Jan 28, 2026
6457233
add support for OGC API Publish-Subscribe Workflow - Part 1: Core (#2…
tomkralidis Jan 29, 2026
478864c
fix AsyncAPI handling on Docker startup (#2227)
tomkralidis Jan 29, 2026
e5d79cb
Filtering Geospatial Data (#2165)
kieranbartels Jan 31, 2026
e01111e
fix missing flake8
tomkralidis Jan 31, 2026
3bd179b
Revert "fix missing flake8"
tomkralidis Jan 31, 2026
ecd81c1
Revert "Filtering Geospatial Data (#2165)"
tomkralidis Jan 31, 2026
e2c5b86
move provider utils to pygeoapi.provider (#2228)
tomkralidis Feb 1, 2026
e20d7d1
OAProc: do not pretty print JSON results when document=raw (#2212) (#…
tomkralidis Feb 2, 2026
5d01f16
Implement OGC API - Processes, Requirement 25, for jobControlOptions …
francescoingv Feb 2, 2026
68f5503
EDR: add parameter description if exists (#2233) (#2234)
tomkralidis Feb 2, 2026
7e47b02
fix: add fix for slow full count in postgresql (#2174)
mdearos Feb 3, 2026
19cc618
Fix to not mutating conformance class list (#2239)
francbartoli Feb 10, 2026
0b53d49
OAProc: fix gzip compression on async process execution (#2238) (#2240)
tomkralidis Feb 11, 2026
b4c362c
update noble to 20260113 in Dockerfile (#2246)
tomkralidis Feb 16, 2026
c3c3eb8
Update Docker API in main GitHub Action (#2248)
tomkralidis Feb 17, 2026
66876ab
fix form reset for records items HTML (#2247)
tomkralidis Feb 17, 2026
096c577
add resolution/default to collection extents.temporal configuration (…
tomkralidis Feb 23, 2026
dabbea7
remove deprecated license and fix test cmdclass in setup.py (#2262)
tomkralidis Feb 23, 2026
4279841
Support SQL connection string (#2251)
webb-ben Feb 24, 2026
b777b16
PubSub: add support for Kafka (#2259) (#2258)
tomkralidis Feb 24, 2026
e4d8ced
Fix `transform_bbox` CRS types (#2265)
C-Loftus Feb 26, 2026
247ebf7
prevent form fields from being submitted on form click/submit (#2263)
tomkralidis Mar 1, 2026
a09fdac
enable skipping of errorneous collections in /collections (#2267)
tomkralidis Mar 2, 2026
ff8465c
OAProc: derive process execution mode OpenAPI prefer option from proc…
tomkralidis Mar 5, 2026
523c4bd
Use the latest Ubuntu Noble base image (#2275)
kalxas Mar 6, 2026
7ff27c1
update release version
kalxas Mar 6, 2026
3764b1a
back to dev
kalxas Mar 6, 2026
49ed4cc
update Security Policy (#2277)
jmckenna Mar 6, 2026
ed2b416
fix openapi generate example in docs (#2276) (#2278)
tomkralidis Mar 6, 2026
8f688a7
OAProc: derive jobControlOptions and outputTransmission from plugin (…
tomkralidis Mar 6, 2026
16736b2
Geoparquet 1.1 spec compliance update (#2271)
C-Loftus Mar 9, 2026
939d373
OAProc: safeguard link rel check (#2282) (#2283)
tomkralidis Mar 10, 2026
332c806
03/10 merge with upstream pygeoapi and handle conflict
Csenongmin Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jobs:
- python-version: '3.12'
env:
PYGEOAPI_CONFIG: "$(pwd)/pygeoapi-config.yml"
DOCKER_API_VERSION: "1.44"

services:
postgres:
Expand All @@ -42,7 +43,6 @@ jobs:
docker pull elasticsearch:8.17.0 &
docker pull opensearchproject/opensearch:2.18.0 &
docker pull mongo:8.0.4 &
docker pull ghcr.io/cgs-earth/sensorthings-action:0.1.0 &
docker pull postgis/postgis:14-3.2 &
- name: Clear up GitHub runner diskspace
run: |
Expand Down Expand Up @@ -96,7 +96,7 @@ jobs:
with:
mongodb-version: '8.0.4'
- name: Install and run SensorThingsAPI
uses: cgs-earth/sensorthings-action@v0.1.0
uses: cgs-earth/sensorthings-action@v0.1.2
- name: Install sqlite and gpkg dependencies
uses: awalsh128/cache-apt-pkgs-action@v1.4.3
with:
Expand Down Expand Up @@ -126,6 +126,7 @@ jobs:
pip3 install -r requirements-provider.txt
pip3 install -r requirements-manager.txt
pip3 install -r requirements-django.txt
pip3 install -r requirements-pubsub.txt
pip3 install .
pip3 install GDAL==`gdal-config --version`
- name: setup test data ⚙️
Expand Down
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Francesco Bartoli <xbartolone@gmail.com>
# Angelos Tzotsos <gcpp.kalxas@gmail.com>
#
# Copyright (c) 2025 Tom Kralidis
# Copyright (c) 2026 Tom Kralidis
# Copyright (c) 2019 Just van den Broecke
# Copyright (c) 2025 Francesco Bartoli
# Copyright (c) 2025 Angelos Tzotsos
Expand Down Expand Up @@ -34,7 +34,7 @@
#
# =================================================================

FROM ubuntu:noble-20251013
FROM ubuntu:noble

LABEL maintainer="Just van den Broecke <justb4@gmail.com>"

Expand Down Expand Up @@ -133,7 +133,7 @@ ADD . /pygeoapi
RUN python3 -m venv --system-site-packages /venv \
&& /venv/bin/python3 -m pip install --no-cache-dir -r requirements-docker.txt \
&& /venv/bin/python3 -m pip install --no-cache-dir -r requirements-admin.txt \
&& /venv/bin/python3 -m pip install --no-cache-dir gunicorn \
&& /venv/bin/python3 -m pip install --no-cache-dir "gunicorn<24" \
&& /venv/bin/python3 -m pip install --no-cache-dir -e .

# Set default config and entrypoint for Docker Image
Expand Down
4 changes: 2 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ The pygeoapi Project Steering Committee (PSC) will release patches for security

| Version | Supported |
| ------- | ------------------ |
| 0.10.x | :white_check_mark: |
| < 0.10 | :x: |
| 0.2x | :white_check_mark: |
| < 0.20 | :x: |
8 changes: 8 additions & 0 deletions docker/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ fi
if [[ -z "$PYGEOAPI_OPENAPI" ]]; then
export PYGEOAPI_OPENAPI="${PYGEOAPI_HOME}/local.openapi.yml"
fi
if [[ -z "$PYGEOAPI_ASYNCAPI" ]]; then
export PYGEOAPI_ASYNCAPI="${PYGEOAPI_HOME}/local.asyncapi.yml"
fi

# gunicorn env settings with defaults
SCRIPT_NAME=${SCRIPT_NAME:=/}
Expand Down Expand Up @@ -87,6 +90,11 @@ echo "Trying to generate openapi.yml"

echo "openapi.yml generated continue to pygeoapi"

echo "Trying to generate asyncapi.yml"
/venv/bin/pygeoapi asyncapi generate ${PYGEOAPI_CONFIG} --output-file ${PYGEOAPI_ASYNCAPI}

[[ $? -ne 0 ]] && echo "asyncapi.yml could not be generated; skipping"

start_gunicorn() {
# SCRIPT_NAME should not have value '/'
[[ "${SCRIPT_NAME}" = '/' ]] && export SCRIPT_NAME="" && echo "make SCRIPT_NAME empty from /"
Expand Down
21 changes: 14 additions & 7 deletions docs/source/administration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@ To generate the OpenAPI document, run the following:

This will dump the OpenAPI document as YAML to your system's ``stdout``. To save to a file on disk, run:

.. code-block:: bash

pygeoapi openapi generate /path/to/my-pygeoapi-config.yml > /path/to/my-pygeoapi-openapi.yml

You can also write to a file explicitly via the ``--output-file`` option:

.. code-block:: bash

pygeoapi openapi generate /path/to/my-pygeoapi-config.yml --output-file /path/to/my-pygeoapi-openapi.yml
Expand All @@ -38,7 +32,7 @@ To generate the OpenAPI document as JSON, run:

.. code-block:: bash

pygeoapi openapi generate /path/to/my-pygeoapi-config.yml -f json > /path/to/my-pygeoapi-openapi.json
pygeoapi openapi generate /path/to/my-pygeoapi-config.yml --format json --output-file /path/to/my-pygeoapi-openapi.json

.. note::
Generate as YAML or JSON? If your OpenAPI YAML definition is slow to render as JSON,
Expand Down Expand Up @@ -83,6 +77,11 @@ In UNIX:
# or if OpenAPI JSON
export PYGEOAPI_OPENAPI=/path/to/my-pygeoapi-openapi.json

# if your server supports AsyncAPI and Pub/Sub
export PYGEOAPI_ASYNCAPI=/path/to/my-pygeoapi-asyncapi.yml
# or if AsyncAPI JSON
export PYGEOAPI_ASYNCAPI=/path/to/my-pygeoapi-asyncapi.json

In Windows:

.. code-block:: bat
Expand All @@ -92,6 +91,14 @@ In Windows:
# or if OpenAPI JSON
set PYGEOAPI_OPENAPI=/path/to/my-pygeoapi-openapi.json

# if your server supports AsyncAPI and Pub/Sub
set PYGEOAPI_ASYNCAPI=/path/to/my-pygeoapi-asyncapi.yml
# or if AsyncAPI JSON
set PYGEOAPI_ASYNCAPI=/path/to/my-pygeoapi-asyncapi.json

.. note::

More information on AsyncAPI and Pub/Sub can be found at :ref:`pubsub`.

Summary
-------
Expand Down
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def __getattr__(cls, name):
# built documents.
#
# The short X.Y version.
version = '0.23.dev0'
version = '0.24.dev0'
# The full version, including alpha/beta/rc tags.
release = version

Expand Down
26 changes: 26 additions & 0 deletions docs/source/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ file whatever you wish; typical filenames end with ``.yml``.
pygeoapi configuration contains the following core sections:

- ``server``: server-wide settings
- ``pubsub``: Publish-Subscribe settings (optional)
- ``logging``: logging configuration
- ``metadata``: server-wide metadata (contact, licensing, etc.)
- ``resources``: dataset collections, processes and stac-collections offered by the server
Expand Down Expand Up @@ -90,6 +91,23 @@ For more information related to API design rules (the ``api_rules`` property in
url_prefix: 'v{api_major}' # adds a /v1 prefix to all URL paths
version_header: X-API-Version # add a response header of this name with the API version

``pubsub``
^^^^^^^^^^

The ``pubsub`` section provides directives for enabling publication of CloudEvent messaages on item-based transactions


.. code-block:: yaml

pubsub:
name: MQTT
broker:
url: mqtt://localhost:1883
channel: my/service/topic

.. seealso::
:ref:`pubsub` for more information on Publish-Subscribe capabilities


``logging``
^^^^^^^^^^^
Expand Down Expand Up @@ -225,6 +243,14 @@ default.
begin: 2000-10-30T18:24:39Z # start datetime in RFC3339
end: 2007-10-30T08:57:29Z # end datetime in RFC3339
trs: http://www.opengis.net/def/uom/ISO-8601/0/Gregorian # TRS
resolution: P1D # ISO 8601 duration
default: 2000-10-30T18:24:39Z # default time
# additional extents can be added as desired (1..n)
foo:
url: https://example.org/def # required URL of the extent
range: [0, 10] # required overall range/extent
units: °C # optional units
values: [0, 2, 5, 5, 10] # optional, enumeration of values
providers: # list of 1..n required connections information
- type: feature # underlying data geospatial type. Allowed values are: feature, coverage, record, tile, edr
name: CSV # required: plugin name or import path. See Plugins section for more information.
Expand Down
1 change: 1 addition & 0 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ reference documentation on all aspects of the project.
openapi
publishing/index
transactions
pubsub
admin-api
security
plugins
Expand Down
63 changes: 57 additions & 6 deletions docs/source/plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,15 @@ The core pygeoapi plugin registry can be found in ``pygeoapi.plugin.PLUGINS``.

Each plugin type implements its relevant base class as the API contract:

* data providers: ``pygeoapi.provider.base``
* output formats: ``pygeoapi.formatter.base``
* processes: ``pygeoapi.process.base``
* process_manager: ``pygeoapi.process.manager.base``
* data providers:

* features/records/maps: ``pygeoapi.provider.base.BaseProvider``
* edr: ``pygeoapi.provider.base_edr.BaseEDRProvider``
* tiles: ``pygeoapi.provider.tile.BaseTileProvider``

* output formats: ``pygeoapi.formatter.base.BaseFormatter``
* processes: ``pygeoapi.process.base.BaseProcessor``
* process_manager: ``pygeoapi.process.manager.base.BaseManager``

.. todo:: link PLUGINS to API doc

Expand Down Expand Up @@ -150,7 +155,7 @@ option 2 above).
Example: custom pygeoapi vector data provider
---------------------------------------------

Lets consider the steps for a vector data provider plugin:
Let's consider the steps for a vector data provider plugin:

Python code
^^^^^^^^^^^
Expand Down Expand Up @@ -223,7 +228,7 @@ Each base class documents the functions, arguments and return types required for
Example: custom pygeoapi raster data provider
---------------------------------------------

Lets consider the steps for a raster data provider plugin:
Let's consider the steps for a raster data provider plugin:

Python code
^^^^^^^^^^^
Expand Down Expand Up @@ -278,6 +283,51 @@ Each base class documents the functions, arguments and return types required for

.. _example-custom-pygeoapi-processing-plugin:

Example: custom pygeoapi EDR data provider
------------------------------------------

Let's consider the steps for an EDR data provider plugin:

Python code
^^^^^^^^^^^

The below template provides a minimal example (let's call the file ``mycooledrdata.py``:

.. code-block:: python

from pygeoapi.provider.base_edr import BaseEDRProvider

class MyCoolEDRDataProvider(BaseEDRProvider):

def __init__(self, provider_def):
"""Inherit from the parent class"""

super().__init__(provider_def)

self.covjson = {...}

def get_instances(self):
return ['foo', 'bar']

def get_instance(self, instance):
return instance in get_instances()

def position(self, **kwargs):
return self.covjson

def trajectory(self, **kwargs):
return self.covjson


For brevity, the ``position`` function returns ``self.covjson`` which is a
dictionary of a CoverageJSON representation. ``get_instances`` returns a list
of instances associated with the collection/plugin, and ``get_instance`` returns
a boolean of whether a given instance exists/is valid. EDR query types are subject
to the query functions defined in the plugin. In the example above, the plugin
implements ``position`` and ``trajectory`` queries, which will be advertised as
supported query types.


Example: custom pygeoapi processing plugin
------------------------------------------

Expand Down Expand Up @@ -360,6 +410,7 @@ Below is a sample process definition as a Python dictionary:
'it back as output. Intended to demonstrate a simple '
'process with a single literal input.',
'jobControlOptions': ['sync-execute', 'async-execute'], # whether the process can be executed in sync or async mode
'outputTransmission': ['value', 'reference'], # whether the process can return inline data or URL references
'keywords': ['hello world', 'example', 'echo'], # keywords associated with the process
'links': [{ # a list of 1..n # link objects relevant to the process
'type': 'text/html',
Expand Down
10 changes: 10 additions & 0 deletions docs/source/publishing/ogcapi-coverages.rst
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,20 @@ The `Xarray`_ provider plugin reads and extracts `NetCDF`_ and `Zarr`_ data.
format:
name: zarr
mimetype: application/zip
options:
zarr:
consolidated: true
squeeze: true


.. note::
`Zarr`_ files are directories with files and subdirectories. Therefore
a zip file is returned upon request for said format.

.. note::

``options.zarr`` is a custom property that can be used to set `Zarr-specific open options`_.

.. note::
When referencing `NetCDF`_ or `Zarr`_ data stored in an S3 bucket,
be sure to provide the full S3 URL. Any parameters required to open the dataset
Expand Down Expand Up @@ -155,3 +164,4 @@ Data access examples
.. _`Zarr`: https://zarr.readthedocs.io/en/stable
.. _`GDAL raster driver short name`: https://gdal.org/drivers/raster/index.html
.. _`pyproj.CRS.from_user_input`: https://pyproj4.github.io/pyproj/stable/api/crs/coordinate_system.html#pyproj.crs.CoordinateSystem.from_user_input
.. _`Zarr-specific open options`: https://docs.xarray.dev/en/stable/generated/xarray.open_zarr.html
7 changes: 6 additions & 1 deletion docs/source/publishing/ogcapi-edr.rst
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,15 @@ The `xarray-edr`_ provider plugin reads and extracts `NetCDF`_ and `Zarr`_ data
a zip file is returned upon request for said format.

.. note::

``options.zarr`` is a custom property that can be used to set `Zarr-specific open options`_.

.. note::

When referencing data stored in an S3 bucket, be sure to provide the full
S3 URL. Any parameters required to open the dataset using fsspec can be added
to the config file under `options` and `s3`, as shown above.


SensorThingsEDR
^^^^^^^^^^^^^^^

Expand Down Expand Up @@ -143,3 +147,4 @@ Data access examples
.. _`NetCDF`: https://en.wikipedia.org/wiki/NetCDF
.. _`Zarr`: https://zarr.readthedocs.io/en/stable
.. _`OGC Environmental Data Retrieval (EDR) (API)`: https://ogcapi.ogc.org/edr
.. _`Zarr-specific open options`: https://docs.xarray.dev/en/stable/generated/xarray.open_zarr.html
15 changes: 15 additions & 0 deletions docs/source/publishing/ogcapi-features.rst
Original file line number Diff line number Diff line change
Expand Up @@ -625,6 +625,19 @@ Must have PostGIS installed.
id_field: osm_id
table: hotosm_bdi_waterways
geom_field: foo_geom
count: true # Optional; Default true; Enable/disable count for improved performance.

This can be represented as a connection dictionary or as a connection string as follows:

.. code-block:: yaml

providers:
- type: feature
name: PostgreSQL
data: postgresql://postgres:postgres@127.0.0.1:3010/test
id_field: osm_id
table: hotosm_bdi_waterways
geom_field: foo_geom

A number of database connection options can be also configured in the provider in order to adjust properly the sqlalchemy engine client.
These are optional and if not specified, the default from the engine will be used. Please see also `SQLAlchemy docs <https://docs.sqlalchemy.org/en/14/core/engines.html#custom-dbapi-connect-arguments-on-connect-routines>`_.
Expand Down Expand Up @@ -662,6 +675,7 @@ These are optional and if not specified, the default from the engine will be use
id_field: osm_id
table: hotosm_bdi_waterways
geom_field: foo_geom
count: true # Optional; Default true; Enable/disable count for improved performance.

The PostgreSQL provider is also able to connect to Cloud SQL databases.

Expand All @@ -677,6 +691,7 @@ The PostgreSQL provider is also able to connect to Cloud SQL databases.
password: postgres
id_field: id
table: states
count: true # Optional; Default true; Enable/disable count for improved performance.

This is what a configuration for `Google Cloud SQL`_ connection looks like. The ``host``
block contains the necessary socket connection information.
Expand Down
4 changes: 4 additions & 0 deletions docs/source/publishing/ogcapi-maps.rst
Original file line number Diff line number Diff line change
Expand Up @@ -136,5 +136,9 @@ Data visualization examples

* http://localhost:5000/collections/foo/map?bbox-crs=http%3A%2F%2Fwww.opengis.net%2Fdef%2Fcrs%2FEPSG%2F0%2F3857&bbox=4.022369384765626%2C50.690447870569436%2C4.681549072265626%2C51.00260125274477&width=800&height=600&transparent

* map with vertical subset (``extents.vertical`` must be set in resource level config)

* http://localhost:5000/collections/foo/map?bbox=-142,42,-52,84&subset=vertical(435)

.. _`OGC API - Maps`: https://ogcapi.ogc.org/maps
.. _`see website`: https://mapserver.org/mapscript/index.html
Loading
Loading