6 Commits

Author SHA1 Message Date
Râu Cao a8c0aefbd6 1.8.0 2022-09-14 19:05:41 +02:00
Râu Cao 9c18cc19b7 Add popover for rider markers 2022-09-14 19:05:15 +02:00
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 182633 additions and 65 deletions
+182553
View File
File diff suppressed because it is too large Load Diff
-11
View File
File diff suppressed because one or more lines are too long
+11
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

+2 -1
View File
@@ -7,11 +7,12 @@
<title>Road2Bitcoin Live Map</title>
<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 type="module" crossorigin src="/assets/index.892cac62.js"></script>
<script type="module" crossorigin src="/assets/index.8fd3a327.js"></script>
<link rel="stylesheet" href="/assets/index.eed9f443.css">
</head>
<body>
<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>
</body>
+1
View File
@@ -10,6 +10,7 @@
</head>
<body>
<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 type="module" src="./main.js"></script>
</body>
+61 -49
View File
@@ -7,9 +7,10 @@ import Point from 'ol/geom/Point';
import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer';
import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from 'ol/style';
import {OSM, Vector as VectorSource} from 'ol/source';
import {useGeographic, fromLonLat} from 'ol/proj';
import geojsonRoute from './geo/route.json'
import geojsonPOI from './geo/poi.json'
import {useGeographic} from 'ol/proj';
import geojsonRoute from './data/r2b22-route.json'
import geojsonPOI from './data/r2b22-poi.json';
import geojsonLegacy from './data/legacy-route.json';
useGeographic();
@@ -103,8 +104,7 @@ async function main() {
const vanFeature= new Feature({
geometry: new Point([8.918618, 44.407408]),
name: 'Support Van',
trackable: true
name: 'Support Van'
});
vectorSourceTrackedPoints.addFeature(vanFeature);
@@ -114,6 +114,18 @@ async function main() {
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
//
@@ -133,6 +145,7 @@ async function main() {
}),
stagesCompletedLayer,
stagesAheadLayer,
legacyLayer,
poiLayer,
trackedPointsLayer
],
@@ -177,15 +190,6 @@ async function main() {
title.textContent = feature.get('name');
container.append(title);
return container.innerHTML;
// if (feature.get('trackable')) {
// const linkParent = document.createElement('div');
// const followLink = document.createElement('a');
// followLink.textContent = 'Follow';
// followLink.href = '#';
// followLink.addEventListener('click', startFollowing(feature, followLink));
// linkParent.append(followLink);
// container.append(linkParent);
// }
}
// display popup on click
@@ -194,9 +198,7 @@ async function main() {
return feature;
});
disposePopover();
if (!feature) {
return;
}
if (!feature) return;
popup.setPosition(evt.coordinate);
popover = new bootstrap.Popover(popupEl, {
placement: 'top',
@@ -216,53 +218,63 @@ async function main() {
// Close the popup when the map is moved
map.on('movestart', disposePopover);
//
// Tracking
//
const updateInterval = 5000;
// let followedFeature = vanFeature;
// let followedZoomed = false;
// let followedFeature = null;
const updateInterval = 10000;
const peopleOverlays = {};
function startFollowing(feature, followLink) {
followedFeature = feature;
followLink.textContent = 'Stop following';
// followLink.removeEventListener('click', startFollowing);
followLink.addEventListener('click', stopFollowing(feature, followLink));
function createParticipantHTML (name) {
if (document.getElementById(`user-${name}`)) return;
const el = document.createElement('img');
el.src = `https://r2b22.kip.pe/avatars/${name}.png`;
el.id = `user-${name}`;
el.style = 'width: 40px; height: 40px; border-radius: 20px; cursor: pointer';
document.getElementById('people').append(el);
}
function stopFollowing(feature, followLink) {
followedFeature = null;
followedZoomed = false;
followLink.textContent = 'Stop following';
// followLink.removeEventListener('click', stopFollowing);
followLink.addEventListener('click', startFollowing(feature, followLink));
function createParticipantOverlay (name) {
if (peopleOverlays[name]) return;
const overlayElement = new Overlay({
stopEvent: false,
positioning: 'center-center',
element: document.getElementById(`user-${name}`)
});
peopleOverlays[name] = overlayElement;
map.addOverlay(overlayElement);
}
function updateData(startInterval=false) {
fetch('https://r2b22.kip.pe/last.json')
.then(response => response.json())
.then(data => {
console.log(data);
const van_data = data.find(i => i.name == 'satoshithevan');
const van_coords = [van_data.lon, van_data.lat];
vanFeature.getGeometry().setCoordinates(van_coords);
const vanData = data.find(i => i.name == 'satoshithevan');
const vanCoords = [vanData.lon, vanData.lat];
vanFeature.getGeometry().setCoordinates(vanCoords);
// let zoomLevel;
// if (!followedZoomed) {
// zoomLevel = 13;
// followedZoomed = true;
// }
for (const item of data) {
if (!tourStatus.participants.includes(item.name)) continue;
createParticipantHTML(item.name);
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
// });
// }
function clickHandler () {
disposePopover();
popup.setPosition([item.lon, item.lat]);
popover = new bootstrap.Popover(popupEl, {
placement: 'top',
html: true,
content: `Rider: ${item.name}`
});
popover.show();
}
const avatarEl = document.getElementById(`user-${item.name}`);
avatarEl.removeEventListener('click', clickHandler);
avatarEl.addEventListener('click', clickHandler);
}
});
if (startInterval) {
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "ol-vite",
"version": "1.5.0",
"version": "1.8.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "ol-vite",
"version": "1.5.0",
"version": "1.8.0",
"dependencies": {
"ol": "latest"
},
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "map",
"version": "1.5.0",
"version": "1.8.0",
"scripts": {
"start": "vite",
"build": "vite build",
+1
View File
@@ -4,6 +4,7 @@ html, body {
margin: 0;
height: 100%;
}
#map {
position: absolute;
top: 0;