MapLibre
Download and process only the data you need
Overture data is released in the cloud-native format GeoParquet. It is further partitioned by theme and type. Downloading the data through a tool like DuckDB can take advantage of these properties, giving the best performance. After downloading and converting the data to GeoJSON, we can use tippecanoe to create a PMTiles archive for each theme.
- Places
- Placenames
- Buildings
- Roads
- Base (Land, Land Use & Water)
The places data theme represents business and points of interest in the real world. Read more about the places data schema in the documentation.
-
The following DuckDB query downloads places data within a specific bounding box and writes a
GeoJSONfile.LOAD spatial; -- noqa
-- Access the data on AWS in this example
SET s3_region='us-west-2';
COPY (
SELECT
names.primary AS name,
categories.primary as category,
ROUND(confidence,2) as confidence,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('s3://overturemaps-us-west-2/release/2025-10-22.0/theme=places/*/*')
WHERE
-- Point geometry doesn't require looking at both min and max:
bbox.xmin BETWEEN -122.68 AND -121.98 AND
bbox.ymin BETWEEN 47.36 AND 47.79
) TO 'seattle_places.geojson' WITH (FORMAT GDAL, DRIVER 'GeoJSON', SRS 'EPSG:4326'); -
Next, create a
pmtilesarchive fromseattle_places.geojsonwith tippecanoe.tippecanoe -fo places.pmtiles -Z13 -z13 -l places seattle_places.geojsonTippecanoe flag explanation
-fo places.pmtilesThe output file will be places.pmtiles. It will be overwritten if it exists.-Z13and-z13will produce a tileset starting at zoom 13 and going up to zoom 13 (only 1 zoom level).-l placesnames the layer "places"
The divisions theme contains named administrative units (countries, regions, counties, cities, etc.) and their boundaries. To add labels for populated places to the map, we query the divisions theme to get the primary name for each locality.
-
The following DuckDB queries downloads placenames from the divisions theme within the bounding box and saves it as
seattle_placenames.geojsonLOAD spatial; -- noqa
COPY (
SELECT
subtype,
locality_type,
names.primary as name,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('az://overturemapswestus2.blob.core.windows.net/release/2024-04-16-beta.0/theme=admins/type=locality/*', hive_partitioning=1)
WHERE bbox.xmin > -122.679404 AND bbox.xmax < -121.978275
AND bbox.ymin > 47.360619 AND bbox.ymax < 47.786336
) TO 'seattle_placenames.geojson'
WITH (FORMAT GDAL, DRIVER 'GeoJSON', SRS 'EPSG:4326'); -
Run tippecanoe to produce a
pmtilesarchive fromseattle_placenames.geojsontippecanoe -fo placenames.pmtiles -Z5 -z10 -l placenames seattle_placenames.geojsonTippecanoe flag explanation
-fo placenames.pmtilesis our output file. It will be overwritten if it exists.-Z5and-z10will produce a tileset starting at zoom 5 and going up to zoom 10.-l placenamesnames the layer "placenames"
Overture contains billions of buildings distributed across hundreds of GeoParquet files.
-
The following DuckDB query reads only the metadata of each file and then downloads only the buildings within our bounding box to a line-delimited
GeoJSONSeqfile.LOAD spatial; -- noqa
COPY (
SELECT
names.primary as name,
height,
level,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('az://overturemapswestus2.blob.core.windows.net/release/2025-10-22.0/theme=buildings/type=building/*', filename=true, hive_partitioning=1)
WHERE bbox.xmin > -122.68 AND bbox.xmax < -121.98
AND bbox.ymin > 47.36 AND bbox.ymax < 47.79
) TO 'seattle_buildings.geojsonseq' WITH (FORMAT GDAL, DRIVER 'GeoJSONSeq', SRS 'EPSG:4326'); -
Run tippecanoe to produce a
pmtilesarchive fromseattle_buildings.geojsonseqtippecanoe -fo buildings.pmtiles -Z13 -z13 -l buildings -P seattle_buildings.geojsonseqTippecanoe flag explanation
-fo buildings.pmtilesis our output file. It will be overwritten if it exists.-Z13and-z13will produce a tileset starting at zoom 13 and going up to zoom 13 (so only 1 zoom level).-l buildingsnames the layer "buildings"-Pallows tippecanoe to read the file in parallel. Since we created a GeoJSON sequence file instead of a single GeoJSON Feature Collection, tippecanoe can process the input data more efficiently.
The Overture transportation theme has two types: connectors and segments. To extract and render the road lines, we will query for type=segment.
-
This DuckDB query downloads road segments from Overture to a
GeoJSONSeqfile.LOAD spatial; -- noqa
COPY (
SELECT
id,
names.primary AS name,
subtype,
class,
subclass,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('s3://overturemaps-us-west-2/release/2025-10-22.0/theme=transportation/type=segment/*')
WHERE
subtype = 'road'
AND bbox.xmin > -122.68 AND bbox.xmax < -121.98
AND bbox.ymin > 47.36 AND bbox.ymax < 47.79
) TO 'seattle_roads.geojsonseq'
WITH (FORMAT GDAL, DRIVER 'GeoJSONSeq', SRS 'EPSG:4326'); -
Run tippecanoe to produce a
pmtilesarchive fromseattle_roads.geojsonseqtippecanoe -fo roads.pmtiles -Z10 -B10 -z13 -l roads -P seattle_roads.geojsonseqTippecanoe flag explanation
-fo roads.pmtilesis our output file. It will be overwritten if it exists.-Z10and-z13will produce a tileset starting at zoom 10 and going up to zoom 13.-B10will ensure that all featuers are present from zoom level 10.-l roadsnames the layer "roads"-Pallows tippecanoe to read the file in parallel. Since we created a GeoJSON sequence file instead of a single GeoJSON Feature Collection, tippecanoe can process the input data more efficiently.
-
The base theme contains five feature types:
infrastructure,land,land_cover,land_use, andwater. For this map, we want only the land, land use, and water features. We'll run three separate queries to obtain to obtain those features and combine them into a single pmtiles archive with different layers.1. DuckDB query to produce
land.geojsonseqLOAD spatial; -- noqa
COPY (
SELECT
subtype,
class,
names.primary AS name,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('s3://overturemaps-us-west-2/release/2025-10-22.0/theme=base/type=land/*')
WHERE
bbox.xmin > -122.68 AND bbox.xmax < -121.98
AND bbox.ymin > 47.36 AND bbox.ymax < 47.79
)
TO 'seattle_land.geojsonseq'
WITH (FORMAT GDAL, DRIVER 'GeoJSONSeq', SRS 'EPSG:4326');2. DuckDB query to produce
land_use.geojsonseqLOAD spatial; -- noqa
COPY (
SELECT
subtype,
class,
names.primary AS name,
surface,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('s3://overturemaps-us-west-2/release/2025-10-22.0/theme=base/type=land_use/*')
WHERE
bbox.xmin > -122.68 AND bbox.xmax < -121.98
AND bbox.ymin > 47.36 AND bbox.ymax < 47.79
)
TO 'seattle_land_use.geojsonseq' WITH (FORMAT GDAL, DRIVER 'GeoJSONSeq', SRS 'EPSG:4326');3. DuckDB query to produce
water.geojsonseqLOAD spatial; -- noqa
COPY (
SELECT
subtype,
class,
names.primary AS name,
geometry -- DuckDB v.1.1.0 will autoload this as a `geometry` type
FROM read_parquet('s3://overturemaps-us-west-2/release/2025-10-22.0/theme=base/type=water/*')
WHERE
subtype in ('ocean', 'lake', 'pond', 'reservoir', 'river', 'stream', 'water', 'canal')
AND bbox.xmin > -123 AND bbox.xmax < -122
AND bbox.ymin > 47 AND bbox.ymax < 48
) TO 'seattle_water.geojsonseq' WITH (FORMAT GDAL, DRIVER 'GeoJSONSeq', SRS 'EPSG:4326');Note: We use a slightly larger bounding box to capture the Ocean water polygons, too
-
Run tippecanoe to produce a
pmtilesarchive with threegeojsonseqfile as input:tippecanoe -fo base.pmtiles -Z8 -z13 -P \
--named-layer=land:seattle_land.geojsonseq \
--named-layer=landuse:seattle_land_use.geojsonseq \
--named-layer=water:seattle_water.geojsonseqTippecanoe flag explanation
-fo tiles/base.pmtilesis our output file. It will be overwritten if it exists.-Z8and-z13will produce a tileset starting at zoom 8 going up to zoom 13.--named-layer=land:seattle_land.geojsonseqcreates thelandlayer from the contents ofseattle_land.geojson(and similarly for the other files)-Pallows tippecanoe to read the file in parallel. Since we created a GeoJSON sequence file instead of a single GeoJSON Feature Collection, tippecanoe can process the input data more efficiently.
Create your map with Maplibre + PMTiles
At this point, we have created five PMTiles archives from five of the Overture themes:
places.pmtilesplacenames.pmtilesbuildings.pmtilesroads.pmtilesbase.pmtiles
The map on this page combines a react maplibre example with PMTiles. You can view the source for the above map on github for a complete example using react, or, check out the map based on July's release for a non-react implementation of PMTiles.
Using PMTiles with react requires adding the PMtiles protocol:
import maplibregl from 'maplibre-gl';
import { Protocol } from 'pmtiles';
useEffect(() => {
let protocol = new Protocol();
maplibregl.addProtocol("pmtiles",protocol.tile);
... initialize your map here ...
return () => {
maplibregl.removeProtocol("pmtiles");
}
}, []);
Then, reference the tile archives with a relative path when initializing the map:
style: {
sources: {
roads: {
type: "vector",
url: "pmtiles://../example-map/tiles/roads.pmtiles"
},
places: {
type: "vector",
url: "pmtiles://../example-map/tiles/places.pmtiles"
},
...
Style the layers
Each tab below contains the complete styles in the Maplibre Style Spec for the map on this page.
- Places
- Placenames
- Buildings
- Roads
- Land
- Landuse
- Water
{
"id": "placesLabel",
"type": "symbol",
"source": "places",
"source-layer": "places",
"filter": [
"all",
[
"has",
"name"
],
[
">",
[
"get",
"confidence"
],
0.75
]
],
"minzoom": 15,
"maxzoom": 24,
"layout": {
"text-field": [
"concat",
"■\n",
[
"get",
"name"
]
],
"text-font": [
"Noto Sans Bold"
],
"text-max-width": 5,
"text-size": 10,
"text-line-height": 1,
"text-justify": "center",
"text-anchor": "center",
"text-radial-offset": 0.8,
"text-padding": 4
},
"paint": {
"text-color": "#071F3F",
"text-halo-color": "#dce6ef",
"text-halo-width": 1
}
}
{
"placeHighZoom": {
"id": "placeHighZoom",
"type": "symbol",
"source": "placenames",
"source-layer": "placenames",
"minzoom": 9,
"maxzoom": 24,
"layout": {
"text-field": [
"get",
"name"
],
"text-font": [
"Noto Sans Bold"
],
"text-size": [
"step",
[
"zoom"
],
14,
10,
[
"match",
[
"get",
"locality_type"
],
[
"borough"
],
14,
[
"suburb"
],
12,
0
],
12,
[
"match",
[
"get",
"locality_type"
],
[
"borough"
],
16,
[
"suburb"
],
14,
[
"neighborhood"
],
10,
0
],
14,
[
"match",
[
"get",
"locality_type"
],
[
"borough"
],
18,
[
"suburb"
],
16,
[
"neighborhood"
],
12,
0
],
15,
[
"match",
[
"get",
"locality_type"
],
[
"borough"
],
20,
[
"suburb"
],
18,
[
"neighborhood"
],
14,
0
],
16,
[
"match",
[
"get",
"locality_type"
],
[
"borough"
],
20,
[
"suburb"
],
18,
[
"neighborhood"
],
14,
[
"block"
],
12,
0
]
],
"text-transform": [
"step",
[
"zoom"
],
"none",
11,
"uppercase"
],
"text-max-width": 6,
"symbol-avoid-edges": true,
"text-padding": 10,
"text-justify": "auto"
},
"paint": {
"text-color": "#071F3F",
"text-halo-color": "#dce6ef",
"text-halo-width": 1
}
},
"placeMidZoom": {
"id": "placeMidZoom",
"type": "symbol",
"source": "placenames",
"source-layer": "placenames",
"minzoom": 8,
"maxzoom": 24,
"filter": [
"all",
[
"has",
"name"
],
[
"step",
[
"zoom"
],
[
"==",
"$type",
"Point"
],
8,
[
"match",
[
"get",
"localityType"
],
[
"settlement"
],
true,
false
],
9,
[
"match",
[
"get",
"localityType"
],
[
"urban",
"settlement"
],
true,
false
]
]
],
"layout": {
"text-field": [
"get",
"name"
],
"text-font": [
"Noto Sans Bold"
],
"text-size": [
"step",
[
"zoom"
],
10,
9,
[
"match",
[
"get",
"localityType"
],
[
"megacity"
],
20,
[
"metropolis"
],
18,
[
"city"
],
16,
[
"municipality"
],
14,
[
"town"
],
10,
0
],
10,
[
"match",
[
"get",
"localityType"
],
[
"megacity"
],
22,
[
"metropolis"
],
20,
[
"city"
],
18,
[
"municipality"
],
16,
[
"town"
],
12,
0
],
12,
[
"match",
[
"get",
"localityType"
],
[
"megacity"
],
22,
[
"metropolis"
],
20,
[
"city"
],
18,
[
"municipality"
],
16,
[
"town"
],
12,
[
"village"
],
10,
0
],
14,
[
"match",
[
"get",
"subclass"
],
[
"megacity"
],
22,
[
"metropolis"
],
20,
[
"city"
],
18,
[
"municipality"
],
16,
[
"town"
],
14,
[
"village",
"hamlet"
],
12,
0
],
15,
[
"match",
[
"get",
"subclass"
],
[
"megacity"
],
22,
[
"metropolis"
],
20,
[
"city"
],
18,
[
"municipality"
],
16,
[
"town"
],
14,
[
"village",
"hamlet"
],
14,
0
],
16,
[
"match",
[
"get",
"subclass"
],
[
"village",
"hamlet"
],
16,
0
]
],
"text-transform": [
"step",
[
"zoom"
],
"none",
11,
"uppercase"
],
"text-padding": [
"step",
[
"zoom"
],
10,
9,
8,
10,
5,
12,
3
],
"text-max-width": 6,
"symbol-avoid-edges": true,
"symbol-sort-key": [
"get",
"sort_key"
],
"text-justify": "auto"
},
"paint": {
"text-color": "#071F3F",
"text-halo-color": "#dce6ef",
"text-halo-width": 1
}
}
}
{
"id": "buildings",
"type": "fill-extrusion",
"minzoom": 12,
"maxzoom": 24,
"source": "buildings",
"source-layer": "buildings",
"paint": {
"fill-extrusion-color": "#dce6ef",
"fill-extrusion-opacity": 0.6,
"fill-extrusion-base": 0,
"fill-extrusion-height": [
"case",
[
"has",
"height"
],
[
"to-number",
[
"get",
"height"
]
],
3.2
]
}
}
{
"footwayCasing": {
"id": "footwayCasing",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 15,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"footway"
],
true,
false
],
"layout": {
"line-cap": "round",
"line-join": "round"
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.25,
20,
1.3
],
"line-gap-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.5,
16,
3,
22,
25
],
"line-color": "#dce6ef"
}
},
"footway": {
"id": "footway",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 15,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"footway"
],
true,
false
],
"layout": {
"line-cap": "round",
"line-join": "round"
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.5,
16,
3,
22,
25
],
"line-color": "#b9ccdf"
}
},
"parkingAisleUnknownCasing": {
"id": "parkingAisleUnknownCasing",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 14,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"parking_aisle",
"unknown"
],
true,
false
],
"layout": {
"line-cap": "round",
"line-join": "round"
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.25,
20,
1.3
],
"line-gap-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.5,
16,
3.5,
22,
75
],
"line-color": "#dce6ef"
}
},
"residentialCasing": {
"id": "residentialCasing",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 12,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"residential"
],
true,
false
],
"layout": {
"line-cap": "round",
"line-join": "round"
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.75,
20,
1.3
],
"line-gap-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
1,
16,
6,
22,
125
],
"line-color": "#dce6ef"
}
},
"secondaryTertiaryCasing": {
"id": "secondaryTertiaryCasing",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 11,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"secondary",
"tertiary"
],
true,
false
],
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
1,
20,
1.3
],
"line-gap-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
10,
0.5,
12,
2.2,
16,
6.6,
22,
160
],
"line-color": "#dce6ef"
}
},
"primaryCasing": {
"id": "primaryCasing",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 8,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"primary"
],
true,
false
],
"layout": {
"line-cap": [
"step",
[
"zoom"
],
"butt",
16,
"round"
],
"line-join": [
"step",
[
"zoom"
],
"miter",
16,
"round"
]
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
1,
20,
1.4
],
"line-gap-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
8,
0.5,
12,
3.1,
16,
9.3,
22,
175
],
"line-color": "#dce6ef"
}
},
"parkingAisleUnknown": {
"id": "parkingAisleUnknown",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 14,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"parking_aisle",
"unknown"
],
true,
false
],
"layout": {
"line-cap": "round",
"line-join": "round"
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
0.5,
16,
3.5,
22,
75
],
"line-color": "#a7bfd7"
}
},
"residential": {
"id": "residential",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 12,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"residential"
],
true,
false
],
"layout": {
"line-cap": [
"step",
[
"zoom"
],
"butt",
13,
"round"
],
"line-join": [
"step",
[
"zoom"
],
"miter",
13,
"round"
]
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
1,
16,
6,
22,
125
],
"line-color": "#a7bfd7"
}
},
"secondaryTertiary": {
"id": "secondaryTertiary",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 10,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"secondary",
"tertiary"
],
true,
false
],
"layout": {
"line-cap": [
"step",
[
"zoom"
],
"butt",
13,
"round"
],
"line-join": [
"step",
[
"zoom"
],
"miter",
13,
"round"
]
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
10,
0.5,
12,
2.2,
16,
6.6,
22,
160
],
"line-color": "#a7bfd7"
}
},
"primary": {
"id": "primary",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 8,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"primary"
],
true,
false
],
"layout": {
"line-cap": [
"step",
[
"zoom"
],
"butt",
13,
"round"
],
"line-join": [
"step",
[
"zoom"
],
"miter",
13,
"round"
]
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
8,
0.5,
12,
3.1,
16,
9.3,
22,
175
],
"line-color": "#a7bfd7"
}
},
"motorwayCasing": {
"id": "motorwayCasing",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 6,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"motorway"
],
true,
false
],
"layout": {
"line-cap": [
"step",
[
"zoom"
],
"butt",
13,
"round"
],
"line-join": [
"step",
[
"zoom"
],
"miter",
13,
"round"
]
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
12,
1,
20,
1.4
],
"line-gap-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
6,
0.5,
12,
3.3,
16,
9.9,
22,
175
],
"line-color": "#dce6ef"
}
},
"motorway": {
"id": "motorway",
"type": "line",
"source": "roads",
"source-layer": "roads",
"minzoom": 6,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"motorway"
],
true,
false
],
"layout": {
"line-cap": [
"step",
[
"zoom"
],
"butt",
12,
"round"
],
"line-join": [
"step",
[
"zoom"
],
"miter",
12,
"round"
]
},
"paint": {
"line-width": [
"interpolate",
[
"exponential",
1.5
],
[
"zoom"
],
6,
0.5,
12,
3.3,
16,
9.9,
22,
175
],
"line-color": "#95b2d0"
}
},
"residentialLabel": {
"id": "residentialLabel",
"type": "symbol",
"source": "roads",
"source-layer": "roads",
"minzoom": 13,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"residential",
"unknown"
],
true,
false
],
"layout": {
"text-transform": "uppercase",
"text-size": [
"interpolate",
[
"linear"
],
[
"zoom"
],
13,
9,
18,
[
"match",
[
"get",
"class"
],
[
"access",
"path"
],
9,
12
]
],
"text-max-angle": 30,
"symbol-spacing": [
"interpolate",
[
"linear"
],
[
"zoom"
],
13,
200,
16,
400
],
"text-field": [
"get",
"name"
],
"text-font": [
"Noto Sans Bold"
],
"symbol-placement": "line",
"text-padding": 5
},
"paint": {
"text-color": "#071F3F",
"text-halo-color": "hsl(0,0%,100%)",
"text-halo-width": 1
}
},
"highwayLabel": {
"id": "highwayLabel",
"type": "symbol",
"source": "roads",
"source-layer": "roads",
"minzoom": 13,
"maxzoom": 24,
"filter": [
"match",
[
"get",
"class"
],
[
"motorway",
"primary",
"secondary",
"tertiary"
],
true,
false
],
"layout": {
"text-transform": "uppercase",
"text-size": [
"interpolate",
[
"linear"
],
[
"zoom"
],
13,
9,
18,
[
"match",
[
"get",
"class"
],
[
"access",
"path"
],
9,
12
]
],
"text-max-angle": 30,
"symbol-spacing": [
"interpolate",
[
"linear"
],
[
"zoom"
],
13,
200,
16,
400
],
"text-field": [
"get",
"name"
],
"text-font": [
"Noto Sans Bold"
],
"symbol-placement": "line"
},
"paint": {
"text-color": "#071F3F",
"text-halo-color": "hsl(0,0%,100%)",
"text-halo-width": 1
}
}
}
{
"land": {
"id": "land",
"type": "fill",
"source": "base",
"source-layer": "land",
"filter": [
"match",
[
"get",
"subtype"
],
[
"land"
],
true,
false
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#ccdae8"
}
},
"sand": {
"id": "sand",
"type": "fill",
"source": "base",
"source-layer": "land",
"filter": [
"match",
[
"get",
"subtype"
],
[
"sand"
],
true,
false
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#EBD5BD"
}
},
"wetland": {
"id": "wetland",
"type": "fill",
"source": "base",
"source-layer": "land",
"filter": [
"match",
[
"get",
"subtype"
],
[
"wetland"
],
true,
false
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#00A9BF"
}
},
"forest": {
"id": "forest",
"type": "fill",
"source": "base",
"source-layer": "land",
"filter": [
"match",
[
"get",
"subtype"
],
[
"forest",
"grass",
"scrub"
],
true,
false
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#09bac6"
}
}
}
{
"parks": {
"id": "parks",
"type": "fill",
"source": "base",
"source-layer": "landuse",
"filter": [
"match",
[
"get",
"subtype"
],
[
"park"
],
true,
false
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#09bac6"
}
},
"golfGreens": {
"id": "golfGreens",
"type": "fill",
"source": "base",
"source-layer": "landuse",
"filter": [
"==",
[
"get",
"class"
],
"fairway"
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#09bac6"
}
},
"recSand": {
"id": "golfBunker",
"type": "fill",
"source": "base",
"source-layer": "landuse",
"filter": [
"match",
[
"get",
"surface"
],
[
"recreation_sand"
],
true,
false
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#EBD5BD"
}
}
}
{
"waterPolygons": {
"id": "water-fill",
"type": "fill",
"source": "base",
"source-layer": "water",
"filter": [
"==",
[
"geometry-type"
],
"Polygon"
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"fill-color": "#3063d2"
}
},
"waterLinestrings": {
"id": "water-line",
"type": "line",
"source": "base",
"source-layer": "water",
"filter": [
"==",
[
"geometry-type"
],
"LineString"
],
"minzoom": 0,
"maxzoom": 24,
"paint": {
"line-width": 3,
"line-color": "#3063d2"
}
}
}