Testing Tilekiln for creating vector tiles

Today I set up a local Tile server under Ubuntu 24.04 using the instructions at Manually building a tile server (Ubuntu 24.04) – Switch2OSM. Everything worked fine. Postgres and Postgis are set up correctly.

Now I would also like to create vectortiles via GitHub - pnorman/tilekiln.

I have followed the instructions at GitHub - pnorman/tilekiln. But at createdb flex I get an error.
I think it has to do with authorisations. There is no role for my current Linux user.
Is there a more detailed guide for testing tilekiln?

How to Report Bugs Effectively mostly applies here

please, quote exact error for a start (unless you decided to completely abandon this tutorial, but then mentioning anything about error would make no sense)

3 Likes

Thanks for the answer.

The creation of the virtual environment and the installation of Tilekiln was successful:

agi@agi-VirtualBox:~$ tilekiln/bin/pip install tilekiln
Collecting tilekiln
  Downloading tilekiln-0.4.0-py3-none-any.whl.metadata (8.4 kB)
Collecting click (from tilekiln)
  Downloading click-8.1.7-py3-none-any.whl.metadata (3.0 kB)
Collecting fastapi (from tilekiln)
  Downloading fastapi-0.111.0-py3-none-any.whl.metadata (25 kB)
Collecting fs (from tilekiln)
  Downloading fs-2.4.16-py2.py3-none-any.whl.metadata (6.3 kB)
Collecting jinja2 (from tilekiln)
  Downloading jinja2-3.1.4-py3-none-any.whl.metadata (2.6 kB)
Collecting prometheus-client (from tilekiln)
  Downloading prometheus_client-0.20.0-py3-none-any.whl.metadata (1.8 kB)
Collecting psycopg (from tilekiln)
  Downloading psycopg-3.1.18-py3-none-any.whl.metadata (4.2 kB)
Collecting pyyaml (from tilekiln)
  Downloading PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)
Collecting uvicorn (from tilekiln)
  Downloading uvicorn-0.29.0-py3-none-any.whl.metadata (6.3 kB)
Collecting starlette<0.38.0,>=0.37.2 (from fastapi->tilekiln)
  Downloading starlette-0.37.2-py3-none-any.whl.metadata (5.9 kB)
Collecting pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4 (from fastapi->tilekiln)
  Downloading pydantic-2.7.1-py3-none-any.whl.metadata (107 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 107.3/107.3 kB 2.1 MB/s eta 0:00:00
Collecting typing-extensions>=4.8.0 (from fastapi->tilekiln)
  Downloading typing_extensions-4.11.0-py3-none-any.whl.metadata (3.0 kB)
Collecting fastapi-cli>=0.0.2 (from fastapi->tilekiln)
  Downloading fastapi_cli-0.0.2-py3-none-any.whl.metadata (6.8 kB)
Collecting httpx>=0.23.0 (from fastapi->tilekiln)
  Downloading httpx-0.27.0-py3-none-any.whl.metadata (7.2 kB)
Collecting python-multipart>=0.0.7 (from fastapi->tilekiln)
  Downloading python_multipart-0.0.9-py3-none-any.whl.metadata (2.5 kB)
Collecting ujson!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,>=4.0.1 (from fastapi->tilekiln)
  Downloading ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.7 kB)
Collecting orjson>=3.2.1 (from fastapi->tilekiln)
  Downloading orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (49 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 49.7/49.7 kB 2.4 MB/s eta 0:00:00
Collecting email_validator>=2.0.0 (from fastapi->tilekiln)
  Downloading email_validator-2.1.1-py3-none-any.whl.metadata (26 kB)
Collecting MarkupSafe>=2.0 (from jinja2->tilekiln)
  Downloading MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)
Collecting h11>=0.8 (from uvicorn->tilekiln)
  Downloading h11-0.14.0-py3-none-any.whl.metadata (8.2 kB)
Collecting appdirs~=1.4.3 (from fs->tilekiln)
  Downloading appdirs-1.4.4-py2.py3-none-any.whl.metadata (9.0 kB)
Collecting setuptools (from fs->tilekiln)
  Downloading setuptools-69.5.1-py3-none-any.whl.metadata (6.2 kB)
Collecting six~=1.10 (from fs->tilekiln)
  Downloading six-1.16.0-py2.py3-none-any.whl.metadata (1.8 kB)
Collecting psycopg-pool (from psycopg[pool]->tilekiln)
  Downloading psycopg_pool-3.2.1-py3-none-any.whl.metadata (2.6 kB)
