texel
Preprocesses a GeoPackage
for creating valid (more info below) vector tiles from it.
(And in the future probably will also create the actual vector tiles.)
The (MULTI)POLYGON geometries in a geopackage are snapped to the grid cq matrix
matching the one of the intended (internal pixel grid of the) vector tiles.
While ensuring that no (new) intersections arise from this, by adding points
to lines that skim along other vertices.
An additional benefit is that the vector tile generator needs to process fewer
data (snapping combines some points into one) and does not need any additional
processing aside from clipping and converting to the internal tile pixel grid.
"Valid" geometries
Our definition of valid is in the context of vector tiles and is more loose
than the OGC rules.
Mainly in comparison to the OGC rules, we allow:
- Overlap (not intersection)
- Linear rings or line strings with less than 3 vertices
(effectively becoming lines or points)
With the drawing/rendering of vector tiles in mind, these invalidities do not
cause a problem. On the contrary, they introduce possibilities.
E.g. when zooming out, you would like to still see a lake as a point and a
river as a line. (The tool that this codebase is forked from, sieve
would
filter those out.) Also when zooming out on a lake with an attached river,
you would like to keep seeing that river as a line, but still as part of the
original geometry/feature including all attributes and styling.
Examples
Not adding extra points could create intersections:
Close thin polygons can turn into lines:
Notes
- It will take a Geopackage and writes a new Geopackage with all the
(MULTI)POLYGON tables preprocessed.
- All other spatial tables are 'untouched' and copied as-is.
- Other non-spatial tables are not copied to the new geopackage.
- ⚠ Spatialite lib is mandatory for running this application. This lib is needed for
creating the RTree triggers on the spatial tables for updating/maintaining the
RTree.
Usage
./texel -s=[source GPKG] -t=[target GPKG] \
-tms=[tile matrix set for filtering] -z=[tile matrix ids] \
-p=[pagesize for writing to target GPKG] -o=[overwrite target GPKG] \
-pl=[keep points and lines]
./texel --help
Docker
docker run \
--name texel \
--rm \
-u $(id -u):$(id -g) \
-v `pwd`/example:/example \
pdok/texel \
-s=./example/example.gpkg \
-t=./example/example-processed.gpkg \
-tms="NetherlandsRDNewQuad" \
-z '[5]' \
-p=10 \
-o=false \
-pl=true
Build
go test ./... -covermode=atomic
go build .
Docker
docker build -t pdok/texel .
References
- sieve is the predecessor of this tool
and much of its processing codebase is reused as boilerplate.