Compare commits

1 Commits
First ... main

Author SHA1 Message Date
95029dfe49 v0.3, 16-10-2025 pupicon added 2025-10-16 21:32:19 +01:00
1097 changed files with 5244 additions and 78 deletions

View File

@@ -136,6 +136,91 @@
"count": 1,
"popup": "PupTiff"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.75,
59.910000000000004
]
},
"properties": {
"names": [
"PupDio"
],
"count": 1,
"popup": "PupDio"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.76,
59.93
]
},
"properties": {
"names": [
"PupFinn"
],
"count": 1,
"popup": "PupFinn"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
19.0,
69.69
]
},
"properties": {
"names": [
"Lokr"
],
"count": 1,
"popup": "Lokr"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.47,
60.18
]
},
"properties": {
"names": [
"Rufus"
],
"count": 1,
"popup": "Rufus"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
11.05,
59.95
]
},
"properties": {
"names": [
"Shrink"
],
"count": 1,
"popup": "Shrink"
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pupmap by BoopLabs v2025-10-03_2300</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="style.css">
<link href="https://unpkg.com/maplibre-gl/dist/maplibre-gl.css" rel="stylesheet"/>
<script src="https://unpkg.com/maplibre-gl/dist/maplibre-gl.js"></script>
<script src="https://unpkg.com/pmtiles/dist/pmtiles.js"></script>
</head>
<body>
<input id="searchBox" placeholder="Search place..." />
<div id="map"></div>
<script>
const protocol = new pmtiles.Protocol();
maplibregl.addProtocol("pmtiles", protocol.tile);
const map = new maplibregl.Map({
container: 'map',
style: 'style.json',
center: [10, 60],
zoom: 4
});
map.on('load', () => {
// Roads
map.addSource('roads', {
type: 'geojson',
data: 'data/roads_europe_clean.geojson'
});
map.addLayer({
id: 'roads-minor',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'minor'],
paint: {
'line-color': '#cccccc',
'line-width': 1,
'line-opacity': 0.5
}
});
map.addLayer({
id: 'roads-major',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'major'],
paint: {
'line-color': '#555555',
'line-width': 2,
'line-opacity': 0.7
}
});
// Cities
map.addSource('cities', {
type: 'geojson',
data: 'data/world_cities_europe_clean.geojson'
});
map.addLayer({
id: 'city-points-small',
type: 'circle',
source: 'cities',
filter: ['<', ['get','POP_MAX'], 100000],
paint: {
'circle-radius': 3,
'circle-color': '#999999',
'circle-stroke-width': 1,
'circle-stroke-color': '#666666'
}
});
map.addLayer({
id: 'city-points-medium',
type: 'circle',
source: 'cities',
filter: ['all', ['>=', ['get','POP_MAX'], 100000], ['<', ['get','POP_MAX'], 500000]],
paint: {
'circle-radius': 5,
'circle-color': '#777777',
'circle-stroke-width': 1,
'circle-stroke-color': '#555555'
}
});
map.addLayer({
id: 'city-points-large',
type: 'circle',
source: 'cities',
filter: ['>=', ['get','POP_MAX'], 500000],
paint: {
'circle-radius': 7,
'circle-color': '#444444',
'circle-stroke-width': 1,
'circle-stroke-color': '#222222'
}
});
// City labels, zoom + population based
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'NAME'],
'text-font': ['Noto Sans Regular'],
'text-size': [
'interpolate', ['linear'], ['zoom'],
4, 10,
6, 12,
10, 16
],
'text-offset': [0, 1.2],
'text-anchor': 'top'
},
paint: {
'text-color': '#222222',
'text-halo-color': '#ffffff',
'text-halo-width': 1
},
filter: [
'>',
['get','POP_MAX'],
['interpolate', ['linear'], ['zoom'],
4, 2000000, // at zoom 4, only megacities
6, 1000000, // at zoom 6, large cities
8, 500000, // at zoom 8, medium cities
10, 100000 // at zoom 10+, small cities
]
]
});
// City popups
map.on('click', ['city-points-small','city-points-medium','city-points-large'], (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const cityName = e.features[0].properties.NAME || "Unknown City";
const population = e.features[0].properties.POP_MAX || "n/a";
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${cityName}</strong><br/>Population: ${population}`)
.addTo(map);
});
// Cursor for city dots
['city-points-small','city-points-medium','city-points-large'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
// POIs
map.addSource('pois', {
type: 'geojson',
data: 'data/pois.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'pois',
filter: ['has', 'point_count'],
paint: {
'circle-color': '#FF0000',
'circle-radius': ['step', ['get','point_count'], 15, 10, 20, 50, 25],
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
map.addLayer({
id: 'unclustered-point',
type: 'circle',
source: 'pois',
filter: ['!', ['has','point_count']],
paint: {
'circle-color': '#FF0000',
'circle-radius': 8,
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
map.on('click', 'unclustered-point', (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const popupContent = e.features[0].properties.popup || e.features[0].properties.names.join(', ');
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${popupContent}</strong>`)
.addTo(map);
});
map.on('click', 'clusters', (e) => {
const features = map.queryRenderedFeatures(e.point, { layers: ['clusters'] });
const clusterId = features[0].properties.cluster_id;
map.getSource('pois').getClusterExpansionZoom(clusterId, (err, zoom) => {
if (err) return;
map.easeTo({ center: features[0].geometry.coordinates, zoom: zoom });
});
});
['clusters', 'unclustered-point'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
});
// Nominatim search
document.getElementById('searchBox').addEventListener('keypress', async function(e){
if(e.key==='Enter'){
const query = e.target.value;
const url = `http://yourhost:7070/search?q=${encodeURIComponent(query)}&format=json`;
try{
const res = await fetch(url);
const results = await res.json();
if(results.length>0){
const loc = results[0];
map.flyTo({ center: [loc.lon, loc.lat], zoom: 12 });
}else{ alert("No results found"); }
}catch(err){ alert("Error connecting to search API"); console.error(err);}
}
});
</script>
</body>
</html>