Collecting dnspython>=2.0.0 (from email_validator>=2.0.0->fastapi->tilekiln)
  Downloading dnspython-2.6.1-py3-none-any.whl.metadata (5.8 kB)
Collecting idna>=2.0.0 (from email_validator>=2.0.0->fastapi->tilekiln)
  Downloading idna-3.7-py3-none-any.whl.metadata (9.9 kB)
Collecting typer>=0.12.3 (from fastapi-cli>=0.0.2->fastapi->tilekiln)
  Downloading typer-0.12.3-py3-none-any.whl.metadata (15 kB)
Collecting anyio (from httpx>=0.23.0->fastapi->tilekiln)
  Downloading anyio-4.3.0-py3-none-any.whl.metadata (4.6 kB)
Collecting certifi (from httpx>=0.23.0->fastapi->tilekiln)
  Downloading certifi-2024.2.2-py3-none-any.whl.metadata (2.2 kB)
Collecting httpcore==1.* (from httpx>=0.23.0->fastapi->tilekiln)
  Downloading httpcore-1.0.5-py3-none-any.whl.metadata (20 kB)
Collecting sniffio (from httpx>=0.23.0->fastapi->tilekiln)
  Downloading sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB)
Collecting annotated-types>=0.4.0 (from pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4->fastapi->tilekiln)
  Downloading annotated_types-0.6.0-py3-none-any.whl.metadata (12 kB)
Collecting pydantic-core==2.18.2 (from pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4->fastapi->tilekiln)
  Downloading pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.5 kB)
Collecting httptools>=0.5.0 (from uvicorn[standard]>=0.12.0->fastapi->tilekiln)
  Downloading httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.6 kB)
Collecting python-dotenv>=0.13 (from uvicorn[standard]>=0.12.0->fastapi->tilekiln)
  Downloading python_dotenv-1.0.1-py3-none-any.whl.metadata (23 kB)
Collecting uvloop!=0.15.0,!=0.15.1,>=0.14.0 (from uvicorn[standard]>=0.12.0->fastapi->tilekiln)
  Downloading uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.9 kB)
Collecting watchfiles>=0.13 (from uvicorn[standard]>=0.12.0->fastapi->tilekiln)
  Downloading watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.9 kB)
Collecting websockets>=10.4 (from uvicorn[standard]>=0.12.0->fastapi->tilekiln)
  Downloading websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)
Collecting shellingham>=1.3.0 (from typer>=0.12.3->fastapi-cli>=0.0.2->fastapi->tilekiln)
  Downloading shellingham-1.5.4-py2.py3-none-any.whl.metadata (3.5 kB)
Collecting rich>=10.11.0 (from typer>=0.12.3->fastapi-cli>=0.0.2->fastapi->tilekiln)
  Downloading rich-13.7.1-py3-none-any.whl.metadata (18 kB)
Collecting markdown-it-py>=2.2.0 (from rich>=10.11.0->typer>=0.12.3->fastapi-cli>=0.0.2->fastapi->tilekiln)
  Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB)
Collecting pygments<3.0.0,>=2.13.0 (from rich>=10.11.0->typer>=0.12.3->fastapi-cli>=0.0.2->fastapi->tilekiln)
  Downloading pygments-2.18.0-py3-none-any.whl.metadata (2.5 kB)
Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich>=10.11.0->typer>=0.12.3->fastapi-cli>=0.0.2->fastapi->tilekiln)
  Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)
Downloading tilekiln-0.4.0-py3-none-any.whl (33 kB)
Downloading click-8.1.7-py3-none-any.whl (97 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 97.9/97.9 kB 1.8 MB/s eta 0:00:00
Downloading fastapi-0.111.0-py3-none-any.whl (91 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 92.0/92.0 kB 2.7 MB/s eta 0:00:00
Downloading jinja2-3.1.4-py3-none-any.whl (133 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.3/133.3 kB 2.7 MB/s eta 0:00:00
Downloading uvicorn-0.29.0-py3-none-any.whl (60 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 60.8/60.8 kB 1.7 MB/s eta 0:00:00
Downloading fs-2.4.16-py2.py3-none-any.whl (135 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 135.3/135.3 kB 2.2 MB/s eta 0:00:00
Downloading prometheus_client-0.20.0-py3-none-any.whl (54 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 54.5/54.5 kB 1.7 MB/s eta 0:00:00
Downloading psycopg-3.1.18-py3-none-any.whl (178 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 178.1/178.1 kB 3.1 MB/s eta 0:00:00
Downloading PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (724 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 725.0/725.0 kB 2.2 MB/s eta 0:00:00
Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Downloading email_validator-2.1.1-py3-none-any.whl (30 kB)
Downloading fastapi_cli-0.0.2-py3-none-any.whl (9.1 kB)
Downloading h11-0.14.0-py3-none-any.whl (58 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 58.3/58.3 kB 3.2 MB/s eta 0:00:00
Downloading httpx-0.27.0-py3-none-any.whl (75 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 75.6/75.6 kB 1.6 MB/s eta 0:00:00
Downloading httpcore-1.0.5-py3-none-any.whl (77 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 77.9/77.9 kB 5.4 MB/s eta 0:00:00
Downloading MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB)
Downloading orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (142 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 142.7/142.7 kB 2.3 MB/s eta 0:00:00
Downloading pydantic-2.7.1-py3-none-any.whl (409 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 409.3/409.3 kB 2.9 MB/s eta 0:00:00
Downloading pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 2.6 MB/s eta 0:00:00
Downloading python_multipart-0.0.9-py3-none-any.whl (22 kB)
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Downloading starlette-0.37.2-py3-none-any.whl (71 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.9/71.9 kB 2.1 MB/s eta 0:00:00
Downloading typing_extensions-4.11.0-py3-none-any.whl (34 kB)
Downloading ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (53 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.4/53.4 kB 1.0 MB/s eta 0:00:00
Downloading psycopg_pool-3.2.1-py3-none-any.whl (37 kB)
Downloading setuptools-69.5.1-py3-none-any.whl (894 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 894.6/894.6 kB 2.8 MB/s eta 0:00:00
Downloading annotated_types-0.6.0-py3-none-any.whl (12 kB)
Downloading anyio-4.3.0-py3-none-any.whl (85 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.6/85.6 kB 1.4 MB/s eta 0:00:00
Downloading dnspython-2.6.1-py3-none-any.whl (307 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 307.7/307.7 kB 3.1 MB/s eta 0:00:00
Downloading httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (344 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 344.7/344.7 kB 2.6 MB/s eta 0:00:00
Downloading idna-3.7-py3-none-any.whl (66 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 66.8/66.8 kB 4.7 MB/s eta 0:00:00
Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB)
Downloading sniffio-1.3.1-py3-none-any.whl (10 kB)
Downloading typer-0.12.3-py3-none-any.whl (47 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47.2/47.2 kB 1.7 MB/s eta 0:00:00
Downloading uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.2/4.2 MB 2.6 MB/s eta 0:00:00
Downloading watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 3.0 MB/s eta 0:00:00
Downloading websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 131.2/131.2 kB 2.7 MB/s eta 0:00:00
Downloading certifi-2024.2.2-py3-none-any.whl (163 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 163.8/163.8 kB 3.5 MB/s eta 0:00:00
Downloading rich-13.7.1-py3-none-any.whl (240 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 240.7/240.7 kB 2.6 MB/s eta 0:00:00
Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)
Downloading markdown_it_py-3.0.0-py3-none-any.whl (87 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 87.5/87.5 kB 4.4 MB/s eta 0:00:00
Downloading pygments-2.18.0-py3-none-any.whl (1.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 2.7 MB/s eta 0:00:00
Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Installing collected packages: appdirs, websockets, uvloop, ujson, typing-extensions, sniffio, six, shellingham, setuptools, pyyaml, python-multipart, python-dotenv, pygments, prometheus-client, orjson, mdurl, MarkupSafe, idna, httptools, h11, dnspython, click, certifi, annotated-types, uvicorn, pydantic-core, psycopg-pool, psycopg, markdown-it-py, jinja2, httpcore, fs, email_validator, anyio, watchfiles, starlette, rich, pydantic, httpx, typer, fastapi-cli, fastapi, tilekiln
Successfully installed MarkupSafe-2.1.5 annotated-types-0.6.0 anyio-4.3.0 appdirs-1.4.4 certifi-2024.2.2 click-8.1.7 dnspython-2.6.1 email_validator-2.1.1 fastapi-0.111.0 fastapi-cli-0.0.2 fs-2.4.16 h11-0.14.0 httpcore-1.0.5 httptools-0.6.1 httpx-0.27.0 idna-3.7 jinja2-3.1.4 markdown-it-py-3.0.0 mdurl-0.1.2 orjson-3.10.3 prometheus-client-0.20.0 psycopg-3.1.18 psycopg-pool-3.2.1 pydantic-2.7.1 pydantic-core-2.18.2 pygments-2.18.0 python-dotenv-1.0.1 python-multipart-0.0.9 pyyaml-6.0.1 rich-13.7.1 setuptools-69.5.1 shellingham-1.5.4 six-1.16.0 sniffio-1.3.1 starlette-0.37.2 tilekiln-0.4.0 typer-0.12.3 typing-extensions-4.11.0 ujson-5.9.0 uvicorn-0.29.0 uvloop-0.19.0 watchfiles-0.21.0 websockets-12.0

But then I get this error:

~/tilekiln$ createdb flex
createdb: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  role "agi" does not exist

So I used the following command:

~/tilekiln$ sudo -u postgres -i

Then I could create the databases with the postgres user. But I am not sure, If this is a good workaround.

I have entered the sed command. You can see it in the next code-box. I get no error message. But I think it is not correct because the file ./osm2pgsql-themepark/config/shortbread_gen.lua is not changed. I’m not good enough with sed, so I can’t find the error. If I am correct, does a line need to be stripped out?

postgres@agi-VirtualBox:~$ sed -i -E -e "s/--.*(themepark:plugin\('tilekiln'\):write_config\('tk'\))/\1/" ./osm2pgsql-themepark/config/shortbread_gen.lua

The next command shows me warnings. Are these warnings more serious? The ending of the command execution looks good to me.

postgres@agi-VirtualBox:~$ LUA_PATH="./osm2pgsql-themepark/lua/?.lua;;" osm2pgsql -d flex -O flex -S ./osm2pgsql-themepark/config/shortbread_gen.lua small.pbf
2024-05-08 12:20:38  osm2pgsql version 1.11.0
2024-05-08 12:20:38  Database version: 16.2 (Ubuntu 16.2-1ubuntu4)
2024-05-08 12:20:38  PostGIS version: 3.4
2024-05-08 12:20:38  Storing properties to table '"public"."osm2pgsql_properties"'.
DEBUG: Doing full generalization: 	true
2024-05-08 12:20:38  WARNING: Table 'boundaries' doesn't have an id column. Two-stage processing, updates and expire will not work!
2024-05-08 12:20:38  WARNING: Table 'boundaries_l' doesn't have an id column. Two-stage processing, updates and expire will not work!
2024-05-08 12:20:38  WARNING: Table 'boundaries_m' doesn't have an id column. Two-stage processing, updates and expire will not work!
2024-05-08 12:20:38  WARNING: Table 'boundaries_s' doesn't have an id column. Two-stage processing, updates and expire will not work!
2024-05-08 12:20:38  WARNING: Table 'water_lines_gen' doesn't have an id column. Two-stage processing, updates and expire will not work!
...
...
2024-05-08 12:21:54  Analyzing table 'addresses'...
2024-05-08 12:21:54  All postprocessing on table 'addresses' done in 0s.
2024-05-08 12:21:54  Storing properties to table '"public"."osm2pgsql_properties"'.
2024-05-08 12:21:54  osm2pgsql took 76s (1m 16s) overall.

The next command shows me again an error, that I could not solve myself:


~$ LUA_PATH="./osm2pgsql-themepark/lua/?.lua;;" osm2pgsql-gen -d flex -S ./osm2pgsql-themepark/config/shortbread_gen.lua
osm2pgsql-gen: Command not found.

The next command works good again. But I am not sure, if I need to do this. I had imported external data (and fonts) via openstreetmap-carto/scripts/get-external-data.py at master Β· gravitystorm/openstreetmap-carto Β· GitHub before. I did this, because I first created png-tiles with the tutorial Manually building a tile server (Ubuntu 24.04) – Switch2OSM.

~$ mkdir -p downloads
osm2pgsql-themepark/themes/external/download-and-import.sh ./downloads flex oceans ocean
Downloading files...

Last question. When I want to serve I found the command

tilekiln/bin/tilekiln dev --config shortbread_config/config.yaml --source-dbname flex

But I do not know how to create or where to find the config shortbread_config/config.yaml.

Thanks.

It looks like a relative path. These are typically specified in relation to working directory, usually you can put absolute path there.

Note: this is guess based on typical CLI use.

Have you tried using tilekiln/bin/tilekiln --help or tilekiln/bin/tilekiln -h to try getting info provided by the command itself?

No. You want to create a user with sudo -u postgres createuser -s <your name>. This will create a superuser that can create databases.

Yes - there are updates to osm2pgsql-themepark that make that line unnecessary.

If you want to create the same vector tiles that I’m doing, I recommend following the steps for spirit - except you’d use venv/bin/tilekiln dev --config shortbread.yaml --source-dbname spirit and not run the subsequent commands.

To use these tiles you’ll also need a style, but a style editor like Maputnik will work. You could also use the version of the preview that accesses local tiles.

1 Like