Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b527049acb
|
||
|
|
18ea53313f
|
||
|
|
9e839def7a
|
||
|
|
47f1fce82d
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
0
data/icon.png → dist/img/icon.png
vendored
0
data/icon.png → dist/img/icon.png
vendored
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
0
data/van-100px.png → dist/img/van-100px.png
vendored
0
data/van-100px.png → dist/img/van-100px.png
vendored
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
2
dist/index.html
vendored
2
dist/index.html
vendored
@@ -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
92
main.js
@@ -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
4
package-lock.json
generated
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
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
BIN
public/img/van-100px.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
Reference in New Issue
Block a user