Skip to content

Add support for custom tile matrix sets #2074

@lindakarlovska

Description

@lindakarlovska

Is your feature request related to a problem? Please describe.
I’m working with vector tiles generated from cadastral data in a custom tile matrix set, specifically based on EPSG:5514 (S-JTSK). The definition I’m using is published here:
🔗 OpenGeoLabs tile matrix sets (in Czech) — it’s the second TMS listed.

Tiles were created using GDAL (which supports custom tiling schemes) and stored in the standard {z}/{x}/{y} structure, served by a basic HTTP server.

I tested pygeoapi’s mvt-proxy plugin using the default Web Mercator TMS, and it works great for my case. However, I would like to serve tiles using my specific S-JTSK TMS.

Describe the solution you'd like
Introduce a new top-level tileMatrixSets: section in the servers part of the YAML configuration file. This would allow users to define one or more custom TMS definitions directly in their config at the beginning and use these TMS in following resources section.

Structure would follow the same format as the current hardcoded tile matrix sets in pygeoapi/models/provider/base.py.

tileMatrixSets:
  SJTSKQuad:
    tileMatrixSet: SJTSKQuad
    tileMatrixSetURI: https://github.com/OpenGeoLabs/tiles-cz/blob/main/03-tile-matrix-set.md
    crs: http://www.opengis.net/def/crs/EPSG/0/5514
    title: S-JTSK Quad (Czech cadastral)
    orderedAxes: [X, Y]
    tileMatrices:
      - id: 0
        scaleDenominator: 7315200
        cellSize: 2048.256
        cornerOfOrigin: topLeft
        pointOfOrigin: [-925000, -920000]
        matrixWidth: 1
        matrixHeight: 1
        tileWidth: 256
        tileHeight: 256
      - id: 1
        scaleDenominator: 3657600
        cellSize: 1024.128
        cornerOfOrigin: topLeft
        pointOfOrigin: [-925000, -920000]
        matrixWidth: 2
        matrixHeight: 2
        tileWidth: 256
        tileHeight: 256
      # ...
      - id: 19
        scaleDenominator: 13.95
        cellSize: 0.00390673
        cornerOfOrigin: topLeft
        pointOfOrigin: [-925000, -920000]
        matrixWidth: 524288
        matrixHeight: 262144
        tileWidth: 256
        tileHeight: 256

Then, in the provider configuration:

providers:
  - type: tile
    name: MVT-proxy
    data: http://localhost:8000/vector-tiles/parcels/{z}/{x}/{y}.pbf
    options:
      zoom:
        min: 10
        max: 14
      schemes:
        - SJTSKQuad
    format:
      name: pbf
      mimetype: application/vnd.mapbox-vector-tile

Additional context
Where does it make sense to implement it? Currently, custom TMS support seems most relevant for the mvt-proxy plugin (my focus), but may also make sense for WMTS-related use. All tile-related plugins are summed up in the following table:

📦 TMS Usage Across Plugins

Plugin CRS Assumptions Custom TMS Support? Notes
mvt-postgres WebMercator and WorldCRS84 ❓ Unsure Not sure if there is any option to use own tiling schemes, probably not?
mvt-elastic WebMercator only ❌ Not needed CRS is fixed, no custom projection support
mvt-tippecanoe WebMercator only ❌ Not needed Tippecanoe only supports Web Mercator output
mvt-proxy Flexible (depends on tile source) ✅ Makes sense Custom CRS and TMS make definitely sense here
wmts-facade Potentially multiple ✅ Worth considering Would depend on backend support and structure

I’ve already discussed this idea briefly on the pygeoapi mailing list, but I’d like to follow up here as well to get broader feedback.

I’d really appreciate any input — whether this idea makes sense, potential challenges to be aware of, or hints on how best to approach it within the existing architecture. I’d be happy to start working on an implementation soon if this direction seems reasonable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions