4 Commits

Author SHA1 Message Date
Râu Cao
1dc218ca8a 1.7.0 2022-09-14 18:50:38 +02:00
Râu Cao
bfd9b4fdf6 Add riders to map 2022-09-14 18:50:02 +02:00
Râu Cao
67707b7ded 1.6.0 2022-09-14 10:18:29 +02:00
Râu Cao
9c96037e32 Add legacy routes 2022-09-14 10:17:55 +02:00
14 changed files with 182618 additions and 52 deletions

182553
data/legacy-route.json Normal file

File diff suppressed because it is too large Load Diff

11
dist/assets/index.2d0ee7b9.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

3
dist/index.html vendored
View File

@@ -7,11 +7,12 @@
<title>Road2Bitcoin Live Map</title> <title>Road2Bitcoin Live Map</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css">
<script defer data-domain="r2b22.kip.pe" src="https://plausible.io/js/plausible.js"></script> <script defer data-domain="r2b22.kip.pe" src="https://plausible.io/js/plausible.js"></script>
<script type="module" crossorigin src="/assets/index.892cac62.js"></script> <script type="module" crossorigin src="/assets/index.2d0ee7b9.js"></script>
<link rel="stylesheet" href="/assets/index.eed9f443.css"> <link rel="stylesheet" href="/assets/index.eed9f443.css">
</head> </head>
<body> <body>
<div id="map"><div id="popup"></div></div> <div id="map"><div id="popup"></div></div>
<div id="people"></div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>

View File

@@ -10,6 +10,7 @@
</head> </head>
<body> <body>
<div id="map"><div id="popup"></div></div> <div id="map"><div id="popup"></div></div>
<div id="people"></div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"></script>
<script type="module" src="./main.js"></script> <script type="module" src="./main.js"></script>
</body> </body>

82
main.js
View File

@@ -7,9 +7,10 @@ import Point from 'ol/geom/Point';
import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer'; import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer';
import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from 'ol/style'; import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from 'ol/style';
import {OSM, Vector as VectorSource} from 'ol/source'; import {OSM, Vector as VectorSource} from 'ol/source';
import {useGeographic, fromLonLat} from 'ol/proj'; import {useGeographic} from 'ol/proj';
import geojsonRoute from './geo/route.json' import geojsonRoute from './data/r2b22-route.json'
import geojsonPOI from './geo/poi.json' import geojsonPOI from './data/r2b22-poi.json';
import geojsonLegacy from './data/legacy-route.json';
useGeographic(); useGeographic();
@@ -114,6 +115,18 @@ async function main() {
style: styles.iconVan style: styles.iconVan
}); });
//
// Legacy routes
//
const vectorSourceLegacy = new VectorSource();
vectorSourceLegacy.addFeatures(new GeoJSON().readFeatures(geojsonLegacy));
const legacyLayer = new VectorLayer({
source: vectorSourceLegacy,
style: styles.lineOrange
});
// //
// Map initialization // Map initialization
// //
@@ -133,6 +146,7 @@ async function main() {
}), }),
stagesCompletedLayer, stagesCompletedLayer,
stagesAheadLayer, stagesAheadLayer,
legacyLayer,
poiLayer, poiLayer,
trackedPointsLayer trackedPointsLayer
], ],
@@ -216,53 +230,49 @@ async function main() {
// Close the popup when the map is moved // Close the popup when the map is moved
map.on('movestart', disposePopover); map.on('movestart', disposePopover);
// //
// Tracking // Tracking
// //
const updateInterval = 5000; const updateInterval = 10000;
// let followedFeature = vanFeature; const peopleOverlays = {};
// let followedZoomed = false;
// let followedFeature = null;
function startFollowing(feature, followLink) { function createParticipantHTML (name) {
followedFeature = feature; if (document.getElementById(`user-${name}`)) return;
followLink.textContent = 'Stop following'; const el = document.createElement('img');
// followLink.removeEventListener('click', startFollowing); el.src = `https://r2b22.kip.pe/avatars/${name}.png`;
followLink.addEventListener('click', stopFollowing(feature, followLink)); el.id = `user-${name}`;
el.style = 'width: 40px; height: 40px; border-radius: 20px;';
document.getElementById('people').append(el);
} }
function stopFollowing(feature, followLink) { function createParticipantOverlay (name) {
followedFeature = null; if (peopleOverlays[name]) return;
followedZoomed = false; const overlayElement = new Overlay({
followLink.textContent = 'Stop following'; stopEvent: false,
// followLink.removeEventListener('click', stopFollowing); positioning: 'center-center',
followLink.addEventListener('click', startFollowing(feature, followLink)); element: document.getElementById(`user-${name}`)
});
peopleOverlays[name] = overlayElement;
map.addOverlay(overlayElement);
} }
function updateData(startInterval=false) { function updateData(startInterval=false) {
fetch('https://r2b22.kip.pe/last.json') fetch('https://r2b22.kip.pe/last.json')
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
console.log(data); // console.debug(data);
const van_data = data.find(i => i.name == 'satoshithevan'); const vanData = data.find(i => i.name == 'satoshithevan');
const van_coords = [van_data.lon, van_data.lat]; const vanCoords = [vanData.lon, vanData.lat];
vanFeature.getGeometry().setCoordinates(van_coords); vanFeature.getGeometry().setCoordinates(vanCoords);
// let zoomLevel; for (const item of data) {
// if (!followedZoomed) { if (!tourStatus.participants.includes(item.name)) continue;
// zoomLevel = 13; createParticipantHTML(item.name);
// followedZoomed = true; createParticipantOverlay(item.name);
// } const overlay = peopleOverlays[item.name];
overlay.setPosition([item.lon, item.lat]);
// if (followedFeature) { }
// view.animate({
// center: followedFeature.getGeometry().getCoordinates(),
// duration: 500,
// zoom: zoomLevel
// });
// }
}); });
if (startInterval) { if (startInterval) {

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "ol-vite", "name": "ol-vite",
"version": "1.5.0", "version": "1.7.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ol-vite", "name": "ol-vite",
"version": "1.5.0", "version": "1.7.0",
"dependencies": { "dependencies": {
"ol": "latest" "ol": "latest"
}, },

View File

@@ -1,6 +1,6 @@
{ {
"name": "map", "name": "map",
"version": "1.5.0", "version": "1.7.0",
"scripts": { "scripts": {
"start": "vite", "start": "vite",
"build": "vite build", "build": "vite build",

View File

@@ -4,6 +4,7 @@ html, body {
margin: 0; margin: 0;
height: 100%; height: 100%;
} }
#map { #map {
position: absolute; position: absolute;
top: 0; top: 0;