Leider nicht schön formatiert, aber 1 zu 1 aus der Variable kopiert. Nur die Werte für lat/lon habe ich gerundet…
<html><head> <style> html, body, #map-canvas-41282 { height: 100%; width: 100%; } .map-button-41282 { appearance: button; background-color: #fff; border: 0; border-radius: 2px; box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3); cursor: pointer; margin: 10px; padding: 0 0.5em; height: 40px; font: 400 16px Roboto, Arial, sans-serif; overflow: hidden; } .map-button-41282:hover { background: #ebebeb; } </style> <script> window.detectLocation = function () { // Jump through some hoops and loops for IPSStudio (old Clients) if (window.location.href.substr(0, 5) === "data:") { let data = decodeURIComponent(window.location.href); let match = data.match(/<base href="(http:|https:)\/\/(.*)[\/]*"[\/]*>/); if (match) { return { 'protocol': match[1], 'host': match[2] } } else { document.write("Cannot detect protocol/host on IPSStudio Client!"); throw 'Cannot detect protocol/host on IPSStudio Client!'; } } // For Flutter Web (new Visualization (Web+App) and IPSView WebClient) else if (window.location.href === 'about:srcdoc') { let data = document.body.innerHTML; let match = data.match(/<base href="(http:|https:)\/\/(.*)[\/]*"[\/]*>/); if (match) { return { 'protocol': match[1], 'host': match[2] } } else { return { 'protocol': window.top.location.protocol, 'host': window.top.location.host } } } // Use the simple way for WebFront + old Symcon Apps else { return { 'protocol': window.location.protocol, 'host': window.location.host } } } window.useMap = function (id, home, home_icon, tracker_icon) { let map = { 'id': id, 'home': home, 'home_icon': home_icon, 'tracker_icon': tracker_icon }; // Only load google maps once. Reloading the HTMLBox would load the script multiple times // We also might have multiple maps on the page which would trigger loading multiple times if (typeof (google) === 'undefined') { // Declare a few variables window.google = null; //Just make sure that it is not undefined window.mapZoom = 12; window.socket = []; window.map = []; window.homeMarker = []; window.trackerMarker = []; window.trackerMarkerState = []; window.derferredMaps = [map]; // Now load the Google Maps script let script = document.createElement("script"); script.type = "text/javascript"; script.src = "//maps.googleapis.com/maps/api/js?key=AIzaSyD5wMySMb0f5JNVQrb3CAgz9M7Sixu5Nbo&callback=initMaps"; document.getElementsByTagName("head")[0].appendChild(script); } else if (google === null) { // If google maps is still loading put us in the deferred init map window.derferredMaps.push(map); } else { // If google maps is loaded we can initialize it immediately window.initMap(id, home, home_icon, tracker_icon); } } // We will move the marker on feedback from the websocket channel window.moveMapMarker = function (id, latitude, longitude) { // If we receive the first message from the websocket faster than // the initial fetch response returns if (typeof (window.trackerMarker[id]) !== 'undefined') { let latLng = new google.maps.LatLng(latitude, longitude); window.trackerMarker[id].setPosition(latLng); // Only pan to the marker if we want to follow the vehicle if (window.trackerMarkerState[id] === "follow") { window.map[id].panTo(latLng); } } } // This needs to be in the global scope for the google init script window.initMaps = function () { for (let map of window.derferredMaps) { window.initMap(map.id, map.home, map.home_icon, map.tracker_icon); } } // This will initialize a single map instance window.initMap = function (id, home, home_icon, tracker_icon) { let location = window.detectLocation(); // Close WebSocket, if we are doing a hot-reload if (typeof (window.socket[id]) !== 'undefined') { window.socket[id].close(); } // Initiate websocket which will deliver continuous position updates // We need to properly map our host/protocol to the websocket address window.socket[id] = new WebSocket(location['protocol'].replace(/^http/, 'ws') + "//" + location['host'].replace('/','') + "/hook/position_tracking/" + id.toString()); // Listen for messages window.socket[id].addEventListener('message', function (event) { console.log('GPS', id, event.data); let latLng = JSON.parse(event.data); window.moveMapMarker(id, latLng.latitude, latLng.longitude); }); // Configure Map let homeLocation = JSON.parse(home); let homeLatLng = new google.maps.LatLng(homeLocation.latitude, homeLocation.longitude); let options = { zoom: window.mapZoom, center: homeLatLng, mapTypeId: google.maps.MapTypeId.ROADMAP, streetViewControl: false, rotateControl: false, fullscreenControl: false }; window.map[id] = new google.maps.Map(document.getElementById('map-canvas-' + id.toString()), options); window.disableFollow = (id) => { console.log("Pausing following of vehicle"); window.trackerMarkerState[id] = "paused"; // Only add the button once if (window.map[id].controls[google.maps.ControlPosition.TOP_RIGHT].length === 0) { const button = document.createElement("button"); button.textContent = "Fahrzeug verfolgen"; button.classList.add('map-button-' + id.toString()); button.addEventListener("click", () => { console.log("Resuming following of vehicle"); window.trackerMarkerState[id] = "follow"; window.map[id].setZoom(window.mapZoom); window.map[id].panTo(window.trackerMarker[id].position); window.map[id].controls[google.maps.ControlPosition.TOP_RIGHT].pop(); }); window.map[id].controls[google.maps.ControlPosition.TOP_RIGHT].push(button); } }; // Disable follow after a manual zoom change window.map[id].addListener("zoom_changed", () => { // Bail out if we switch back to the default zoom level if (window.map[id].getZoom() === window.mapZoom) { return; } window.disableFollow(id); }); // Disable follow after a drag window.map[id].addListener("dragend", () => { window.disableFollow(id); }); // Place our home marker window.homeMarker[id] = new google.maps.Marker({ position: homeLatLng, map: window.map[id], icon: 'data:image/png;base64,' + home_icon }); // Fetch initial tracking marker fetch(location['protocol'] + "//" + location['host'].replace('/','') + "/hook/position_tracking/" + id.toString()) .then( function (response) { response.json().then(function (data) { // Place the tracking marker let trackerLocation = JSON.parse(data); let trackerLatLng = new google.maps.LatLng(trackerLocation.latitude, trackerLocation.longitude); window.trackerMarker[id] = new google.maps.Marker({ position: trackerLatLng, map: window.map[id], icon: 'data:image/png;base64,' + tracker_icon }); window.trackerMarkerState[id] = "follow"; window.map[id].panTo(trackerLatLng); }); } ); } // We want to put the placeholder into the string to keep the validator happy useMap(parseInt('41282'), '{"latitude":52.0000,"longitude":13.0000}', 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjEtMDQtMjZUMTk6NTE6MTUrMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTA0LTI2VDE5OjUxOjQ5KzAyOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTA0LTI2VDE5OjUxOjQ5KzAyOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0ZDE3NDg5LTdkMmUtNGM3MC1iYWJhLTY4ZWVmMGVlMTBlYiIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjQ0MDFiODJjLTgzMTUtMmQ0Yy04NTQ4LWY2N2U4MTFjYWU5MSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjkyYTMzNzYwLTA0ZDMtNDQyZS04ODE5LWJiN2E1ZGE1N2NkMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTJhMzM3NjAtMDRkMy00NDJlLTg4MTktYmI3YTVkYTU3Y2QwIiBzdEV2dDp3aGVuPSIyMDIxLTA0LTI2VDE5OjUxOjE1KzAyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTRkMTc0ODktN2QyZS00YzcwLWJhYmEtNjhlZWYwZWUxMGViIiBzdEV2dDp3aGVuPSIyMDIxLTA0LTI2VDE5OjUxOjQ5KzAyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5Ch8elAAAF/UlEQVRIx72VWUyUVxTH71NfmlZT0+2hphFlEY0rMgzDoiKiHcSl2sSmiS9NTBrb2gICM2yCdakiaqUq4oNdHhBlZBsYBhhmmI0ZBhQqSAURWYRhMaRVbBr+PfcyQ7BgW8Xy8M/3zXeX/++ce84d1iuXsakKEs+eSd8e8GdkEOv5IIg56b1ri5R1yWWHuuWyU/ydf+uXB7P79NQHLmFayWKmC/B9SlXSqWIvAtAvD2Q9kbJ9vfJAcPVEBir7OUDkOEA1Bwj4vwBorE8e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'); </script></head><body><div id="map-canvas-41282"></div></body></html>