View File

@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pupmap by BoopLabs v2025-10-03_2300</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="style.css">
<link href="https://unpkg.com/maplibre-gl/dist/maplibre-gl.css" rel="stylesheet"/>
<script src="https://unpkg.com/maplibre-gl/dist/maplibre-gl.js"></script>
<script src="https://unpkg.com/pmtiles/dist/pmtiles.js"></script>
</head>
<body>
<input id="searchBox" placeholder="Search place..." />
<div id="map"></div>
<script>
const protocol = new pmtiles.Protocol();
maplibregl.addProtocol("pmtiles", protocol.tile);
const map = new maplibregl.Map({
container: 'map',
style: 'style.json',
center: [10, 60],
zoom: 4
});
map.on('load', () => {
// Roads
map.addSource('roads', { type: 'geojson', data: 'data/roads_europe_clean.geojson' });
map.addLayer({
id: 'roads-minor',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'minor'],
paint: { 'line-color': '#cccccc', 'line-width': 1, 'line-opacity': 0.5 }
});
map.addLayer({
id: 'roads-major',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'major'],
paint: { 'line-color': '#555555', 'line-width': 2, 'line-opacity': 0.7 }
});
// Cities
map.addSource('cities', { type: 'geojson', data: 'data/world_cities_europe_clean.geojson' });
map.addLayer({
id: 'city-points-small',
type: 'circle',
source: 'cities',
filter: ['<', ['get','POP_MAX'], 100000],
paint: { 'circle-radius': 3, 'circle-color': '#999999', 'circle-stroke-width': 1, 'circle-stroke-color': '#666666' }
});
map.addLayer({
id: 'city-points-medium',
type: 'circle',
source: 'cities',
filter: ['all', ['>=', ['get','POP_MAX'], 100000], ['<', ['get','POP_MAX'], 500000]],
paint: { 'circle-radius': 5, 'circle-color': '#777777', 'circle-stroke-width': 1, 'circle-stroke-color': '#555555' }
});
map.addLayer({
id: 'city-points-large',
type: 'circle',
source: 'cities',
filter: ['>=', ['get','POP_MAX'], 500000],
paint: { 'circle-radius': 7, 'circle-color': '#444444', 'circle-stroke-width': 1, 'circle-stroke-color': '#222222' }
});
// City labels
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'NAME'],
'text-font': ['Noto Sans Regular'],
'text-size': ['interpolate', ['linear'], ['zoom'], 4, 10, 6, 12, 10, 16],
'text-offset': [0, 1.2],
'text-anchor': 'top'
},
paint: { 'text-color': '#222222', 'text-halo-color': '#ffffff', 'text-halo-width': 1 },
filter: ['>', ['get','POP_MAX'], ['interpolate', ['linear'], ['zoom'], 4, 2000000, 6, 1000000, 8, 500000, 10, 100000]]
});
// City popups
map.on('click', ['city-points-small','city-points-medium','city-points-large'], (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const cityName = e.features[0].properties.NAME || "Unknown City";
const population = e.features[0].properties.POP_MAX || "n/a";
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${cityName}</strong><br/>Population: ${population}`)
.addTo(map);
});
['city-points-small','city-points-medium','city-points-large'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
// POIs
map.addSource('pois', {
type: 'geojson',
data: 'data/pois.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
// Clusters
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'pois',
filter: ['has', 'point_count'],
paint: {
'circle-color': '#FF0000',
'circle-radius': ['step', ['get','point_count'], 15, 10, 20, 50, 25],
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
// Unclustered POIs with pup icon
map.loadImage('https://pups.boop.no/data/pupicon64.png', (error, image) => {
if (error) {
console.error("Failed to load pup icon", error);
return;
}
if (!map.hasImage('pup')) map.addImage('pup', image, { sdf: false });
map.addLayer({
id: 'unclustered-point',
type: 'symbol',
source: 'pois',
filter: ['!', ['has','point_count']],
layout: {
'icon-image': 'pup',
'icon-size': 1.0,
'icon-allow-overlap': true,
'icon-ignore-placement': true
}
});
});
map.loadImage('https://pups.boop.no/data/pup_icon_64x64.png', (error, image) => {
if (error) {
console.error("Failed to load pup icon", error);
return;
}
console.log("Image loaded:", image);
if (!map.hasImage('pup')) {
map.addImage('pup', image, { sdf: false });
console.log("Image added to map");
}
});
map.on('click', 'unclustered-point', (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const popupContent = e.features[0].properties.popup || e.features[0].properties.names.join(', ');
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${popupContent}</strong>`)
.addTo(map);
});
map.on('click', 'clusters', (e) => {
const features = map.queryRenderedFeatures(e.point, { layers: ['clusters'] });
const clusterId = features[0].properties.cluster_id;
map.getSource('pois').getClusterExpansionZoom(clusterId, (err, zoom) => {
if (err) return;
map.easeTo({ center: features[0].geometry.coordinates, zoom: zoom });
});
});
['clusters', 'unclustered-point'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
});
// Nominatim search
document.getElementById('searchBox').addEventListener('keypress', async function(e){
if(e.key==='Enter'){
const query = e.target.value;
const url = `http://yourhost:7070/search?q=${encodeURIComponent(query)}&format=json`;
try{
const res = await fetch(url);
const results = await res.json();
if(results.length>0){
const loc = results[0];
map.flyTo({ center: [loc.lon, loc.lat], zoom: 12 });
} else { alert("No results found"); }
} catch(err){ alert("Error connecting to search API"); console.error(err);}
}
});
</script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,26 @@
/* Pupmap style.css */
body, html {
margin: 0;
padding: 0;
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
#searchBox {
position: absolute;
top: 10px;
left: 10px;
z-index: 999;
width: 220px;
padding: 6px;
border-radius: 4px;
border: 1px solid #ccc;
background: #fff;
font-size: 14px;
}

View File

@@ -0,0 +1,83 @@
{
"version": 8,
"name": "Pupmap by BoopLabs v2025-10-03_1300",
"glyphs":"/basemaps-assets-main/fonts/{fontstack}/{range}.pbf",
"sprite": "https://pups.boop.no/sprites/sprite",
"sources": {
"basemap": {
"type": "vector",
"url": "pmtiles://data/world.pmtiles"
}
},
"layers": [
{
"id": "background",
"type": "background",
"paint": {
"background-color": "#C6F1DC"
}
},
{
"id": "earth",
"type": "fill",
"source": "basemap",
"source-layer": "earth",
"paint": {
"fill-color": "#97E3C1"
}
},
{
"id": "land",
"type": "fill",
"source": "basemap",
"source-layer": "landcover",
"paint": {
"fill-color": "#C6F1DC"
}
},
{
"id": "landuse",
"type": "fill",
"source": "basemap",
"source-layer": "landuse",
"paint": {
"fill-color": "#97E3C1"
}
},
{
"id": "water",
"type": "fill",
"source": "basemap",
"source-layer": "water",
"paint": {
"fill-color": "#7CD5E9"
}
},
{
"id": "boundaries2",
"type": "line",
"source": "basemap",
"source-layer": "boundaries",
"paint": {
"line-color": "#F08650",
"line-width": 1
}
},
{
"id": "boundaries",
"type": "line",
"source": "basemap",
"source-layer": "boundaries",
"filter": [
"<=",
"pmap:min_admin_level",
1
],
"paint": {
"line-color": "#000000",
"line-width": 2
}
}
]
}

