Featuer: add selfhosted version of pmtiles

This commit is contained in:
Pieter Vander Vennet 2025-06-16 14:33:04 +02:00
parent de74a5dc08
commit 55339435d5
7 changed files with 4543 additions and 11 deletions

View file

@ -0,0 +1,423 @@
{
"attribution": "<a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">&copy; OpenStreetMap</a>",
"bounds": [
-180,
-85.0511287,
180,
85.0511287
],
"center": [
0,
0,
0
],
"description": "Basemap layers derived from OpenStreetMap and Natural Earth, self-hosted",
"maxzoom": 15,
"minzoom": 0,
"name": "Protomaps Basemap",
"scheme": "xyz",
"tilejson": "3.0.0",
"tiles": [
"https://api.protomaps.com/tiles/v4/{z}/{x}/{y}.mvt?key=e6cd5633d51d8e24"
],
"vector_layers": [
{
"fields": {
"brk_a3": "String",
"disputed": "Boolean",
"kind": "String",
"kind_detail": "Number",
"sort_rank": "Number"
},
"id": "boundaries",
"maxzoom": 15,
"minzoom": 0
},
{
"fields": {
"addr_housenumber": "String",
"height": "Number",
"kind": "String",
"kind_detail": "String",
"layer": "Number",
"min_height": "Number",
"sort_rank": "Number"
},
"id": "buildings",
"maxzoom": 15,
"minzoom": 11
},
{
"fields": {
"kind": "String",
"min_zoom": "Number",
"name": "String",
"name2": "String",
"name3": "String",
"name:ar": "String",
"name:bg": "String",
"name:cs": "String",
"name:da": "String",
"name:de": "String",
"name:el": "String",
"name:en": "String",
"name:es": "String",
"name:et": "String",
"name:fa": "String",
"name:fi": "String",
"name:fr": "String",
"name:ga": "String",
"name:he": "String",
"name:hi": "String",
"name:hr": "String",
"name:hu": "String",
"name:id": "String",
"name:it": "String",
"name:ja": "String",
"name:ko": "String",
"name:lt": "String",
"name:lv": "String",
"name:mr": "String",
"name:mt": "String",
"name:ne": "String",
"name:nl": "String",
"name:no": "String",
"name:pl": "String",
"name:pt": "String",
"name:ro": "String",
"name:ru": "String",
"name:sk": "String",
"name:sl": "String",
"name:sv": "String",
"name:tr": "String",
"name:uk": "String",
"name:ur": "String",
"name:vi": "String",
"name:zh-Hans": "String",
"name:zh-Hant": "String",
"pgf:name2": "String",
"pgf:name:hi": "String",
"pgf:name:mr": "String",
"pgf:name:ne": "String",
"script": "String",
"script2": "String",
"script3": "String"
},
"id": "earth",
"maxzoom": 15,
"minzoom": 0
},
{
"fields": {
"kind": "String"
},
"id": "landcover",
"maxzoom": 7,
"minzoom": 0
},
{
"fields": {
"kind": "String",
"sort_rank": "Number"
},
"id": "landuse",
"maxzoom": 15,
"minzoom": 2
},
{
"fields": {
"capital": "String",
"kind": "String",
"kind_detail": "String",
"min_zoom": "Number",
"name": "String",
"name2": "String",
"name3": "String",
"name:ar": "String",
"name:bg": "String",
"name:cs": "String",
"name:da": "String",
"name:de": "String",
"name:el": "String",
"name:en": "String",
"name:es": "String",
"name:et": "String",
"name:fa": "String",
"name:fi": "String",
"name:fr": "String",
"name:ga": "String",
"name:he": "String",
"name:hi": "String",
"name:hr": "String",
"name:hu": "String",
"name:id": "String",
"name:it": "String",
"name:ja": "String",
"name:ko": "String",
"name:lt": "String",
"name:lv": "String",
"name:mr": "String",
"name:mt": "String",
"name:ne": "String",
"name:nl": "String",
"name:no": "String",
"name:pl": "String",
"name:pt": "String",
"name:ro": "String",
"name:ru": "String",
"name:sk": "String",
"name:sl": "String",
"name:sv": "String",
"name:tr": "String",
"name:uk": "String",
"name:ur": "String",
"name:vi": "String",
"name:zh-Hans": "String",
"name:zh-Hant": "String",
"pgf:name": "String",
"pgf:name2": "String",
"pgf:name:en": "String",
"pgf:name:hi": "String",
"pgf:name:mr": "String",
"pgf:name:ne": "String",
"population": "Number",
"population_rank": "Number",
"ref": "String",
"ref:FR:FANTOIR": "String",
"ref:FR:SIREN": "String",
"ref:RS:nkd": "String",
"ref:USCG": "String",
"ref:USPS": "String",
"ref:assessors_office": "String",
"ref:catasto": "String",
"ref:category": "String",
"ref:en": "String",
"ref:lzh": "String",
"ref:nid": "String",
"ref:se:pts:postort": "String",
"ref:vi": "String",
"ref:whc": "String",
"ref:xpcc": "String",
"ref:zh": "String",
"ref:zh-Hans": "String",
"ref:zh-Hant": "String",
"script": "String",
"script2": "String",
"script3": "String",
"sort_key": "Number",
"wikidata": "String"
},
"id": "places",
"maxzoom": 15,
"minzoom": 0
},
{
"fields": {
"elevation": "String",
"iata": "String",
"kind": "String",
"kind_detail": "String",
"min_zoom": "Number",
"name": "String",
"name2": "String",
"name3": "String",
"name:ar": "String",
"name:bg": "String",
"name:cs": "String",
"name:da": "String",
"name:de": "String",
"name:el": "String",
"name:en": "String",
"name:es": "String",
"name:et": "String",
"name:fa": "String",
"name:fi": "String",
"name:fr": "String",
"name:ga": "String",
"name:he": "String",
"name:hi": "String",
"name:hr": "String",
"name:hu": "String",
"name:id": "String",
"name:it": "String",
"name:ja": "String",
"name:ko": "String",
"name:lt": "String",
"name:lv": "String",
"name:mr": "String",
"name:mt": "String",
"name:ne": "String",
"name:nl": "String",
"name:no": "String",
"name:pl": "String",
"name:pt": "String",
"name:ro": "String",
"name:ru": "String",
"name:sk": "String",
"name:sl": "String",
"name:sv": "String",
"name:tr": "String",
"name:uk": "String",
"name:ur": "String",
"name:vi": "String",
"name:zh-Hans": "String",
"name:zh-Hant": "String",
"pgf:name": "String",
"pgf:name2": "String",
"pgf:name3": "String",
"pgf:name:en": "String",
"pgf:name:he": "String",
"pgf:name:hi": "String",
"pgf:name:mr": "String",
"pgf:name:ne": "String",
"script": "String",
"script2": "String",
"script3": "String"
},
"id": "pois",
"maxzoom": 15,
"minzoom": 5
},
{
"fields": {
"is_bridge": "Boolean",
"is_link": "Boolean",
"is_tunnel": "Boolean",
"kind": "String",
"kind_detail": "String",
"min_zoom": "Number",
"name": "String",
"name2": "String",
"name3": "String",
"name:ar": "String",
"name:bg": "String",
"name:cs": "String",
"name:da": "String",
"name:de": "String",
"name:el": "String",
"name:en": "String",
"name:es": "String",
"name:et": "String",
"name:fa": "String",
"name:fi": "String",
"name:fr": "String",
"name:ga": "String",
"name:he": "String",
"name:hi": "String",
"name:hr": "String",
"name:hu": "String",
"name:id": "String",
"name:it": "String",
"name:ja": "String",
"name:ko": "String",
"name:lt": "String",
"name:lv": "String",
"name:mr": "String",
"name:mt": "String",
"name:ne": "String",
"name:nl": "String",
"name:no": "String",
"name:pl": "String",
"name:pt": "String",
"name:ro": "String",
"name:ru": "String",
"name:sk": "String",
"name:sl": "String",
"name:sv": "String",
"name:tr": "String",
"name:uk": "String",
"name:ur": "String",
"name:vi": "String",
"name:zh-Hans": "String",
"name:zh-Hant": "String",
"network": "String",
"oneway": "String",
"pgf:name": "String",
"pgf:name2": "String",
"pgf:name:en": "String",
"pgf:name:hi": "String",
"pgf:name:mr": "String",
"pgf:name:ne": "String",
"ref": "String",
"route": "String",
"script": "String",
"script2": "String",
"script3": "String",
"service": "String",
"shield_text_length": "Number",
"sort_rank": "Number"
},
"id": "roads",
"maxzoom": 15,
"minzoom": 3
},
{
"fields": {
"bridge": "String",
"kind": "String",
"kind_detail": "String",
"layer": "Number",
"min_zoom": "Number",
"name": "String",
"name2": "String",
"name3": "String",
"name:ar": "String",
"name:bg": "String",
"name:cs": "String",
"name:da": "String",
"name:de": "String",
"name:el": "String",
"name:en": "String",
"name:es": "String",
"name:et": "String",
"name:fa": "String",
"name:fi": "String",
"name:fr": "String",
"name:ga": "String",
"name:he": "String",
"name:hi": "String",
"name:hr": "String",
"name:hu": "String",
"name:id": "String",
"name:it": "String",
"name:ja": "String",
"name:ko": "String",
"name:lt": "String",
"name:lv": "String",
"name:mr": "String",
"name:mt": "String",
"name:ne": "String",
"name:nl": "String",
"name:no": "String",
"name:pl": "String",
"name:pt": "String",
"name:ro": "String",
"name:ru": "String",
"name:sk": "String",
"name:sl": "String",
"name:sv": "String",
"name:tr": "String",
"name:uk": "String",
"name:ur": "String",
"name:vi": "String",
"name:zh-Hans": "String",
"name:zh-Hant": "String",
"pgf:name": "String",
"pgf:name2": "String",
"pgf:name:en": "String",
"pgf:name:hi": "String",
"pgf:name:mr": "String",
"pgf:name:ne": "String",
"script": "String",
"script2": "String",
"script3": "String",
"sort_rank": "Number",
"tunnel": "String"
},
"id": "water",
"maxzoom": 15,
"minzoom": 0
}
],
"version": "4.11.0"
}

