4 Commits

Author SHA1 Message Date
Râu Cao
b527049acb 1.1.0 2022-09-04 20:55:44 +02:00
Râu Cao
18ea53313f WIP tracked POIs 2022-09-04 20:53:37 +02:00
Râu Cao
9e839def7a 1.0.1 2022-09-03 11:54:42 +02:00
Râu Cao
47f1fce82d Use public dir for static assets 2022-09-03 11:54:15 +02:00
10 changed files with 96 additions and 26 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

2
dist/index.html vendored
View File

@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Road2Bitcoin Live Map</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css">
<script type="module" crossorigin src="/assets/index.7920774d.js"></script>
<script type="module" crossorigin src="/assets/index.b64a86a4.js"></script>
<link rel="stylesheet" href="/assets/index.eed9f443.css">
</head>
<body>

92
main.js
View File

@@ -7,7 +7,7 @@ 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} from 'ol/proj';
import {useGeographic, fromLonLat} from 'ol/proj';
import geojsonRoute from './geo/route.json'
import geojsonPOI from './geo/poi.json'
@@ -33,7 +33,7 @@ const styles = {
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
src: 'data/icon.png',
src: '/img/icon.png',
}),
}),
iconVan: new Style({
@@ -41,7 +41,7 @@ const styles = {
anchor: [0.5, 16],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
src: 'data/van-100px.png',
src: '/img/van-100px.png',
}),
}),
circleBlack: new Style({
@@ -96,17 +96,18 @@ const poiLayer = new VectorLayer({
style: styles.circleBlack,
});
const vectorSourceVan = new VectorSource();
const vectorSourceTrackedPoints = new VectorSource();
const vanFeature= new Feature({
geometry: new Point([ 12.498556, 45.780383 ]),
name: 'Support Van'
geometry: new Point([8.918618, 44.407408]),
name: 'Support Van',
trackable: true
});
vectorSourceVan.addFeature(vanFeature);
vectorSourceTrackedPoints.addFeature(vanFeature);
const vanLayer = new VectorLayer({
source: vectorSourceVan,
const trackedPointsLayer = new VectorLayer({
source: vectorSourceTrackedPoints,
style: styles.iconVan
});
@@ -119,6 +120,8 @@ const view = new View({
zoom: 6.6
})
window.view = view;
const map = new Map({
target: 'map',
layers: [
@@ -128,7 +131,7 @@ const map = new Map({
stagesCompletedLayer,
stagesAheadLayer,
poiLayer,
vanLayer
trackedPointsLayer
],
view: view
});
@@ -153,6 +156,26 @@ function disposePopover() {
}
}
function createPopoverHtml(feature) {
const container = document.createElement('div');
container.className = 'popover-content';
const title = document.createElement('div');
title.textContent = feature.get('name');
container.append(title);
if (feature.get('trackable')) {
const linkParent = document.createElement('div');
const followLink = document.createElement('a');
followLink.textContent = "Follow";
followLink.addEventListener('click', console.log(feature, followLink));
// followLink.addEventListener('click', startFollowing(feature, followLink));
linkParent.append(followLink);
container.append(linkParent);
}
return container.innerHTML;
}
// display popup on click
map.on('click', function (evt) {
const feature = map.forEachFeatureAtPixel(evt.pixel, function (feature) {
@@ -166,7 +189,7 @@ map.on('click', function (evt) {
popover = new bootstrap.Popover(popupEl, {
placement: 'top',
html: true,
content: feature.get('name'),
content: createPopoverHtml(feature)
});
popover.show();
});
@@ -180,3 +203,50 @@ map.on('pointermove', function (evt) {
// Close the popup when the map is moved
map.on('movestart', disposePopover);
//
// Tracking
//
const updateInterval = 5000;
let followedFeature = vanFeature;
// let followedFeature = null;
function startFollowing(feature, followLink) {
followedFeature = feature;
followLink.textContent = 'Stop following';
// followLink.removeEventListener('click', startFollowing);
followLink.addEventListener('click', stopFollowing(feature, followLink));
}
function stopFollowing(feature, followLink) {
followedFeature = null;
followLink.textContent = 'Stop following';
// followLink.removeEventListener('click', stopFollowing);
followLink.addEventListener('click', startFollowing(feature, followLink));
}
function updateData(startInterval=false) {
fetch('https://r2b22.kip.pe/last.json')
.then(response => response.json())
.then(data => {
console.log(data);
const coords = [data.lon, data.lat];
vanFeature.getGeometry().setCoordinates(coords);
if (followedFeature) {
view.animate({
center: followedFeature.getGeometry().getCoordinates(),
duration: 500,
zoom: 13
});
}
});
if (startInterval) {
setInterval(updateData, updateInterval);
}
}
updateData(true);

4
package-lock.json generated
View File

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

View File

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

BIN
public/img/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
public/img/van-100px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB