let allAccSerial = [] let allSerialCoords = [] var ctx = document.getElementById('accChart').getContext('2d'); var accChart = new Chart(ctx, { type: 'line', data: { labels: [], datasets: [{ label: 'Ublox Horizontal acc. (m)', backgroundColor: 'rgba(255, 255, 255, 1)', borderColor: 'rgba(255, 255, 255, 1)', borderWidth: 1, fill: false, pointRadius: 0.5, lineTension: 0.5, data: [] }, { label: 'Distance Ublox - Smartphone (m)', backgroundColor: 'rgba(30, 130, 76, 1)', borderColor: 'rgba(30, 130, 76, 1)', borderWidth: 1, fill: false, pointRadius: 0.5, lineTension: 0.5, data: [] }] }, options: { scales: { yAxes: [{ ticks: { min: 0, max: 20, } }], xAxes: [{ type: 'time', time: { unit: 'second' } }] }, animation: { duration: 0 } } }); function addDistances(tcpDataList, serialDataList){ let tcpCoords = [] let serialCoords = [] let tcpTimes = [] let serialHAccs = [] let distances = [] indexes.forEach(index => { serialHAccs.push(allAccSerial[index].toFixed(2)) serialCoords.push(allSerialCoords[index]) }) tcpDataList.forEach(sensordata => { if(!(sensordata.Speed === 0) && !(sensordata.HAcc === 0)){ if (!(sensordata.Position[0] === 0) && !(sensordata.Position[1] === 0)) { let tcpCoord = [sensordata.Position[1], sensordata.Position[0]] tcpCoords.push(tcpCoord) let time = sensordata.Timestamp tcpTimes.push(time) } } }) for(let i = 0; i < tcpCoords.length; i++){ let distance = distanceInMetersBetweenEarthCoordinates (serialCoords[i][0],serialCoords[i][1],tcpCoords[i][0],tcpCoords[i][1]) distances.push(distance) } accChart.data.labels = tcpTimes accChart.data.datasets[0].data = serialHAccs accChart.data.datasets[1].data = distances accChart.update() } //https://www.movable-type.co.uk/scripts/latlong.html function distanceInMetersBetweenEarthCoordinates(long1, lat1, long2, lat2) { var earthRadiusM = 6371000 var phi1 = lat1 * Math.PI / 180 var phi2 = lat2 * Math.PI / 180 var dlat = (lat2-lat1) * Math.PI / 180 var dlong = (long2 - long1) * Math.PI / 180 var a = Math.sin(dlat/2) * Math.sin(dlat/2) + Math.cos(phi1) * Math.cos(phi2) * Math.sin(dlong/2) * Math.sin(dlong/2) var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)) return earthRadiusM * c }