v0.3, 16-10-2025 pupicon added
This commit is contained in:
@@ -136,6 +136,91 @@
|
|||||||
"count": 1,
|
"count": 1,
|
||||||
"popup": "PupTiff"
|
"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"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
BIN
www/archive/16-10-2025/favicon.ico
Normal file
BIN
www/archive/16-10-2025/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
236
www/archive/16-10-2025/index.html
Normal file
236
www/archive/16-10-2025/index.html
Normal 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>
|
||||||
|
|
||||||
210
www/archive/16-10-2025/index.sprites.html
Normal file
210
www/archive/16-10-2025/index.sprites.html
Normal 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>
|
||||||
BIN
www/archive/16-10-2025/pup_icon_64x64.png
Normal file
BIN
www/archive/16-10-2025/pup_icon_64x64.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
26
www/archive/16-10-2025/style.css
Normal file
26
www/archive/16-10-2025/style.css
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
83
www/archive/16-10-2025/style.json
Normal file
83
www/archive/16-10-2025/style.json
Normal 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
236
www/archive/index.html
Normal 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
26
www/archive/style.css
Normal 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
81
www/archive/style.json
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
1
www/basemaps-assets-main/.github/FUNDING.yml
vendored
Normal file
1
www/basemaps-assets-main/.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
github: protomaps
|
||||||
31
www/basemaps-assets-main/README.md
Normal file
31
www/basemaps-assets-main/README.md
Normal 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)
|
||||||
5
www/basemaps-assets-main/fonts.json
Normal file
5
www/basemaps-assets-main/fonts.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
"Noto Sans Italic",
|
||||||
|
"Noto Sans Medium",
|
||||||
|
"Noto Sans Regular"
|
||||||
|
]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/0-255.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/1024-1279.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/10240-10495.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/10496-10751.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/10752-11007.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/11008-11263.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/11264-11519.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/11520-11775.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/11776-12031.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/12032-12287.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/12288-12543.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/12544-12799.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/1280-1535.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/12800-13055.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/13056-13311.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/13312-13567.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/13568-13823.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/13824-14079.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/14080-14335.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/14336-14591.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/14592-14847.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/14848-15103.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/15104-15359.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/1536-1791.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/15360-15615.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/15616-15871.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/15872-16127.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/16128-16383.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/16384-16639.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/16640-16895.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/16896-17151.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/17152-17407.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/17408-17663.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/17664-17919.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/1792-2047.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/17920-18175.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/18176-18431.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/18432-18687.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/18688-18943.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/18944-19199.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/19200-19455.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/19456-19711.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/19712-19967.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/19968-20223.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/20224-20479.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/2048-2303.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/20480-20735.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/20736-20991.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/20992-21247.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/21248-21503.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/21504-21759.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/21760-22015.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/22016-22271.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/22272-22527.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/22528-22783.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/22784-23039.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/2304-2559.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/23040-23295.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/23296-23551.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/23552-23807.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/23808-24063.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/24064-24319.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/24320-24575.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/24576-24831.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/24832-25087.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/25088-25343.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/25344-25599.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/256-511.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/2560-2815.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/25600-25855.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/25856-26111.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/26112-26367.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/26368-26623.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/26624-26879.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/26880-27135.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/27136-27391.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/27392-27647.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/27648-27903.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/27904-28159.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/2816-3071.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/28160-28415.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/28416-28671.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/28672-28927.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/28928-29183.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/29184-29439.pbf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../Noto Sans Regular/29440-29695.pbf
|
||||||
@@ -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
Reference in New Issue
Block a user