I have created a map solution, which locates the nearest teacher by distance and the travel time by public transport. But i have an issue looping trough the function that calculates the travel duration (calculateDuration();). Im not recieving any errors, but it returns "undefined".
How my script is set up:
/*
Json i passed through the API ex.:
{
"status": "success",
"message": "Data selected from database",
"data": [
{
"id": "962",
"status": "Active",
"name": "Name name",
"lat": "55.690606",
"lng": "12.565927",
"subjects": "Subjects....",
"study": "Matematik, Københavns Universitet"
},
*/
(function() {
window.onload = function() {
// Setting up vars
var json = $.getJSON('/api/v1/teachers_by_location', function(data) {
var out = data.data;
var map = new google.maps.Map(document.getElementById("map"), {
center: new google.maps.LatLng(55.6764184, 12.569247200000063),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var infoWindow = new google.maps.InfoWindow();
var distanceObj = [], i = 0;
var directionsDisplay = new google.maps.DirectionsRenderer({map:map});
var directionsService = new google.maps.DirectionsService;
// Student marker
latLng = new google.maps.LatLng(55.6764184, 12.569247200000063);
var marker = new google.maps.Marker({
position: latLng,
map: map,
animation: google.maps.Animation.BOUNCE,
title: "Customer"
});
$.each(out, function (a, b) {
distanceObj[i] = { distance: calculateDistance(55.6764184, 12.569247200000063, b.lng, b.lat), duration: calculateDuration(directionsService, b.lng, b.lat), location: a, name: b.name, subjects: b.subjects, study: b.study };
++i;
});
distanceObj.sort(function (a, b) {
return parseInt(a.distance) - parseInt(b.distance)
});
$.each(distanceObj, function (a, b) {
$('#list').append('<tr><td>' + b.name + '</td><td>' + b.study + '</td><td>' + b.subjects + '</td><td>' + b.distance + 'm (' + b.duration + ')</td></tr>');
});
function calculateDistance(meineLongitude, meineLatitude, long1, lat1) {
erdRadius = 6371;
meineLongitude = meineLongitude * (Math.PI / 180);
meineLatitude = meineLatitude * (Math.PI / 180);
long1 = long1 * (Math.PI / 180);
lat1 = lat1 * (Math.PI / 180);
x0 = meineLongitude * erdRadius * Math.cos(meineLatitude);
y0 = meineLatitude * erdRadius;
x1 = long1 * erdRadius * Math.cos(lat1);
y1 = lat1 * erdRadius;
dx = x0 - x1;
dy = y0 - y1;
d = Math.sqrt((dx * dx) + (dy * dy));
return Math.round(d * 1000);
};
function calculateDuration(directionsService, long2, lat2) {
var lat3 = parseFloat(lat2);
var long3 = parseFloat(long2);
directionsService.route({
origin: {lat: lat3, lng: long3},
destination: {lat: <?php echo $lat; ?>, lng: <?php echo $lng; ?>},
travelMode: google.maps.TravelMode['TRANSIT']
}, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
return response.routes[0].legs[0].duration.text;
} else {
return "Error";
}
});
};
// Looping through the JSON data
for (var i = 0, length = out.length; i < length; i++) {
var data = out[i],
latLng = new google.maps.LatLng(data.lat, data.lng);
// Creating a marker and putting it on the map
var marker = new google.maps.Marker({
position: latLng,
map: map,
title: data.name
});
// Creating a closure to retain the correct data, notice how I pass the current data in the loop into the closure (marker, data)
(function(marker, data) {
// Attaching a click event to the current marker
google.maps.event.addListener(marker, "click", function(e) {
infoWindow.setContent(data.name);
infoWindow.open(map, marker);
});
})(marker, data);
}
});
}
})();
body {
font-family: helvetica;
}
#map {
position: absolute;
right: 0;
top: 0;
width: 30%;
height: 100%;
}
#list_holder {
position: absolute;
left: 0;
bottom: 0;
width: 70%;
height: 100%;
overflow-y: scroll;
}
#list {
position: relative;
float: left;
width: 100%;
height: 100%;
}
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="http://code.jquery.com/jquery-2.1.4.min.js//maps.googleapis.com/maps/api/js?sensor=false"></script>
<div id="map"></div>
<div id="list_holder">
<table id="list" border="1">
<tr>
<td colspan="4">Nærmeste undervisere:</td>
</tr>
</table>
</div>
Can anybody help me?
UPDATE: When modifying the script like so:
function calculateDuration(directionsService, long2, lat2) {
var lat3 = parseFloat(lat2);
var long3 = parseFloat(long2);
directionsService.route({
origin: {lat: lat3, lng: long3},
destination: {lat: <?php echo $lat; ?>, lng: <?php echo $lng; ?>},
travelMode: google.maps.TravelMode['TRANSIT']
}, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
//return response.routes[0].legs[0].duration.text;
//console.log("hej");
console.log(response.routes[0].legs[0].duration.text);
} else {
//return "Error";
console.log("error");
}
});
};
It console.logs:
121 error 3 timer 49 min. 3 timer 14 min. 3 timer 32 min. 3 timer 21 min. 3 timer 48 min. 3 timer 20 min. 3 timer 21 min. 3 timer 16 min. 3 timer 18 min. 58 min.
So why the undefined when i try to return the text?