Skip to content

Postgres tiling service to load MVT vector tiles dynamically

License

Notifications You must be signed in to change notification settings

robertozimek/dynamic-tiling

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dynamic Tiling

Precomputed mapbox vector tiles (MVT) come with size limitations or can impacted performance when trying to load too many points or complex polygons. In addition, it becomes difficult to make your geospatial data highly filterable when points have been dropped to meet tile size limitations. The goal of this project is to solve that by dynamically querying the data and serving up the tiles at varying levels of detail depending on zoom level.

Requirements

  • postgres (tested using postgres@14)
    • extensions
      • postgis
      • h3 / h3_postgis (used to reduce points at higher zoom levels)

Optional

  • redis-server

Environment Variables

Optionally can use .env file

# Required
POSTGRES_USER=[database host]
POSTGRES_USER=[database username]
POSTGRES_PASS=[database password]
POSTGRES_DB_NAME=[database name]

# Optional
POSTGRES_SSL_MODE=[database disable/require ssl] (default: require)
DEBUG=[enable/disable debug level logs] (default: false)
PORT=[port that dynamic-tiling service should listen on] (default: 8095)
REDIS_URL=[redis url] # i.e. redis://localhost:6379 
REDIS_CACHE_DURATION=[redis cache expiration] (default: 1h) # accepts anything that golang time.ParseDuration can parse 
ALLOWED_ORIGINS=[CORS space separated origins] (default: https://* http://*)
CACHE_CONTROL_HEADER=[Cache control header value] (default: private, max-age=300)
DISABLE_GZIP=[Disables gzip compression] (default: false)

Getting Startup

go build
./dynamic-tiling

There is also an optional parameter if you like to manage multiple .env files for different environments

./dynamic-tiling -env=staging 
# uses .env.staging file to load environment variables  

Usage

GET /mvt/{x}/{y}/{z}
Parameters
name type data type description
x required integer cartesian coordinate
y required integer cartesian coordinate
z required integer zoom level
Query Parameters
name type data type description
query required string SQL query for geospatial data
geoCol required string Name of geospatial column (must be included in the final select of the SQL query)
srid optional integer SRID for the geospatial column (default: 4326)
Responses
http code content-type response
200 application/x-protobuf MVT protobuf binary
Usage Example

DeckGL Layer:

 const mvtLayer = new MVTLayer({
            id: 'walmartLayer',
            data: [
                'http://localhost:8095/mvt/{x}/{y}/{z}?query=SELECT id, name, location FROM my_geospatial_data&geoCol=location',
            ],
            minZoom: 0,
            maxZoom: 24,
            getFillColor: [255, 0, 0],
            getLineWidth: 1,
            pointRadiusUnits: 'pixels',
            getPointRadius: 5,
            stroked: true,
            getLineColor: [0, 0, 255],
            pickable: true
        }
    )

About

Postgres tiling service to load MVT vector tiles dynamically

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages