You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by ad...@apache.org on 2022/12/08 13:48:20 UTC

[incubator-baremaps] branch main updated: Put back the examples along with a basic README.md (#551)

This is an automated email from the ASF dual-hosted git repository.

adrabble pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git


The following commit(s) were added to refs/heads/main by this push:
     new 9361d332 Put back the examples along with a basic README.md (#551)
9361d332 is described below

commit 9361d332925324c8f883db962daa0162606c2aa4
Author: Antoine Drabble <an...@gmail.com>
AuthorDate: Thu Dec 8 14:48:15 2022 +0100

    Put back the examples along with a basic README.md (#551)
---
 examples/_geoadmin/style.json                      |   31 +
 examples/_geoadmin/tileset.json                    |   29 +
 examples/_geoadmin/tileset.yaml                    |   19 +
 examples/contour/README.md                         |    5 +
 examples/contour/indexes.sql                       |    0
 .../contour/liecthenstein-aster-dem-v2-3857.tif    |  Bin 0 -> 1966773 bytes
 examples/contour/liecthenstein-aster-dem-v2.tif    |  Bin 0 -> 1739201 bytes
 examples/contour/style.json                        |   31 +
 examples/contour/tileset.json                      |   29 +
 examples/geocoding/README.md                       |    5 +
 examples/geocoding/workflow.js                     |   14 +
 examples/ip-to-location/README.md                  |    5 +
 examples/ip-to-location/workflow.js                |   52 +
 examples/naturalearth/README.md                    |    5 +
 examples/naturalearth/indexes.sql                  |  135 ++
 examples/naturalearth/style.json                   |   33 +
 examples/naturalearth/tileset.json                 | 1360 ++++++++++++++++++++
 examples/naturalearth/workflow.json                |   32 +
 examples/openstreetmap/README.md                   |    5 +
 examples/openstreetmap/indexes.sql                 |    5 +
 .../openstreetmap/liechtenstein-latest.osm.pbf     |  Bin 0 -> 2710779 bytes
 examples/openstreetmap/style.js                    |   26 +
 examples/openstreetmap/style.json                  |   26 +
 examples/openstreetmap/tileset.json                |  521 ++++++++
 examples/openstreetmap/workflow.json               |   42 +
 25 files changed, 2410 insertions(+)

diff --git a/examples/_geoadmin/style.json b/examples/_geoadmin/style.json
new file mode 100644
index 00000000..af13470d
--- /dev/null
+++ b/examples/_geoadmin/style.json
@@ -0,0 +1,31 @@
+{
+  "version" : 8,
+  "sources" : {
+    "baremaps" : {
+      "type" : "vector",
+      "url" : "http://localhost:9000/tiles.json"
+    }
+  },
+  "layers" : [ {
+    "id" : "background",
+    "type" : "background",
+    "maxzoom" : 24,
+    "paint" : {
+      "background-color" : "rgba(255, 255, 255, 1)"
+    }
+  }, {
+    "id" : "geoadmin_traffic_noise_day",
+    "type" : "line",
+    "source" : "baremaps",
+    "source-layer" : "geoadmin_traffic_noise_day",
+    "layout" : {
+      "line-cap" : "round",
+      "line-join" : "round"
+    },
+    "paint" : {
+      "line-color" : "rgba(181, 169, 152, 1)"
+    }
+  } ],
+  "center" : [ 9.5554, 47.166 ],
+  "zoom" : 14
+}
\ No newline at end of file
diff --git a/examples/_geoadmin/tileset.json b/examples/_geoadmin/tileset.json
new file mode 100644
index 00000000..167cff11
--- /dev/null
+++ b/examples/_geoadmin/tileset.json
@@ -0,0 +1,29 @@
+{
+  "tilejson": "2.1.0",
+  "center": [
+    6.5743,
+    46.5189,
+    14.0
+  ],
+  "bounds": [
+    9.471078,
+    47.04774,
+    9.636217,
+    47.27128
+  ],
+  "tiles": [
+    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt"
+  ],
+  "vector_layers": [
+    {
+      "id": "geoadmin_traffic_noise_day",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 20,
+          "sql": "SELECT ogc_fid, ('{level:' || dn::text || '}') as tags, wkb_geometry as geom FROM geoadmin_traffic_noise_day"
+        }
+      ]
+    }
+  ]
+}
diff --git a/examples/_geoadmin/tileset.yaml b/examples/_geoadmin/tileset.yaml
new file mode 100644
index 00000000..b21d19c8
--- /dev/null
+++ b/examples/_geoadmin/tileset.yaml
@@ -0,0 +1,19 @@
+id: 'contour'
+center:
+  lon: 6.5743
+  lat: 46.5189
+  zoom: 14
+bounds:
+  minLon: 5.8358
+  minLat: 45.6591
+  maxLon: 10.9794
+  maxLat: 47.8700
+  minZoom: 10
+  maxZoom: 20
+layers:
+  - id: 'geoadmin_traffic_noise_day'
+    type: 'geometry'
+    queries:
+      - minZoom: 12
+        maxZoom: 20
+        sql: SELECT ogc_fid, ('{level:' || dn::text || '}') as tags, wkb_geometry as geom FROM geoadmin_traffic_noise_day
diff --git a/examples/contour/README.md b/examples/contour/README.md
new file mode 100644
index 00000000..ad4aa084
--- /dev/null
+++ b/examples/contour/README.md
@@ -0,0 +1,5 @@
+# OpenStreetMap example
+
+This folder contains the required files to create and serve vector tiles from contour lines data. 
+
+Refer to the [official documentation](https://baremaps.apache.org/examples/import-contour-into-postgis/) for more information.
\ No newline at end of file
diff --git a/examples/contour/indexes.sql b/examples/contour/indexes.sql
new file mode 100644
index 00000000..e69de29b
diff --git a/examples/contour/liecthenstein-aster-dem-v2-3857.tif b/examples/contour/liecthenstein-aster-dem-v2-3857.tif
new file mode 100644
index 00000000..93f78b72
Binary files /dev/null and b/examples/contour/liecthenstein-aster-dem-v2-3857.tif differ
diff --git a/examples/contour/liecthenstein-aster-dem-v2.tif b/examples/contour/liecthenstein-aster-dem-v2.tif
new file mode 100644
index 00000000..e9e705cd
Binary files /dev/null and b/examples/contour/liecthenstein-aster-dem-v2.tif differ
diff --git a/examples/contour/style.json b/examples/contour/style.json
new file mode 100644
index 00000000..16047415
--- /dev/null
+++ b/examples/contour/style.json
@@ -0,0 +1,31 @@
+{
+  "version" : 8,
+  "sources" : {
+    "baremaps" : {
+      "type" : "vector",
+      "url" : "http://localhost:9000/tiles.json"
+    }
+  },
+  "layers" : [ {
+    "id" : "background",
+    "type" : "background",
+    "maxzoom" : 24,
+    "paint" : {
+      "background-color" : "rgba(255, 255, 255, 1)"
+    }
+  }, {
+    "id" : "aster_dem",
+    "type" : "line",
+    "source" : "baremaps",
+    "source-layer" : "aster_dem",
+    "layout" : {
+      "line-cap" : "round",
+      "line-join" : "round"
+    },
+    "paint" : {
+      "line-color" : "rgba(181, 169, 152, 1)"
+    }
+  } ],
+  "center" : [ 9.5554, 47.166 ],
+  "zoom" : 14
+}
\ No newline at end of file
diff --git a/examples/contour/tileset.json b/examples/contour/tileset.json
new file mode 100644
index 00000000..7999eb55
--- /dev/null
+++ b/examples/contour/tileset.json
@@ -0,0 +1,29 @@
+{
+  "tilejson": "2.1.0",
+  "center": [
+    9.5554,
+    47.166,
+    14.0
+  ],
+  "bounds": [
+    9.471078,
+    47.04774,
+    9.636217,
+    47.27128
+  ],
+  "tiles": [
+    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt"
+  ],
+  "vector_layers": [
+    {
+      "id": "aster_dem",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 20,
+          "sql": "SELECT ogc_fid, jsonb_build_object('elevation', elevation::text), wkb_geometry FROM aster_dem"
+        }
+      ]
+    }
+  ]
+}
diff --git a/examples/geocoding/README.md b/examples/geocoding/README.md
new file mode 100644
index 00000000..5ee027b4
--- /dev/null
+++ b/examples/geocoding/README.md
@@ -0,0 +1,5 @@
+# Geocoding example
+
+This folder contains the required files to create a geocoding web service. 
+
+Refer to the [official documentation](https://baremaps.apache.org/examples/geocoding/) for more information.
\ No newline at end of file
diff --git a/examples/geocoding/workflow.js b/examples/geocoding/workflow.js
new file mode 100644
index 00000000..6bd3f837
--- /dev/null
+++ b/examples/geocoding/workflow.js
@@ -0,0 +1,14 @@
+const geonamesUrl = "https://download.geonames.org/export/dump/allCountries.zip";
+
+// Fetch and unzip Geonames
+const FetchAndUnzipGeonames = {id: "fetch-geonames-allcountries", needs: [], tasks: [
+    {type: "DownloadUrl", url: geonamesUrl, path: "downloads/geonames-allcountries.zip", force: true},
+    {type: "UnzipFile", file: "downloads/geonames-allcountries.zip", directory: "archives"}
+]};
+
+// Create the Geocoder index
+const createGeonamesIndex = {id: "geocoder-index", needs: [FetchAndUnzipGeonames.id], tasks: [
+    {type: "CreateGeonamesIndex", geonamesDumpPath: "archives/allCountries.txt", targetGeonamesIndexPath: "geocoder-index"}
+]};
+
+export default {"steps": [FetchAndUnzipGeonames, createGeonamesIndex]};
\ No newline at end of file
diff --git a/examples/ip-to-location/README.md b/examples/ip-to-location/README.md
new file mode 100644
index 00000000..528d1158
--- /dev/null
+++ b/examples/ip-to-location/README.md
@@ -0,0 +1,5 @@
+# IP to location example
+
+This folder contains the required files to create a web service for geo-localisation by IP address. 
+
+Refer to the [official documentation](https://baremaps.apache.org/examples/ip-to-location/) for more information.
\ No newline at end of file
diff --git a/examples/ip-to-location/workflow.js b/examples/ip-to-location/workflow.js
new file mode 100644
index 00000000..f6410821
--- /dev/null
+++ b/examples/ip-to-location/workflow.js
@@ -0,0 +1,52 @@
+const nics = [
+    {url: "https://ftp.afrinic.net/pub/dbase/afrinic.db.gz", filename: "afrinic.db"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.as-block.gz", filename: "apnic.db.as-block.db"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.as-set.gz", filename: "apnic.db.as-set.db"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.domain.gz", filename: "apnic.db.domain"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.filter-set.gz", filename: "apnic.db.filter-set"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.inet-rtr.gz", filename: "apnic.db.inet-rtr"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.inet6num.gz", filename: "apnic.db.inet6num"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.inetnum.gz", filename: "apnic.db.inetnum"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.irt.gz", filename: "apnic.db.irt"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.key-cert.gz", filename: "apnic.db.key-cert"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.limerick.gz", filename: "apnic.db.limerick"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.mntner.gz", filename: "apnic.db.mntner"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.organisation.gz", filename: "apnic.db.organisation"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.peering-set.gz", filename: "apnic.db.peering-set"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.role.gz", filename: "apnic.db.role"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.route-set.gz", filename: "apnic.db.route-set"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.route.gz", filename: "apnic.db.route"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.route6.gz", filename: "apnic.db.route6"},
+    {url: "https://ftp.apnic.net/apnic/whois/apnic.db.rtr-set.gz", filename: "apnic.db.rtr-set"},
+    {url: "https://ftp.arin.net/pub/rr/arin.db.gz", filename: "arin.db"},
+    {url: "https://ftp.lacnic.net/lacnic/dbase/lacnic.db.gz", filename: "lacnic.db"},
+    {url: "https://ftp.ripe.net/ripe/dbase/ripe.db.gz", filename: "ripe.db"},
+];
+
+const geonamesUrl =
+    "https://download.geonames.org/export/dump/allCountries.zip";
+
+// Iterate over nic urls to create a list of downloads and ungzip
+const fetchAndUnzipNic = nics.map((nic,index) =>
+    ({id: `fetch-nic-${index}`, needs: [], tasks: [
+        {type: "DownloadUrl", url: nic.url, path: `downloads/${nic.filename}.gz`},
+        {type: "UngzipFile", file: `downloads/${nic.filename}.gz`, directory: "archives"}
+    ]}));
+
+// Fetch and unzip Geonames
+const FetchAndUnzipGeonames = {id: "fetch-geonames-allcountries", needs: [], tasks: [
+    {type: "DownloadUrl", url: geonamesUrl, path: "downloads/geonames-allcountries.zip", force: true},
+    {type: "UnzipFile", file: "downloads/geonames-allcountries.zip", directory: "archives"}
+]};
+
+// Create the Geocoder index
+const createGeonamesIndex = {id: "geocoder-index", needs: [FetchAndUnzipGeonames.id], tasks: [
+    {type: "CreateGeonamesIndex", geonamesDumpPath: "archives/allCountries.txt", targetGeonamesIndexPath: "geocoder-index"}
+]};
+
+// Create the iploc database
+const createIplocIndex = {id: "iploc-index", needs: fetchAndUnzipNic.map(e => e.id).concat([createGeonamesIndex.id]), tasks: [
+    {type: "CreateIplocIndex", geonamesIndexPath: "geocoder-index", iplocNicPath: fetchAndUnzipNic.map(nicStep => nicStep.tasks[1].file.replaceAll(".db.gz", ".txt")), targetIplocIndexPath: "iploc.db"}
+]};
+
+export default {"steps": fetchAndUnzipNic.concat([FetchAndUnzipGeonames, createGeonamesIndex, createIplocIndex])};
\ No newline at end of file
diff --git a/examples/naturalearth/README.md b/examples/naturalearth/README.md
new file mode 100644
index 00000000..f189535a
--- /dev/null
+++ b/examples/naturalearth/README.md
@@ -0,0 +1,5 @@
+# Natural Earth example
+
+This folder contains the required files to create and serve vector tiles from Natural Earth data. 
+
+Refer to the [official documentation](https://baremaps.apache.org/examples/import-natural-earth-into-postgis/) for more information.
\ No newline at end of file
diff --git a/examples/naturalearth/indexes.sql b/examples/naturalearth/indexes.sql
new file mode 100644
index 00000000..109077c7
--- /dev/null
+++ b/examples/naturalearth/indexes.sql
@@ -0,0 +1,135 @@
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_antarctic_claim_limit_lines_gix ON ne_10m_admin_0_antarctic_claim_limit_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_antarctic_claims_gix ON ne_10m_admin_0_antarctic_claims USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_disputed_areas_gix ON ne_10m_admin_0_boundary_lines_disputed_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_land_gix ON ne_10m_admin_0_boundary_lines_land USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_map_units_gix ON ne_10m_admin_0_boundary_lines_map_units USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_boundary_lines_maritime_indicator_gix ON ne_10m_admin_0_boundary_lines_maritime_indicator USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_countries_gix ON ne_10m_admin_0_countries USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_countries_lakes_gix ON ne_10m_admin_0_countries_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_disputed_areas_gix ON ne_10m_admin_0_disputed_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_disputed_areas_scale_rank_minor_islands_gix ON ne_10m_admin_0_disputed_areas_scale_rank_minor_islands USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_label_points_gix ON ne_10m_admin_0_label_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_map_subunits_gix ON ne_10m_admin_0_map_subunits USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_map_units_gix ON ne_10m_admin_0_map_units USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_pacific_groupings_gix ON ne_10m_admin_0_pacific_groupings USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_scale_rank_gix ON ne_10m_admin_0_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_scale_rank_minor_islands_gix ON ne_10m_admin_0_scale_rank_minor_islands USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_seams_gix ON ne_10m_admin_0_seams USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_0_sovereignty_gix ON ne_10m_admin_0_sovereignty USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_label_points_details_gix ON ne_10m_admin_1_label_points_details USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_label_points_gix ON ne_10m_admin_1_label_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_seams_gix ON ne_10m_admin_1_seams USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_gix ON ne_10m_admin_1_states_provinces USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_lakes_gix ON ne_10m_admin_1_states_provinces_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_lines_gix ON ne_10m_admin_1_states_provinces_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_scale_rank_gix ON ne_10m_admin_1_states_provinces_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_admin_1_states_provinces_scale_rank_minor_islands_gix ON ne_10m_admin_1_states_provinces_scale_rank_minor_islands USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_airports_gix ON ne_10m_airports USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_antarctic_ice_shelves_lines_gix ON ne_10m_antarctic_ice_shelves_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_antarctic_ice_shelves_polys_gix ON ne_10m_antarctic_ice_shelves_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_coastline_gix ON ne_10m_coastline USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_geographic_lines_gix ON ne_10m_geographic_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_geography_marine_polys_gix ON ne_10m_geography_marine_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_geography_regions_elevation_points_gix ON ne_10m_geography_regions_elevation_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_geography_regions_points_gix ON ne_10m_geography_regions_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_geography_regions_polys_gix ON ne_10m_geography_regions_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_glaciated_areas_gix ON ne_10m_glaciated_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_lakes_europe_gix ON ne_10m_lakes_europe USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_lakes_gix ON ne_10m_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_lakes_historic_gix ON ne_10m_lakes_historic USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_lakes_north_america_gix ON ne_10m_lakes_north_america USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_lakes_pluvial_gix ON ne_10m_lakes_pluvial USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_land_gix ON ne_10m_land USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_land_ocean_label_points_gix ON ne_10m_land_ocean_label_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_land_ocean_seams_gix ON ne_10m_land_ocean_seams USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_land_scale_rank_gix ON ne_10m_land_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_minor_islands_coastline_gix ON ne_10m_minor_islands_coastline USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_minor_islands_gix ON ne_10m_minor_islands USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_minor_islands_label_points_gix ON ne_10m_minor_islands_label_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_ocean_gix ON ne_10m_ocean USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_ocean_scale_rank_gix ON ne_10m_ocean_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_area_gix ON ne_10m_parks_and_protected_lands_area USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_line_gix ON ne_10m_parks_and_protected_lands_line USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_point_gix ON ne_10m_parks_and_protected_lands_point USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_parks_and_protected_lands_scale_rank_gix ON ne_10m_parks_and_protected_lands_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_playas_gix ON ne_10m_playas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_populated_places_gix ON ne_10m_populated_places USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_populated_places_simple_gix ON ne_10m_populated_places_simple USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_ports_gix ON ne_10m_ports USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_railroads_gix ON ne_10m_railroads USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_railroads_north_america_gix ON ne_10m_railroads_north_america USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_reefs_gix ON ne_10m_reefs USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_rivers_europe_gix ON ne_10m_rivers_europe USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_gix ON ne_10m_rivers_lake_centerlines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_scale_rank_gix ON ne_10m_rivers_lake_centerlines_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_rivers_north_america_gix ON ne_10m_rivers_north_america USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_roads_gix ON ne_10m_roads USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_roads_north_america_gix ON ne_10m_roads_north_america USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_time_zones_gix ON ne_10m_time_zones USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_urban_areas_gix ON ne_10m_urban_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_10m_urban_areas_landscan_gix ON ne_10m_urban_areas_landscan USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_boundary_lines_land_gix ON ne_110m_admin_0_boundary_lines_land USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_countries_gix ON ne_110m_admin_0_countries USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_countries_lakes_gix ON ne_110m_admin_0_countries_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_map_units_gix ON ne_110m_admin_0_map_units USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_pacific_groupings_gix ON ne_110m_admin_0_pacific_groupings USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_scale_rank_gix ON ne_110m_admin_0_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_sovereignty_gix ON ne_110m_admin_0_sovereignty USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_0_tiny_countries_gix ON ne_110m_admin_0_tiny_countries USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_gix ON ne_110m_admin_1_states_provinces USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_lakes_gix ON ne_110m_admin_1_states_provinces_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_lines_gix ON ne_110m_admin_1_states_provinces_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_admin_1_states_provinces_scale_rank_gix ON ne_110m_admin_1_states_provinces_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_coastline_gix ON ne_110m_coastline USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_geographic_lines_gix ON ne_110m_geographic_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_geography_marine_polys_gix ON ne_110m_geography_marine_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_geography_regions_elevation_points_gix ON ne_110m_geography_regions_elevation_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_geography_regions_points_gix ON ne_110m_geography_regions_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_geography_regions_polys_gix ON ne_110m_geography_regions_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_glaciated_areas_gix ON ne_110m_glaciated_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_lakes_gix ON ne_110m_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_land_gix ON ne_110m_land USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_ocean_gix ON ne_110m_ocean USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_populated_places_gix ON ne_110m_populated_places USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_populated_places_simple_gix ON ne_110m_populated_places_simple USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_110m_rivers_lake_centerlines_gix ON ne_110m_rivers_lake_centerlines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_lines_disputed_areas_gix ON ne_50m_admin_0_boundary_lines_disputed_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_lines_land_gix ON ne_50m_admin_0_boundary_lines_land USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_lines_maritime_indicator_gix ON ne_50m_admin_0_boundary_lines_maritime_indicator USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_boundary_map_units_gix ON ne_50m_admin_0_boundary_map_units USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_breakaway_disputed_areas_gix ON ne_50m_admin_0_breakaway_disputed_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_breakaway_disputed_areas_scale_rank_gix ON ne_50m_admin_0_breakaway_disputed_areas_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_countries_gix ON ne_50m_admin_0_countries USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_countries_lakes_gix ON ne_50m_admin_0_countries_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_map_subunits_gix ON ne_50m_admin_0_map_subunits USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_map_units_gix ON ne_50m_admin_0_map_units USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_pacific_groupings_gix ON ne_50m_admin_0_pacific_groupings USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_scale_rank_gix ON ne_50m_admin_0_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_sovereignty_gix ON ne_50m_admin_0_sovereignty USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_tiny_countries_gix ON ne_50m_admin_0_tiny_countries USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_0_tiny_countries_scale_rank_gix ON ne_50m_admin_0_tiny_countries_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_gix ON ne_50m_admin_1_states_provinces USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_lakes_gix ON ne_50m_admin_1_states_provinces_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_lines_gix ON ne_50m_admin_1_states_provinces_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_admin_1_states_provinces_scale_rank_gix ON ne_50m_admin_1_states_provinces_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_airports_gix ON ne_50m_airports USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_lines_gix ON ne_50m_antarctic_ice_shelves_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_polys_gix ON ne_50m_antarctic_ice_shelves_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_coastline_gix ON ne_50m_coastline USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_geographic_lines_gix ON ne_50m_geographic_lines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_geography_marine_polys_gix ON ne_50m_geography_marine_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_geography_regions_elevation_points_gix ON ne_50m_geography_regions_elevation_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_geography_regions_points_gix ON ne_50m_geography_regions_points USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_geography_regions_polys_gix ON ne_50m_geography_regions_polys USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_glaciated_areas_gix ON ne_50m_glaciated_areas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_lakes_gix ON ne_50m_lakes USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_lakes_historic_gix ON ne_50m_lakes_historic USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_land_gix ON ne_50m_land USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_ocean_gix ON ne_50m_ocean USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_playas_gix ON ne_50m_playas USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_populated_places_gix ON ne_50m_populated_places USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_populated_places_simple_gix ON ne_50m_populated_places_simple USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_ports_gix ON ne_50m_ports USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_rivers_lake_centerlines_gix ON ne_50m_rivers_lake_centerlines USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_rivers_lake_centerlines_scale_rank_gix ON ne_50m_rivers_lake_centerlines_scale_rank USING SPGIST(geom);
+CREATE INDEX IF NOT EXISTS ne_50m_urban_areas_gix ON ne_50m_urban_areas USING SPGIST(geom);
diff --git a/examples/naturalearth/style.json b/examples/naturalearth/style.json
new file mode 100644
index 00000000..2fa41fd3
--- /dev/null
+++ b/examples/naturalearth/style.json
@@ -0,0 +1,33 @@
+{
+  "version" : 8,
+  "sources" : {
+    "baremaps" : {
+      "type" : "vector",
+      "url" : "http://localhost:9000/tiles.json"
+    }
+  },
+  "layers" : [ {
+    "id" : "ne_50m_admin_0_countries",
+    "type" : "fill",
+    "source" : "baremaps",
+    "source-layer" : "ne_50m_admin_0_countries",
+    "layout" : {
+      "visibility" : "visible"
+    },
+    "paint" : {
+      "fill-color" : "rgba(125, 105, 105, 1)",
+      "fill-outline-color" : "rgba(0, 0, 0, 1)"
+    }
+  }, {
+    "id" : "ne_10m_admin_0_countries",
+    "type" : "fill",
+    "source" : "baremaps",
+    "source-layer" : "ne_10m_admin_0_countries",
+    "paint" : {
+      "fill-color" : "rgba(125, 105, 105, 1)",
+      "fill-outline-color" : "rgba(0, 0, 0, 1)"
+    }
+  } ],
+  "center" : [ 0, 0 ],
+  "zoom" : 4
+}
\ No newline at end of file
diff --git a/examples/naturalearth/tileset.json b/examples/naturalearth/tileset.json
new file mode 100644
index 00000000..76164595
--- /dev/null
+++ b/examples/naturalearth/tileset.json
@@ -0,0 +1,1360 @@
+{
+  "tilejson": "2.2.0",
+  "minzoom": 0,
+  "maxzoom": 12,
+  "tiles": [
+    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt"
+  ],
+  "vector_layers": [
+    {
+      "id": "ne_110m_admin_0_boundary_lines_land",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_boundary_lines_land AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_countries",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_countries AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_countries_lakes",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_countries_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_map_units",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_map_units AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_pacific_groupings",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_pacific_groupings AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_scale_rank",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_sovereignty",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_sovereignty AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_0_tiny_countries",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_0_tiny_countries AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_1_states_provinces",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_1_states_provinces AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_1_states_provinces_lakes",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_1_states_provinces_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_1_states_provinces_lines",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_1_states_provinces_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_admin_1_states_provinces_scale_rank",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_admin_1_states_provinces_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_coastline",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_coastline AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_geographic_lines",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_geographic_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_geography_marine_polys",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_geography_marine_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_geography_regions_elevation_points",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_geography_regions_elevation_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_geography_regions_points",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_geography_regions_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_geography_regions_polys",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_geography_regions_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_glaciated_areas",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_glaciated_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_lakes",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_land",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_land AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_ocean",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_ocean AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_populated_places",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_populated_places AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_populated_places_simple",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_populated_places_simple AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_110m_rivers_lake_centerlines",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 2,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_110m_rivers_lake_centerlines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_boundary_lines_disputed_areas",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_boundary_lines_disputed_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_boundary_lines_land",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_boundary_lines_land AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_boundary_lines_maritime_indicator",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_boundary_lines_maritime_indicator AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_boundary_map_units",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_boundary_map_units AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_breakaway_disputed_areas",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_breakaway_disputed_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_breakaway_disputed_areas_scale_rank",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_breakaway_disputed_areas_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_countries",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_countries AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_countries_lakes",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_countries_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_map_subunits",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_map_subunits AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_map_units",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_map_units AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_pacific_groupings",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_pacific_groupings AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_scale_rank",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_sovereignty",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_sovereignty AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_tiny_countries",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_tiny_countries AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_0_tiny_countries_scale_rank",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_0_tiny_countries_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_1_states_provinces",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_1_states_provinces AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_1_states_provinces_lakes",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_1_states_provinces_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_1_states_provinces_lines",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_1_states_provinces_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_admin_1_states_provinces_scale_rank",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_admin_1_states_provinces_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_airports",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_airports AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_antarctic_ice_shelves_lines",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_antarctic_ice_shelves_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_antarctic_ice_shelves_polys",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_antarctic_ice_shelves_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_coastline",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_coastline AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_geographic_lines",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_geographic_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_geography_marine_polys",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_geography_marine_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_geography_regions_elevation_points",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_geography_regions_elevation_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_geography_regions_points",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_geography_regions_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_geography_regions_polys",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_geography_regions_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_glaciated_areas",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_glaciated_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_lakes",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_lakes_historic",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_lakes_historic AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_land",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_land AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_ocean",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_ocean AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_playas",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_playas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_populated_places",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_populated_places AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_populated_places_simple",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_populated_places_simple AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_ports",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_ports AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_rivers_lake_centerlines",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_rivers_lake_centerlines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_rivers_lake_centerlines_scale_rank",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_rivers_lake_centerlines_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_50m_urban_areas",
+      "queries": [
+        {
+          "minzoom": 2,
+          "maxzoom": 5,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_50m_urban_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_antarctic_claim_limit_lines",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_antarctic_claim_limit_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_antarctic_claims",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_antarctic_claims AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_boundary_lines_disputed_areas",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_boundary_lines_disputed_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_boundary_lines_land",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_boundary_lines_land AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_boundary_lines_map_units",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_boundary_lines_map_units AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_boundary_lines_maritime_indicator",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_boundary_lines_maritime_indicator AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_countries",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_countries AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_countries_lakes",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_countries_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_disputed_areas",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_disputed_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_disputed_areas_scale_rank_minor_islands",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_disputed_areas_scale_rank_minor_islands AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_label_points",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_label_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_map_subunits",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_map_subunits AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_map_units",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_map_units AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_pacific_groupings",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_pacific_groupings AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_scale_rank",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_scale_rank_minor_islands",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_scale_rank_minor_islands AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_seams",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_seams AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_0_sovereignty",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_0_sovereignty AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_label_points",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_label_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_label_points_details",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_label_points_details AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_seams",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_seams AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_states_provinces",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_states_provinces AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_states_provinces_lakes",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_states_provinces_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_states_provinces_lines",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_states_provinces_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_states_provinces_scale_rank",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_states_provinces_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_admin_1_states_provinces_scale_rank_minor_islands",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_admin_1_states_provinces_scale_rank_minor_islands AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_airports",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_airports AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_antarctic_ice_shelves_lines",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_antarctic_ice_shelves_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_antarctic_ice_shelves_polys",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_antarctic_ice_shelves_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_coastline",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_coastline AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_geographic_lines",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_geographic_lines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_geography_marine_polys",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_geography_marine_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_geography_regions_elevation_points",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_geography_regions_elevation_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_geography_regions_points",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_geography_regions_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_geography_regions_polys",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_geography_regions_polys AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_glaciated_areas",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_glaciated_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_lakes",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_lakes AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_lakes_europe",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_lakes_europe AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_lakes_historic",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_lakes_historic AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_lakes_north_america",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_lakes_north_america AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_lakes_pluvial",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_lakes_pluvial AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_land",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_land AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_land_ocean_label_points",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_land_ocean_label_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_land_ocean_seams",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_land_ocean_seams AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_land_scale_rank",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_land_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_minor_islands",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_minor_islands AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_minor_islands_coastline",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_minor_islands_coastline AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_minor_islands_label_points",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_minor_islands_label_points AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_ocean",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_ocean AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_ocean_scale_rank",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_ocean_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_parks_and_protected_lands_area",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_parks_and_protected_lands_area AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_parks_and_protected_lands_line",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_parks_and_protected_lands_line AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_parks_and_protected_lands_point",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_parks_and_protected_lands_point AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_parks_and_protected_lands_scale_rank",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_parks_and_protected_lands_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_playas",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_playas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_populated_places",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_populated_places AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_populated_places_simple",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_populated_places_simple AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_ports",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_ports AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_railroads",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_railroads AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_railroads_north_america",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_railroads_north_america AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_reefs",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_reefs AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_rivers_europe",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_rivers_europe AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_rivers_lake_centerlines",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_rivers_lake_centerlines AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_rivers_lake_centerlines_scale_rank",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_rivers_lake_centerlines_scale_rank AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_rivers_north_america",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_rivers_north_america AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_roads",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_roads AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_roads_north_america",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_roads_north_america AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_time_zones",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_time_zones AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_urban_areas",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_urban_areas AS t"
+        }
+      ]
+    },
+    {
+      "id": "ne_10m_urban_areas_landscan",
+      "queries": [
+        {
+          "minzoom": 5,
+          "maxzoom": 12,
+          "sql": "SELECT fid as id, '{}'::jsonb as tags, geom FROM ne_10m_urban_areas_landscan AS t"
+        }
+      ]
+    }
+  ]
+}
diff --git a/examples/naturalearth/workflow.json b/examples/naturalearth/workflow.json
new file mode 100644
index 00000000..bd9d6444
--- /dev/null
+++ b/examples/naturalearth/workflow.json
@@ -0,0 +1,32 @@
+{
+  "steps": [
+    {
+      "id": "natural_earth_vector",
+      "needs": [],
+      "tasks": [
+        {
+          "type": "DownloadUrl",
+          "url": "https://naciscdn.org/naturalearth/packages/natural_earth_vector.gpkg.zip",
+          "path": "natural_earth_vector.gpkg.zip"
+        },
+        {
+          "type": "UnzipFile",
+          "file": "natural_earth_vector.gpkg.zip",
+          "directory": "natural_earth_vector"
+        },
+        {
+          "type": "ImportGeoPackage",
+          "file": "natural_earth_vector/packages/natural_earth_vector.gpkg",
+          "database": "jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps",
+          "sourceSRID": 4326,
+          "targetSRID": 3857
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "indexes.sql",
+          "database": "jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps"
+        }
+      ]
+    }
+  ]
+}
diff --git a/examples/openstreetmap/README.md b/examples/openstreetmap/README.md
new file mode 100644
index 00000000..7e7d6ddb
--- /dev/null
+++ b/examples/openstreetmap/README.md
@@ -0,0 +1,5 @@
+# OpenStreetMap example
+
+This folder contains the required files to create and serve vector tiles from OpenStreetMap data. 
+
+Refer to the [official documentation](https://baremaps.apache.org/examples/import-osm-into-postgis/) for more information.
\ No newline at end of file
diff --git a/examples/openstreetmap/indexes.sql b/examples/openstreetmap/indexes.sql
new file mode 100644
index 00000000..6990e7b6
--- /dev/null
+++ b/examples/openstreetmap/indexes.sql
@@ -0,0 +1,5 @@
+CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_ways_gin ON osm_ways USING gin (nodes);
+CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_relations_gin ON osm_relations USING gin (member_refs);
+CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_nodes_gix ON osm_nodes USING GIST (geom);
+CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_ways_gix ON osm_ways USING GIST (geom);
+CREATE INDEX CONCURRENTLY IF NOT EXISTS osm_relations_gix ON osm_relations USING GIST (geom);
\ No newline at end of file
diff --git a/examples/openstreetmap/liechtenstein-latest.osm.pbf b/examples/openstreetmap/liechtenstein-latest.osm.pbf
new file mode 100644
index 00000000..591fd91d
Binary files /dev/null and b/examples/openstreetmap/liechtenstein-latest.osm.pbf differ
diff --git a/examples/openstreetmap/style.js b/examples/openstreetmap/style.js
new file mode 100644
index 00000000..127ae1a1
--- /dev/null
+++ b/examples/openstreetmap/style.js
@@ -0,0 +1,26 @@
+export default {
+  "version" : 8,
+  "sources" : {
+    "baremaps" : {
+      "type" : "vector",
+      "url" : "http://localhost:9000/tiles.json"
+    }
+  },
+  "layers" : [ {
+    "id" : "building",
+    "type" : "fill",
+    "source" : "baremaps",
+    "source-layer" : "building",
+    "layout" : {
+      "visibility" : "visible"
+    },
+    "paint" : {
+      "fill-color" : "rgba(255, 0, 0, 1)"
+    }
+  } ],
+  "center" : [ 9.5554, 47.166 ],
+  "metadata" : {
+    "maputnik:renderer" : "mbgljs"
+  },
+  "zoom" : 14
+};
\ No newline at end of file
diff --git a/examples/openstreetmap/style.json b/examples/openstreetmap/style.json
new file mode 100644
index 00000000..f64b679f
--- /dev/null
+++ b/examples/openstreetmap/style.json
@@ -0,0 +1,26 @@
+{
+  "version" : 8,
+  "sources" : {
+    "baremaps" : {
+      "type" : "vector",
+      "url" : "http://localhost:9000/tiles.json"
+    }
+  },
+  "layers" : [ {
+    "id" : "building",
+    "type" : "fill",
+    "source" : "baremaps",
+    "source-layer" : "building",
+    "layout" : {
+      "visibility" : "visible"
+    },
+    "paint" : {
+      "fill-color" : "rgba(255, 0, 0, 1)"
+    }
+  } ],
+  "center" : [ 9.5554, 47.166 ],
+  "metadata" : {
+    "maputnik:renderer" : "mbgljs"
+  },
+  "zoom" : 14
+}
\ No newline at end of file
diff --git a/examples/openstreetmap/tileset.json b/examples/openstreetmap/tileset.json
new file mode 100644
index 00000000..b714ed8a
--- /dev/null
+++ b/examples/openstreetmap/tileset.json
@@ -0,0 +1,521 @@
+{
+  "tilejson": "2.2.0",
+  "center": [
+    9.5554,
+    47.166,
+    14.0
+  ],
+  "bounds": [
+    9.471078,
+    47.04774,
+    9.636217,
+    47.27128
+  ],
+  "minzoom": 12.0,
+  "maxzoom": 14.0,
+  "tiles": [
+    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt"
+  ],
+  "vector_layers": [
+    {
+      "id": "aeroway",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'aeroway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'aeroway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'aeroway' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "waterway",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'waterway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'waterway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'waterway' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "landuse",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'landuse'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'landuse'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'landuse' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "railway",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'railway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'railway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'railway' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "highway",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'highway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'highway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'highway' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "public_transport",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'public_transport'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'public_transport'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'public_transport' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "aerialway",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'aerialway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'aerialway'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'aerialway' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "geological",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'geological'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'geological'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'geological' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "building",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'building'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'building'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'building' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "amenity",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'amenity'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'amenity'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'amenity' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "craft",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'craft'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'craft'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'craft' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "emergency",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'emergency'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'emergency'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'emergency' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "historic",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'historic'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'historic'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'historic' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "leisure",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'leisure'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'leisure'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'leisure' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "man_made",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'man_made'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'man_made'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'man_made' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "military",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'military'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'military'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'military' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "natural",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'natural'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'natural'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'natural' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "office",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'office'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'office'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'office' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "place",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'place'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'place'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'place' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "power",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'power'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'power'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'power' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "route",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'route'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'route'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'route' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "shop",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'shop'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'shop'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'shop' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "sport",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'sport'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'sport'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'sport' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "telecom",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'telecom'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'telecom'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'telecom' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    },
+    {
+      "id": "tourism",
+      "queries": [
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_nodes WHERE tags ? 'tourism'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'tourism'"
+        },
+        {
+          "minzoom": 12,
+          "maxzoom": 20,
+          "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'tourism' AND tags ->> 'type' = 'multipolygon'"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/examples/openstreetmap/workflow.json b/examples/openstreetmap/workflow.json
new file mode 100644
index 00000000..9ebd677a
--- /dev/null
+++ b/examples/openstreetmap/workflow.json
@@ -0,0 +1,42 @@
+{
+  "steps": [
+    {
+      "id": "download",
+      "needs": [],
+      "tasks": [
+        {
+          "type": "DownloadUrl",
+          "url": "https://download.geofabrik.de/europe/liechtenstein-latest.osm.pbf",
+          "path": "liechtenstein-latest.osm.pbf"
+        }
+      ]
+    },
+    {
+      "id": "import",
+      "needs": [
+        "download"
+      ],
+      "tasks": [
+        {
+          "type": "ImportOpenStreetMap",
+          "file": "liechtenstein-latest.osm.pbf",
+          "database": "jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps",
+          "databaseSrid": 3857
+        }
+      ]
+    },
+    {
+      "id": "index",
+      "needs": [
+        "import"
+      ],
+      "tasks": [
+        {
+          "type": "ExecuteSql",
+          "file": "indexes.sql",
+          "database": "jdbc:postgresql://localhost:5432/baremaps?&user=baremaps&password=baremaps"
+        }
+      ]
+    }
+  ]
+}