2024-03-15 20:07:20 -04:00
|
|
|
import { Controller } from "@hotwired/stimulus"
|
2024-03-21 18:24:47 -04:00
|
|
|
import L, { circleMarker } from "leaflet"
|
2024-03-15 20:07:20 -04:00
|
|
|
|
|
|
|
|
// Connects to data-controller="maps"
|
|
|
|
|
export default class extends Controller {
|
|
|
|
|
static targets = ["container"]
|
|
|
|
|
|
|
|
|
|
connect() {
|
2024-03-16 16:31:07 -04:00
|
|
|
console.log("Map controller connected")
|
2024-03-15 20:07:20 -04:00
|
|
|
var markers = JSON.parse(this.element.dataset.coordinates)
|
2024-04-04 11:31:15 -04:00
|
|
|
var center = markers[markers.length - 1] || JSON.parse(this.element.dataset.center)
|
2024-03-16 16:31:07 -04:00
|
|
|
var center = (center === undefined) ? [52.516667, 13.383333] : center;
|
2024-04-17 15:54:04 -04:00
|
|
|
var osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
|
|
|
maxZoom: 19,
|
|
|
|
|
attribution: '© OpenStreetMap'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var osmHOT = L.tileLayer('https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', {
|
|
|
|
|
maxZoom: 19,
|
|
|
|
|
attribution: '© OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var baseMaps = {
|
|
|
|
|
"OpenStreetMap": osm,
|
|
|
|
|
"OpenStreetMap.HOT": osmHOT
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var map = L.map(this.containerTarget, {
|
|
|
|
|
layers: [osm, osmHOT]
|
|
|
|
|
}).setView([center[0], center[1]], 14);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var markersArray = []
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < markers.length; i++) {
|
|
|
|
|
var lat = markers[i][0];
|
|
|
|
|
var lon = markers[i][1];
|
|
|
|
|
|
|
|
|
|
var popupContent = this.popupContent(markers[i]);
|
|
|
|
|
var circleMarker = L.circleMarker([lat, lon], {radius: 4})
|
|
|
|
|
|
|
|
|
|
markersArray.push(circleMarker.bindPopup(popupContent).openPopup())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var markersLayer = L.layerGroup(markersArray)
|
|
|
|
|
markersLayer.addTo(map);
|
|
|
|
|
|
|
|
|
|
var polylineCoordinates = markers.map(element => element.slice(0, 2));
|
|
|
|
|
var polylineLayer = L.polyline(polylineCoordinates)
|
|
|
|
|
polylineLayer.addTo(map);
|
|
|
|
|
|
|
|
|
|
var controlsLayer = {
|
|
|
|
|
"Points": markersLayer,
|
|
|
|
|
"Polyline": polylineLayer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var layerControl = L.control.layers(baseMaps, controlsLayer).addTo(map);
|
2024-03-15 20:07:20 -04:00
|
|
|
|
2024-03-21 18:54:19 -04:00
|
|
|
this.addTileLayer(map);
|
2024-04-17 15:54:04 -04:00
|
|
|
// var markersLayer = this.addMarkers(map, markers);
|
|
|
|
|
// this.addPolyline(map, markers);
|
2024-03-21 18:54:19 -04:00
|
|
|
this.addLastMarker(map, markers);
|
2024-03-15 20:07:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
disconnect() {
|
|
|
|
|
this.map.remove();
|
|
|
|
|
}
|
2024-03-21 18:24:47 -04:00
|
|
|
|
|
|
|
|
popupContent(marker) {
|
|
|
|
|
return `
|
|
|
|
|
<b>Timestamp:</b> ${this.formatDate(marker[4])}<br>
|
|
|
|
|
<b>Latitude:</b> ${marker[0]}<br>
|
|
|
|
|
<b>Longitude:</b> ${marker[1]}<br>
|
2024-03-22 17:57:53 -04:00
|
|
|
<b>Altitude:</b> ${marker[3]}m<br>
|
|
|
|
|
<b>Velocity:</b> ${marker[5]}km/h<br>
|
2024-03-28 10:11:59 -04:00
|
|
|
<b>Battery:</b> ${marker[2]}%
|
2024-03-21 18:24:47 -04:00
|
|
|
`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
formatDate(timestamp) {
|
|
|
|
|
let date = new Date(timestamp * 1000); // Multiply by 1000 because JavaScript works with milliseconds
|
|
|
|
|
|
|
|
|
|
// Extracting date components
|
|
|
|
|
let year = date.getFullYear();
|
|
|
|
|
let month = ('0' + (date.getMonth() + 1)).slice(-2); // Adding 1 because getMonth() returns zero-based month
|
|
|
|
|
let day = ('0' + date.getDate()).slice(-2);
|
|
|
|
|
let hours = ('0' + date.getHours()).slice(-2);
|
|
|
|
|
let minutes = ('0' + date.getMinutes()).slice(-2);
|
|
|
|
|
let seconds = ('0' + date.getSeconds()).slice(-2);
|
|
|
|
|
|
|
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
|
|
}
|
2024-03-21 18:54:19 -04:00
|
|
|
|
|
|
|
|
addTileLayer(map) {
|
|
|
|
|
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
|
|
|
maxZoom: 19,
|
|
|
|
|
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
|
|
|
|
}).addTo(map);
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-23 11:54:01 -04:00
|
|
|
addMarkers(map, markers_data) {
|
|
|
|
|
var markers = []
|
|
|
|
|
for (var i = 0; i < markers_data.length; i++) {
|
|
|
|
|
var lat = markers_data[i][0];
|
|
|
|
|
var lon = markers_data[i][1];
|
2024-03-21 18:54:19 -04:00
|
|
|
|
2024-03-23 11:54:01 -04:00
|
|
|
var popupContent = this.popupContent(markers_data[i]);
|
2024-03-21 18:54:19 -04:00
|
|
|
var circleMarker = L.circleMarker([lat, lon], {radius: 4})
|
|
|
|
|
|
2024-03-23 11:54:01 -04:00
|
|
|
markers.push(circleMarker.bindPopup(popupContent).openPopup())
|
2024-03-21 18:54:19 -04:00
|
|
|
}
|
2024-03-23 11:54:01 -04:00
|
|
|
|
|
|
|
|
L.layerGroup(markers).addTo(map);
|
2024-03-21 18:54:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addPolyline(map, markers) {
|
|
|
|
|
var coordinates = markers.map(element => element.slice(0, 2));
|
|
|
|
|
L.polyline(coordinates).addTo(map);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addLastMarker(map, markers) {
|
|
|
|
|
if (markers.length > 0) {
|
|
|
|
|
var lastMarker = markers[markers.length - 1].slice(0, 2)
|
|
|
|
|
L.marker(lastMarker).addTo(map);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-15 20:07:20 -04:00
|
|
|
}
|