mirror of
https://github.com/owntracks/recorder.git
synced 2024-11-15 09:58:40 -07:00
135 lines
3.9 KiB
JavaScript
135 lines
3.9 KiB
JavaScript
|
|
import { ws_connect } from "./websock.js";
|
|
|
|
import { debug } from "../utils/debug.js";
|
|
import { generatePopupHTML } from "../utils/map.js";
|
|
import { openSingularMarker, fitBounds, markerStyle, clog } from "../utils/map_google.js";
|
|
import { getCosmeticLocation, getCosmeticName } from "../utils/misc.js";
|
|
|
|
let map;
|
|
let do_fit = false;
|
|
const markers = {};
|
|
const livemarkers = true;
|
|
|
|
export function initialize(ws_url) {
|
|
|
|
const params = new URL(window.location).searchParams;
|
|
do_fit = Boolean(params.get("fit"));
|
|
|
|
const mapOptions = {
|
|
center: new google.maps.LatLng(50.098280, 10.187189),
|
|
zoom: 3, // 9,
|
|
maxZoom: 18, // don't overzoom (should this be configurable?)
|
|
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
|
scrollwheel: false,
|
|
disableDefaultUI: false,
|
|
panControl: false,
|
|
scaleControl: false,
|
|
streetViewControl: true,
|
|
overviewMapControl: true,
|
|
};
|
|
|
|
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
|
|
|
|
/* Create the DIV to hold the control and call constructor */
|
|
const buttonControlDiv = document.createElement('div');
|
|
const buttonControl = new ButtonControl(buttonControlDiv);
|
|
|
|
buttonControlDiv.index = 1;
|
|
map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(buttonControlDiv);
|
|
|
|
ws_connect(ws_url, map_marker); // Connect to websocket and start listening
|
|
}
|
|
|
|
function ButtonControl(controlDiv) {
|
|
|
|
// Set CSS for the control border.
|
|
const controlUI = document.createElement('div');
|
|
controlUI.style.backgroundColor = '#fff';
|
|
controlUI.style.border = '2px solid #fff';
|
|
controlUI.style.borderRadius = '3px';
|
|
controlUI.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)';
|
|
controlUI.style.cursor = 'pointer';
|
|
controlUI.style.marginBottom = '22px';
|
|
controlUI.style.textAlign = 'center';
|
|
controlUI.title = 'Click to toggle Autozoom (zoom to fit)';
|
|
controlDiv.appendChild(controlUI);
|
|
|
|
// Set CSS for the control interior.
|
|
const controlText = document.createElement('div');
|
|
controlText.style.color = (do_fit) ? 'rgb(0,153,0)' : 'rgb(25,25,25)';
|
|
controlText.style.fontFamily = 'Roboto,Arial,sans-serif';
|
|
controlText.style.fontSize = '16px';
|
|
controlText.style.lineHeight = '38px';
|
|
controlText.style.paddingLeft = '4px';
|
|
controlText.style.paddingRight = '4px';
|
|
controlText.innerHTML = 'Autozoom';
|
|
controlUI.appendChild(controlText);
|
|
|
|
// Setup the click event listener.
|
|
controlUI.addEventListener('click', function() {
|
|
do_fit = !do_fit;
|
|
controlText.style.color = (do_fit) ? 'rgb(0,153,0)' : 'rgb(25,25,25)';
|
|
if (do_fit) {
|
|
fitBounds(map, markers);
|
|
}
|
|
});
|
|
}
|
|
|
|
/*
|
|
* `loc' is a location object obtained via Websockets from the recorder
|
|
*/
|
|
function map_marker(loc) {
|
|
debug("Format marker:", loc);
|
|
|
|
const id = loc.topic.replaceAll("/", '-');
|
|
|
|
const title = `${ getCosmeticName(loc) } ${ getCosmeticLocation(loc) }`;
|
|
const htmldesc = generatePopupHTML(loc);
|
|
|
|
const LatLng = new google.maps.LatLng(loc.lat, loc.lon);
|
|
if (markers.hasOwnProperty(id)) {
|
|
clog("UPD", id, loc);
|
|
const m = markers[id];
|
|
|
|
m.setPosition(LatLng);
|
|
m.setTitle(title);
|
|
|
|
/* Grab the InfoWindow of this marker and change content */
|
|
m.infowindow.setContent(htmldesc);
|
|
if (livemarkers) {
|
|
openSingularMarker(map, markers, m);
|
|
}
|
|
} else {
|
|
clog("NEW", id, loc);
|
|
|
|
const m = new google.maps.Marker({
|
|
position: LatLng,
|
|
map,
|
|
title: title,
|
|
// icon: "marker.php?tid=" + id,
|
|
// icon: "red-marker.png"
|
|
icon: markerStyle,
|
|
});
|
|
|
|
/* Create a new InfoWindow for this marker, and add listener */
|
|
m.infowindow = new google.maps.InfoWindow({
|
|
content: htmldesc,
|
|
});
|
|
google.maps.event.addListener(m, "click", function() {
|
|
this.infowindow.open(map, this);
|
|
});
|
|
if (livemarkers) {
|
|
openSingularMarker(map, markers, m);
|
|
}
|
|
|
|
markers[id] = m;
|
|
}
|
|
|
|
if (do_fit) {
|
|
fitBounds(map, markers);
|
|
}
|
|
}
|
|
|
|
// google.maps.event.addDomListener(window, 'load', initialize);
|