236
www/archive/index.html Normal file
View File

@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pupmap by BoopLabs v2025-10-03_2300</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="style.css">
<link href="https://unpkg.com/maplibre-gl/dist/maplibre-gl.css" rel="stylesheet"/>
<script src="https://unpkg.com/maplibre-gl/dist/maplibre-gl.js"></script>
<script src="https://unpkg.com/pmtiles/dist/pmtiles.js"></script>
</head>
<body>
<input id="searchBox" placeholder="Search place..." />
<div id="map"></div>
<script>
const protocol = new pmtiles.Protocol();
maplibregl.addProtocol("pmtiles", protocol.tile);
const map = new maplibregl.Map({
container: 'map',
style: 'style.json',
center: [10, 60],
zoom: 4
});
map.on('load', () => {
// Roads
map.addSource('roads', {
type: 'geojson',
data: 'data/roads_europe_clean.geojson'
});
map.addLayer({
id: 'roads-minor',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'minor'],
paint: {
'line-color': '#cccccc',
'line-width': 1,
'line-opacity': 0.5
}
});
map.addLayer({
id: 'roads-major',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'major'],
paint: {
'line-color': '#555555',
'line-width': 2,
'line-opacity': 0.7
}
});
// Cities
map.addSource('cities', {
type: 'geojson',
data: 'data/world_cities_europe_clean.geojson'
});
map.addLayer({
id: 'city-points-small',
type: 'circle',
source: 'cities',
filter: ['<', ['get','POP_MAX'], 100000],
paint: {
'circle-radius': 3,
'circle-color': '#999999',
'circle-stroke-width': 1,
'circle-stroke-color': '#666666'
}
});
map.addLayer({
id: 'city-points-medium',
type: 'circle',
source: 'cities',
filter: ['all', ['>=', ['get','POP_MAX'], 100000], ['<', ['get','POP_MAX'], 500000]],
paint: {
'circle-radius': 5,
'circle-color': '#777777',
'circle-stroke-width': 1,
'circle-stroke-color': '#555555'
}
});
map.addLayer({
id: 'city-points-large',
type: 'circle',
source: 'cities',
filter: ['>=', ['get','POP_MAX'], 500000],
paint: {
'circle-radius': 7,
'circle-color': '#444444',
'circle-stroke-width': 1,
'circle-stroke-color': '#222222'
}
});
// City labels, zoom + population based
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'NAME'],
'text-font': ['Noto Sans Regular'],
'text-size': [
'interpolate', ['linear'], ['zoom'],
4, 10,
6, 12,
10, 16
],
'text-offset': [0, 1.2],
'text-anchor': 'top'
},
paint: {
'text-color': '#222222',
'text-halo-color': '#ffffff',
'text-halo-width': 1
},
filter: [
'>',
['get','POP_MAX'],
['interpolate', ['linear'], ['zoom'],
4, 2000000, // at zoom 4, only megacities
6, 1000000, // at zoom 6, large cities
8, 500000, // at zoom 8, medium cities
10, 100000 // at zoom 10+, small cities
]
]
});
// City popups
map.on('click', ['city-points-small','city-points-medium','city-points-large'], (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const cityName = e.features[0].properties.NAME || "Unknown City";
const population = e.features[0].properties.POP_MAX || "n/a";
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${cityName}</strong><br/>Population: ${population}`)
.addTo(map);
});
// Cursor for city dots
['city-points-small','city-points-medium','city-points-large'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
// POIs
map.addSource('pois', {
type: 'geojson',
data: 'data/pois.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'pois',
filter: ['has', 'point_count'],
paint: {
'circle-color': '#FF0000',
'circle-radius': ['step', ['get','point_count'], 15, 10, 20, 50, 25],
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
map.addLayer({
id: 'unclustered-point',
type: 'circle',
source: 'pois',
filter: ['!', ['has','point_count']],
paint: {
'circle-color': '#FF0000',
'circle-radius': 8,
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
map.on('click', 'unclustered-point', (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const popupContent = e.features[0].properties.popup || e.features[0].properties.names.join(', ');
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${popupContent}</strong>`)
.addTo(map);
});
map.on('click', 'clusters', (e) => {
const features = map.queryRenderedFeatures(e.point, { layers: ['clusters'] });
const clusterId = features[0].properties.cluster_id;
map.getSource('pois').getClusterExpansionZoom(clusterId, (err, zoom) => {
if (err) return;
map.easeTo({ center: features[0].geometry.coordinates, zoom: zoom });
});
});
['clusters', 'unclustered-point'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
});
// Nominatim search
document.getElementById('searchBox').addEventListener('keypress', async function(e){
if(e.key==='Enter'){
const query = e.target.value;
const url = `http://yourhost:7070/search?q=${encodeURIComponent(query)}&format=json`;
try{
const res = await fetch(url);
const results = await res.json();
if(results.length>0){
const loc = results[0];
map.flyTo({ center: [loc.lon, loc.lat], zoom: 12 });
}else{ alert("No results found"); }
}catch(err){ alert("Error connecting to search API"); console.error(err);}
}
});
</script>
</body>
</html>

