2017-04-14 18:18:20 -06:00
|
|
|
'use strict';
|
2017-06-23 11:00:42 -06:00
|
|
|
/* global google mapuser userid disp noHeader */
|
2017-04-14 18:18:20 -06:00
|
|
|
|
2017-06-23 11:00:42 -06:00
|
|
|
// Webpack imports
|
|
|
|
import io from 'socket.io-client';
|
|
|
|
import $ from 'jquery';
|
2017-04-14 18:18:20 -06:00
|
|
|
|
|
|
|
// Variables
|
2017-05-19 03:14:55 -06:00
|
|
|
var map, pano, marker, elevator, newLoc;
|
2017-04-25 11:44:11 -06:00
|
|
|
const mapElem = document.getElementById('map'),
|
|
|
|
panoElem = document.getElementById('pano'),
|
|
|
|
socket = io('//'+window.location.hostname);
|
2017-04-14 18:18:20 -06:00
|
|
|
|
|
|
|
function waitForElements(vars,cb){
|
2017-04-25 11:44:11 -06:00
|
|
|
if ( vars.every(function(v){ return v!==undefined; }) ){
|
2017-04-14 18:18:20 -06:00
|
|
|
cb();
|
|
|
|
} else {
|
2017-04-25 11:44:11 -06:00
|
|
|
setTimeout(waitForElements(vars,cb), 100);
|
2017-04-14 18:18:20 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function onConnect(socket,userid,mapuserid) {
|
|
|
|
|
|
|
|
// Can get location
|
|
|
|
socket.emit('can-get', mapuserid );
|
|
|
|
console.log("🚹 Receiving updates for",mapuserid);
|
|
|
|
|
|
|
|
// Can set location too
|
2017-04-26 21:00:50 -06:00
|
|
|
if (mapuserid===userid) {
|
2017-04-14 18:18:20 -06:00
|
|
|
socket.emit('can-set', userid );
|
|
|
|
console.log("🚹 Sending updates for",userid);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// socket.io stuff
|
|
|
|
socket
|
|
|
|
.on('connect', function(){
|
|
|
|
console.log("⬆️ Connected!");
|
|
|
|
waitForElements([mapuser,userid], function() {
|
|
|
|
onConnect(socket,userid,mapuser._id);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.on('disconnect', function(){
|
|
|
|
console.log("⬇️ Disconnected!");
|
|
|
|
})
|
|
|
|
.on('error', function (err){
|
2017-04-25 07:56:04 -06:00
|
|
|
console.error('❌️',err.message);
|
2017-04-14 18:18:20 -06:00
|
|
|
});
|
|
|
|
|
|
|
|
// Parse location
|
|
|
|
function parseLoc(loc) {
|
|
|
|
loc.spd = (mapuser.settings.units=='standard')?parseFloat(loc.spd)*2.23694:parseFloat(loc.spd);
|
|
|
|
loc.dir = parseFloat(loc.dir);
|
|
|
|
loc.lat = parseFloat(loc.lat);
|
|
|
|
loc.lon = parseFloat(loc.lon);
|
2017-05-06 23:12:54 -06:00
|
|
|
loc.tim = new Date(loc.tim).toLocaleString();
|
2017-04-14 18:18:20 -06:00
|
|
|
loc.glatlng = new google.maps.LatLng(loc.lat, loc.lon);
|
|
|
|
return loc;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Show/hide map if location is set/unset
|
|
|
|
function toggleMaps(loc) {
|
|
|
|
if (loc.lat===0&&loc.lon===0) {
|
|
|
|
$('#map').hide();
|
|
|
|
$('#pano').hide();
|
|
|
|
$('#notset').show();
|
2017-05-08 20:53:15 -06:00
|
|
|
}
|
|
|
|
else {
|
2017-04-14 18:18:20 -06:00
|
|
|
$('#map').show();
|
|
|
|
$('#pano').show();
|
|
|
|
$('#notset').hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Toggle maps on page load
|
|
|
|
$(function() {
|
|
|
|
toggleMaps(mapuser.last);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Google maps API callback
|
|
|
|
window.gmapsCb = function() {
|
2017-04-26 21:00:50 -06:00
|
|
|
//console.log("gmapsCb() called");
|
|
|
|
|
2017-04-25 11:44:11 -06:00
|
|
|
// Make sure everything's ready...
|
|
|
|
waitForElements([mapuser,disp,noHeader], function() {
|
2017-04-14 18:18:20 -06:00
|
|
|
|
2017-04-25 11:44:11 -06:00
|
|
|
// Create map
|
|
|
|
if (disp!=='1') {
|
|
|
|
//console.log("Creating map...");
|
2017-05-08 20:53:15 -06:00
|
|
|
|
2017-04-25 11:44:11 -06:00
|
|
|
map = new google.maps.Map( mapElem, {
|
|
|
|
center: new google.maps.LatLng( mapuser.last.lat, mapuser.last.lon ),
|
|
|
|
panControl: false,
|
|
|
|
scaleControl: mapuser.settings.showScale,
|
|
|
|
draggable: false,
|
|
|
|
zoom: mapuser.settings.defaultZoom,
|
|
|
|
streetViewControl: false,
|
|
|
|
zoomControlOptions: {position: google.maps.ControlPosition.LEFT_TOP},
|
|
|
|
mapTypeId: (mapuser.settings.defaultMap=='road')?google.maps.MapTypeId.ROADMAP:google.maps.MapTypeId.HYBRID
|
2017-04-14 18:18:20 -06:00
|
|
|
});
|
2017-04-25 11:44:11 -06:00
|
|
|
marker = new google.maps.Marker({
|
|
|
|
position: { lat:mapuser.last.lat, lng:mapuser.last.lon },
|
|
|
|
title: mapuser.name,
|
|
|
|
map: map,
|
|
|
|
draggable: false
|
|
|
|
});
|
|
|
|
map.addListener('zoom_changed',function(){
|
|
|
|
map.setCenter(marker.getPosition());
|
|
|
|
});
|
|
|
|
|
|
|
|
// Create iFrame logo
|
|
|
|
if (noHeader!=='0') {
|
|
|
|
//console.log("Creating iFrame logo...");
|
|
|
|
const logoDiv = document.createElement('div');
|
|
|
|
logoDiv.id = 'map-logo';
|
|
|
|
logoDiv.innerHTML = '<a href="https://tracman.org/">'+
|
|
|
|
'<img src="https://tracman.org/static/img/style/logo-28.png" alt="[]">'+
|
|
|
|
"<span class='text'>Tracman</span></a>";
|
|
|
|
map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(logoDiv);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create update time block
|
|
|
|
//console.log("Creating time block...");
|
|
|
|
const timeDiv = document.createElement('div');
|
|
|
|
timeDiv.id = 'timestamp';
|
|
|
|
if (mapuser.last.time) {
|
|
|
|
timeDiv.innerHTML = 'location updated '+new Date(mapuser.last.time).toLocaleString();
|
|
|
|
}
|
|
|
|
map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(timeDiv);
|
|
|
|
|
|
|
|
// Create speed block
|
|
|
|
if (mapuser.settings.showSpeed) {
|
|
|
|
//console.log("Creating speed sign...");
|
|
|
|
const speedSign = document.createElement('div'),
|
|
|
|
speedLabel = document.createElement('div'),
|
|
|
|
speedText = document.createElement('div'),
|
|
|
|
speedUnit = document.createElement('div');
|
|
|
|
speedLabel.id = 'spd-label';
|
|
|
|
speedLabel.innerHTML = 'SPEED';
|
|
|
|
speedText.id = 'spd';
|
|
|
|
speedText.innerHTML = (mapuser.settings.units=='standard')?(parseFloat(mapuser.last.spd)*2.23694).toFixed():mapuser.last.spd.toFixed();
|
|
|
|
speedUnit.id = 'spd-unit';
|
|
|
|
speedUnit.innerHTML = (mapuser.settings.units=='standard')?'m.p.h.':'k.p.h.';
|
|
|
|
speedSign.id = 'spd-sign';
|
|
|
|
speedSign.appendChild(speedLabel);
|
|
|
|
speedSign.appendChild(speedText);
|
|
|
|
speedSign.appendChild(speedUnit);
|
|
|
|
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(speedSign);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create altitude block
|
|
|
|
if (mapuser.settings.showAlt) {
|
|
|
|
//console.log("Creating altitude sign...");
|
2017-04-26 21:00:50 -06:00
|
|
|
const elevator = new google.maps.ElevationService,
|
|
|
|
altitudeSign = document.createElement('div'),
|
2017-04-25 11:44:11 -06:00
|
|
|
altitudeLabel = document.createElement('div'),
|
|
|
|
altitudeText = document.createElement('div'),
|
|
|
|
altitudeUnit = document.createElement('div');
|
|
|
|
altitudeLabel.id = 'alt-label';
|
|
|
|
altitudeText.id = 'alt';
|
|
|
|
altitudeUnit.id = 'alt-unit';
|
|
|
|
altitudeSign.id = 'alt-sign';
|
|
|
|
altitudeText.innerHTML = '';
|
|
|
|
altitudeLabel.innerHTML = 'ALTITUDE';
|
|
|
|
getAltitude(new google.maps.LatLng(mapuser.last.lat,mapuser.last.lon), elevator, function(alt) {
|
|
|
|
if (alt) { altitudeText.innerHTML = (mapuser.settings.units=='standard')?(alt*3.28084).toFixed():alt.toFixed(); }
|
|
|
|
});
|
|
|
|
altitudeUnit.innerHTML = (mapuser.settings.units=='standard')?'feet':'meters';
|
|
|
|
altitudeSign.appendChild(altitudeLabel);
|
|
|
|
altitudeSign.appendChild(altitudeText);
|
|
|
|
altitudeSign.appendChild(altitudeUnit);
|
|
|
|
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(altitudeSign);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create streetview
|
|
|
|
if (disp!=='0' && mapuser.settings.showStreetview) {
|
|
|
|
//console.log("Creating streetview...");
|
|
|
|
updateStreetView(parseLoc(mapuser.last),10);
|
2017-04-14 18:18:20 -06:00
|
|
|
}
|
|
|
|
|
2017-04-25 11:44:11 -06:00
|
|
|
});
|
2017-04-26 21:00:50 -06:00
|
|
|
|
2017-04-14 18:18:20 -06:00
|
|
|
};
|
|
|
|
|
2017-04-26 21:00:50 -06:00
|
|
|
// Got location
|
2017-04-14 18:18:20 -06:00
|
|
|
socket.on('get', function(loc) {
|
2017-04-26 21:00:50 -06:00
|
|
|
console.log("🌐️ Got location:",loc.lat+", "+loc.lon);
|
2017-04-14 18:18:20 -06:00
|
|
|
|
2017-04-26 21:00:50 -06:00
|
|
|
// Parse location
|
2017-05-19 03:14:55 -06:00
|
|
|
newLoc = parseLoc(loc);
|
2017-05-08 20:53:15 -06:00
|
|
|
|
2017-04-26 21:00:50 -06:00
|
|
|
// Update map
|
|
|
|
if (disp!=='1') {
|
2017-05-08 20:53:15 -06:00
|
|
|
|
2017-04-26 21:00:50 -06:00
|
|
|
// Update time
|
2017-05-19 03:14:55 -06:00
|
|
|
$('#timestamp').text('location updated '+newLoc.tim);
|
2017-04-26 21:00:50 -06:00
|
|
|
|
|
|
|
// Update marker and map center
|
2017-05-08 20:53:15 -06:00
|
|
|
google.maps.event.trigger(map,'resize');
|
2017-05-19 03:14:55 -06:00
|
|
|
map.setCenter({ lat:newLoc.lat, lng:newLoc.lon });
|
|
|
|
marker.setPosition({ lat:newLoc.lat, lng:newLoc.lon });
|
2017-04-26 21:00:50 -06:00
|
|
|
|
|
|
|
// Update speed
|
|
|
|
if (mapuser.settings.showSpeed) {
|
2017-05-19 03:14:55 -06:00
|
|
|
$('#spd').text( newLoc.spd.toFixed() );
|
2017-04-26 21:00:50 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Update altitude
|
2017-04-14 18:18:20 -06:00
|
|
|
if (mapuser.settings.showAlt) {
|
2017-04-26 21:00:50 -06:00
|
|
|
getAltitude({
|
2017-05-19 03:14:55 -06:00
|
|
|
lat: newLoc.lat,
|
|
|
|
lng: newLoc.lon
|
2017-04-26 21:00:50 -06:00
|
|
|
}, elevator, function(alt) {
|
|
|
|
if (alt) {
|
|
|
|
$('#alt').text( (mapuser.settings.units=='standard')?(alt*3.28084).toFixed():alt.toFixed() );
|
|
|
|
}
|
2017-04-14 18:18:20 -06:00
|
|
|
});
|
|
|
|
}
|
2017-04-26 21:00:50 -06:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update street view
|
|
|
|
if (disp!=='0' && mapuser.settings.showStreetview) {
|
2017-05-19 03:14:55 -06:00
|
|
|
updateStreetView(newLoc,10);
|
2017-04-14 18:18:20 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
// Check altitude
|
|
|
|
function getAltitude(loc,elev,cb){
|
2017-04-25 11:44:11 -06:00
|
|
|
//console.log("Getting altitude...");
|
2017-04-14 18:18:20 -06:00
|
|
|
elev = elev || new google.maps.ElevationService;
|
|
|
|
elev.getElevationForLocations({
|
|
|
|
'locations': [loc]
|
|
|
|
}, function(results, status) {
|
|
|
|
if (status === google.maps.ElevationStatus.OK && results[0]) {
|
|
|
|
cb(results[0].elevation);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get street view imagery
|
|
|
|
function getStreetViewData(loc,rad,cb) {
|
2017-05-19 03:14:55 -06:00
|
|
|
// Ensure that the location hasn't changed
|
|
|
|
if (loc===newLoc) {
|
|
|
|
if (!sv) { var sv=new google.maps.StreetViewService(); }
|
|
|
|
sv.getPanorama({
|
|
|
|
location: {
|
|
|
|
lat: loc.lat,
|
|
|
|
lng: loc.lon
|
|
|
|
},
|
|
|
|
radius: rad
|
|
|
|
}, function(data,status){ switch (status){
|
|
|
|
// Success
|
|
|
|
case google.maps.StreetViewStatus.OK:
|
|
|
|
cb(data);
|
|
|
|
break;
|
|
|
|
// No results in that radius
|
|
|
|
case google.maps.StreetViewStatus.ZERO_RESULTS:
|
|
|
|
// Try again with a bigger radius
|
|
|
|
getStreetViewData(loc,rad*2,cb);
|
|
|
|
break;
|
|
|
|
// Error
|
|
|
|
default:
|
|
|
|
console.error(new Error('❌️ Street view not available: '+status).message);
|
|
|
|
} });
|
|
|
|
} else { console.log('loc!==newLoc'); }
|
2017-04-14 18:18:20 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Update streetview
|
|
|
|
function updateStreetView(loc) {
|
2017-04-25 11:44:11 -06:00
|
|
|
//console.log("Updating streetview...");
|
2017-04-14 18:18:20 -06:00
|
|
|
|
2017-05-19 03:14:55 -06:00
|
|
|
// Moving (show stationary image)
|
2017-04-14 18:18:20 -06:00
|
|
|
if (loc.spd>1) {
|
2017-05-19 03:14:55 -06:00
|
|
|
const imgElem = document.getElementById('panoImg');
|
|
|
|
getStreetViewData(loc, 2, function(data){
|
2017-04-25 11:44:11 -06:00
|
|
|
if (!imgElem) {
|
|
|
|
// Create image
|
|
|
|
pano = undefined;
|
|
|
|
$('#pano').empty();
|
|
|
|
$('#pano').append($('<img>',{
|
|
|
|
alt: 'Street view image',
|
|
|
|
src: 'https://maps.googleapis.com/maps/api/streetview?size=800x800&location='+loc.lat+','+loc.lon+'&fov=90&heading='+loc.dir+'&key={{api}}',
|
|
|
|
id: 'panoImg'
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
// Set image
|
|
|
|
$('#panoImg').attr('src','https://maps.googleapis.com/maps/api/streetview?size='+$('#pano').width()+'x'+$('#pano').height()+'&location='+data.location.latLng.lat()+','+data.location.latLng.lng()+'&fov=90&heading='+loc.dir+'&key={{api}}');
|
|
|
|
});
|
2017-04-14 18:18:20 -06:00
|
|
|
}
|
|
|
|
|
2017-05-19 03:14:55 -06:00
|
|
|
// Not moving and pano not set (create panoramic image)
|
2017-04-14 18:18:20 -06:00
|
|
|
else if (pano==null) {
|
2017-05-19 03:14:55 -06:00
|
|
|
getStreetViewData(loc, 2, function(data){
|
2017-04-14 18:18:20 -06:00
|
|
|
// Create panorama
|
|
|
|
$('#pano').empty();
|
|
|
|
const panoOptions = {
|
|
|
|
panControl: false,
|
|
|
|
zoomControl: false,
|
|
|
|
addressControl: false,
|
|
|
|
linksControl: false,
|
|
|
|
motionTracking: false,
|
|
|
|
motionTrackingControl: false
|
|
|
|
};
|
|
|
|
pano = new google.maps.StreetViewPanorama(panoElem, panoOptions);
|
|
|
|
// Set panorama
|
|
|
|
pano.setPano(data.location.pano);
|
|
|
|
pano.setPov({
|
|
|
|
pitch: 0,
|
2017-05-19 03:14:55 -06:00
|
|
|
// Point towards users's location from street
|
2017-04-14 18:18:20 -06:00
|
|
|
heading: Math.atan((loc.lon-data.location.latLng.lng())/(loc.lat-data.location.latLng.lat()))*(180/Math.PI)
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|