File diff suppressed because it is too large Load diff

View file

@ -7,9 +7,7 @@
"protomaps": {
"attribution": "<a href=\"https://github.com/protomaps/basemaps\">Protomaps</a> © <a href=\"https://openstreetmap.org\">OpenStreetMap</a>",
"type": "vector",
"tiles": [
"https://api.protomaps.com/tiles/v4/{z}/{x}/{y}.mvt?key=2af8b969a9e8b692"
],
"url": "pmtiles://https://cache.mapcomplete.org/planet-latest.pmtiles",
"maxzoom": 15
}
},

View file

@ -6,9 +6,7 @@
"protomaps": {
"attribution": "<a href=\"https://github.com/protomaps/basemaps\">Protomaps</a> © <a href=\"https://openstreetmap.org\">OpenStreetMap</a>",
"type": "vector",
"tiles": [
"https://api.protomaps.com/tiles/v4/{z}/{x}/{y}.mvt?key=2af8b969a9e8b692"
],
"url": "pmtiles://https://cache.mapcomplete.org/planet-latest.pmtiles",
"maxzoom": 15
}
},

View file

@ -16,8 +16,21 @@ export class GenerateSunnyUnlabeled extends Script {
writeFileSync("public/assets/sunny-unlabeled.json", JSON.stringify(unlabeled, null, " "))
}
/**
* Generates a variation hosted by api.protomaps
*/
generateHosted() {
const tilesource = "https://api.protomaps.com/tiles/v4/{z}/{x}/{y}.mvt?key=2af8b969a9e8b692"
const hosted = { "#": "AUTOMATICALLY GENERATED! Do not edit.", ...sunny }
delete hosted.sources.protomaps.url
hosted.sources.protomaps["tiles"] = [tilesource]
writeFileSync("public/assets/sunny-hosted.json", JSON.stringify(hosted, null, " "))
}
async main(args: string[]): Promise<void> {
this.generateUnlabeled()
this.generateHosted()
}
}

View file

@ -70,12 +70,13 @@ export class AvailableRasterLayers {
throw "Detected invalid global layer with invalid id"
}
return joined.map(
(properties) =>
<RasterLayerPolygon>{
(properties) => {
return <RasterLayerPolygon>{
type: "Feature",
properties,
geometry: BBox.global.asGeometry(),
}
}
)
}

View file

@ -1,14 +1,28 @@
{
"layers": [
{
"url": "pmtiles://https://api.protomaps.com/tiles/v4.json?key=2af8b969a9e8b692",
"style": "assets/sunny.json",
"style": "assets/sunny-hosted.json",
"connect-src": [
"https://protomaps.github.io"
],
"best": true,
"id": "protomaps.sunny",
"name": "Protomaps Sunny",
"name": "Protomaps Sunny (Hosted by Protomaps)",
"type": "vector",
"category": "osmbasedmap",
"attribution": {
"text": "Protomaps",
"url": "https://protomaps.com/"
}
},
{
"style": "assets/sunny.json",
"connect-src": [
"https://protomaps.github.io"
],
"best": true,
"id": "protomaps.sunny-self",
"name": "Protomaps Sunny (Hosted by pietervdvn)",
"type": "vector",
"category": "osmbasedmap",
"attribution": {