26
www/archive/style.css Normal file
View File

@@ -0,0 +1,26 @@
/* Pupmap style.css */
body, html {
margin: 0;
padding: 0;
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
#searchBox {
position: absolute;
top: 10px;
left: 10px;
z-index: 999;
width: 220px;
padding: 6px;
border-radius: 4px;
border: 1px solid #ccc;
background: #fff;
font-size: 14px;
}

81
www/archive/style.json Normal file
View File

@@ -0,0 +1,81 @@
{
"version": 8,
"name": "Pupmap by BoopLabs v2025-10-03_1300",
"sources": {
"basemap": {
"type": "vector",
"url": "pmtiles://data/world.pmtiles"
}
},
"layers": [
{
"id": "background",
"type": "background",
"paint": {
"background-color": "#C6F1DC"
}
},
{
"id": "earth",
"type": "fill",
"source": "basemap",
"source-layer": "earth",
"paint": {
"fill-color": "#97E3C1"
}
},
{
"id": "land",
"type": "fill",
"source": "basemap",
"source-layer": "landcover",
"paint": {
"fill-color": "#C6F1DC"
}
},
{
"id": "landuse",
"type": "fill",
"source": "basemap",
"source-layer": "landuse",
"paint": {
"fill-color": "#97E3C1"
}
},
{
"id": "water",
"type": "fill",
"source": "basemap",
"source-layer": "water",
"paint": {
"fill-color": "#7CD5E9"
}
},
{
"id": "boundaries2",
"type": "line",
"source": "basemap",
"source-layer": "boundaries",
"paint": {
"line-color": "#F08650",
"line-width": 1
}
},
{
"id": "boundaries",
"type": "line",
"source": "basemap",
"source-layer": "boundaries",
"filter": [
"<=",
"pmap:min_admin_level",
1
],
"paint": {
"line-color": "#000000",
"line-width": 2
}
}
]
}

View File

@@ -0,0 +1 @@
github: protomaps

View File

@@ -0,0 +1,31 @@
# basemaps-assets
Fonts and sprites for [basemaps](https://github.com/protomaps/basemaps).
## Directory Structure
* `fonts/`: Contains PBF glyphs generated by [font-maker](https://github.com/maplibre/font-maker)
* Current fonts: `Noto Sans Regular`, `Noto Sans Medium`, `Noto Sans Italic`
* `sprites/v3`: Contains spritesheets generated by [spreet](https://github.com/flother/spreet), for each major version
* `light@x.png` - light and dark themed spritesheets at 1x and 2x pixel densities
## Fonts
The typefaces and font variants hosted and downloadable here are limited to only those used by [basemaps](https://github.com/protomaps/basemaps) and a Noto Sans alternate. It is not meant to include all possible variations or other fonts. If you want to generate fonts for your own use, use the examples in `scripts` and maintain your own repository.
## Linking to Assets in Styles
```
glyphs:'https://protomaps.github.io/basemaps-assets/fonts/{fontstack}/{range}.pbf'
```
## Downloading Assets
Use the `Code > Download ZIP` button on this repository page, or [this direct link](https://github.com/protomaps/basemaps-assets/archive/refs/heads/main.zip).
## License
The license for each group of assets is contained within that directory:
* `fonts/`: [SIL Open Font License](fonts/OFL.txt)
* `sprites/`: derived from [MIT-licensed tangrams/icons](https://github.com/tangrams/icons/blob/master/LICENSE.md)

View File

@@ -0,0 +1,5 @@
[
"Noto Sans Italic",
"Noto Sans Medium",
"Noto Sans Regular"
]

View File

@@ -0,0 +1 @@
../Noto Sans Regular/0-255.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/1024-1279.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/10240-10495.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/10496-10751.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/10752-11007.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/11008-11263.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/11264-11519.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/11520-11775.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/11776-12031.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/12032-12287.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/12288-12543.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/12544-12799.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/1280-1535.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/12800-13055.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/13056-13311.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/13312-13567.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/13568-13823.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/13824-14079.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/14080-14335.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/14336-14591.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/14592-14847.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/14848-15103.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/15104-15359.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/1536-1791.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/15360-15615.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/15616-15871.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/15872-16127.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/16128-16383.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/16384-16639.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/16640-16895.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/16896-17151.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/17152-17407.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/17408-17663.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/17664-17919.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/1792-2047.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/17920-18175.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/18176-18431.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/18432-18687.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/18688-18943.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/18944-19199.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/19200-19455.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/19456-19711.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/19712-19967.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/19968-20223.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/20224-20479.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/2048-2303.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/20480-20735.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/20736-20991.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/20992-21247.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/21248-21503.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/21504-21759.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/21760-22015.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/22016-22271.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/22272-22527.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/22528-22783.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/22784-23039.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/2304-2559.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/23040-23295.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/23296-23551.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/23552-23807.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/23808-24063.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/24064-24319.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/24320-24575.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/24576-24831.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/24832-25087.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/25088-25343.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/25344-25599.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/256-511.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/2560-2815.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/25600-25855.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/25856-26111.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/26112-26367.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/26368-26623.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/26624-26879.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/26880-27135.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/27136-27391.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/27392-27647.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/27648-27903.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/27904-28159.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/2816-3071.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/28160-28415.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/28416-28671.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/28672-28927.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/28928-29183.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/29184-29439.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/29440-29695.pbf

View File

@@ -0,0 +1 @@
../Noto Sans Regular/29696-29951.pbf

Some files were not shown because too many files have changed in this diff Show More