Plotting more than 8 waypoints in Google Maps v3 - google-maps

Migrating code from Javascript API 2 to 3. I have a list of locations which i need to plot in the form of a driving directions. This was done in v2 using the following code
directions = new GDirections(map);
directions.loadFromWaypoints(waypoints, {preserveViewport: true});
Here is my attempt at converting this to V3
var request = {
origin: startLoc,
destination: endLoc,
waypoints: waypoints,
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
}
});
Not the whole code, but the general idea. Seems to work fine, with one little issue. When there are more than 8 waypoints, the call fails. This is expected since Google Maps API v3 Docs states
The maximum allowed waypoints is 8, plus the origin, and destination. Maps API for Business customers are allowed 23 waypoints, plus the origin, and destination. Waypoints are not supported for transit directions.
Since i didn't run in to this issue in v2, is this a new restriction with v3? I wonder if i am using something that was not designed for what i need. This is a very lightly used applicaton with 2 users, so i am not sure if an expensive business license is worth the return. Emails to Google maps team have not yet been returned. Any workarounds/pointers will be of great help. Thanks.

One possible work around (particularly for a lightly used site) is to use multiple DirectionsService requests.
example 1 (addresses)
example 2 (coordinates)

Use Should need to Use array concept like these...
directionsService[i].route({
'origin': start,
'destination': end
'waypoints': waypts,
'travelMode': 'DRIVING'
},
function (directions, status){
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay[j].setDirections(directions);
}
});
in these directionservice and directiondisplay are should be in array logic
and using looping concepts use should need to assign start,end and waypoints dynamically and
try sending multiple request means u ll get the route for n number of latlon's ...but the markers ll be repeat with same name after 8 waypoints for that we remove the default markers by using supressmarkers false property...

As others said, it's imposable to do it using Google's JavaScript API. However, Google does allow up to 23 waypoints with a server-side request. So using PHP and JavaScript, I was able to make a workaround.
What you have to do is get the "waypoint order" from the server side request and then have JavaScript give you directions between each location.
<?php
$startLocation = "40.713,-74.0135";
$endLocation = "40.75773,-73.985708";
$waypoints = array("40.748433,-73.985656|", "40.689167,-74.044444|");
$apiKey = "";
$routeData = json_decode(file_get_contents("https://maps.googleapis.com/maps/api/directions/json?origin=".$startLoc."&destination=".$endLoc."&waypoints=optimize:true|".$waypoints."&key=".$apiKey));
echo "var waypointsOrder = ". json_encode($routeData->routes[0]->waypoint_order) . ";\n";
?>
var startLocation = {lat: 40.713, lng: -74.0135};
var endLocation = {lat: 40.75773, lng: -73.985708};
//get directions from the origin to the first waypoint
var request = {
origin: startLocation,
destination: JSON.parse(places[waypointsOrder[0]][1]),
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function (result, status) {
if (status == google.maps.DirectionsStatus.OK) {
renderDirections(result, map);
}
});
//get directions from the last waypoint to the destination
var request = {
origin: JSON.parse(places[waypointsOrder[waypointsOrder.length-1]][1]),
destination: endLocation,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function (result, status) {
if (status == google.maps.DirectionsStatus.OK) {
renderDirections(result, map);
}
});
//get directions between each waypoint
for (i = 1; i < waypointsOrder.length; i++) {
var request = {
origin: JSON.parse(places[waypointsOrder[i-1]][1]),
destination: JSON.parse(places[waypointsOrder[i]][1]),
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function (result, status) {
if (status == google.maps.DirectionsStatus.OK) {
renderDirections(result, map);
}
});
}
function renderDirections(result, map) {
var directionsDisplay = new google.maps.DirectionsRenderer ({
map: map
});
directionsDisplay.setMap(map);
directionsDisplay.setDirections(result);
}

Related

how to set waypoint itinerary with google maps and ionic

I need to display a map on the screen, where there is an itinerary of the places I need to go.
I need it to be displayed in sequence, and for the map to show me the full route of the places I need to go in sequence.
I know that markers can be created, but I would like to create points on the map in sequence starting from a starting location and an ending location, there may be multiple locations but I want the map to trace the full route between the locations in the visit sequence.
I didn't find anything that would allow me to do this in the Google Maps API documentation, is it possible to do this?
In this example, i've done 2 waypoints that the map need to go, and then render the map with those, solving TSP problem (Travelling salesman problem)
loadMap(){
// create a new map by passing HTMLElement
let mapEle: HTMLElement = document.getElementById('map_canvas');
let directionsService = new google.maps.DirectionsService();
let directionsDisplay = new google.maps.DirectionsRenderer();
// create map
this.map = new google.maps.Map(mapEle, {
center: this.start,
zoom: 13
});
directionsDisplay.setMap(this.map);
var request = {
origin:{lat: -34.6496604, lng: -58.4047352},
destination:{lat: -34.650078, lng: -58.402425},
waypoints: //your array of waypoints, example [{
location:{lat: -34.597353,lng: -58.415832},
stopover: true
},
{
location:{lat: -34.608441,lng: -58.406194},
stopover: true
}],
optimizeWaypoints:true,
provideRouteAlternatives: false,
travelMode: 'DRIVING'
};
directionsService.route(request, function(response, status) {
if (status == 'OK') {
directionsDisplay.setDirections(response);
}
});
}
Solved with Javascript API from google maps, for further information check : https://developers.google.com/maps/documentation/javascript/directions

different results between map.google.com and google api for javascript

i'm making simple website that helps to find direction between 2 points.
and i found something strange.
if i search through map.google.com it returns exact results, but mine dose not.
for example, i set "New York University, New York, NY, United States" as origin and "260 Broadway New York NY 10007" as destination using map.google.com
using map.google.com
if i use my website using googleMap API->
using api
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDs8SYxRh-pMXa9Qe-K1nVY0g3CLpmJ9mo&signed_in=true&libraries=places&callback=initMap" async defer></script>
function calculateAndDisplayRoute(directionsDisplay, directionsService,
markerArray, stepDisplay, map) {
for (var i = 0; i < markerArray.length; i++) {
markerArray[i].setMap(null);
}
directionsDisplay.setPanel(document.getElementById('panel'));
var selectedMode = document.getElementById('mode').value;
directionsService.route({
origin: document.getElementById('pac-input').value,
destination: document.getElementById('pac-input2').value,
travelMode: google.maps.TravelMode[selectedMode]
}, function(response, status) {
// Route the directions and pass the response to a function to create
// markers for each step.
if (status === google.maps.DirectionsStatus.OK) {
document.getElementById('warnings-panel').innerHTML =
'<b>' + response.routes[0].warnings + '</b>';
directionsDisplay.setDirections(response);
//showSteps(response, markerArray, stepDisplay, map);
} else {
window.alert('Directions request failed due to ' + status);
}
});
}
It looks like you have places autocomplete inputs and read value of these inputs in your code.
I can suggest using the place ID from places autocomplete in your directions service. This way you will be sure that you work with the address that was chosen.
Look at this example and type there your addresses http://jsbin.com/xuyisem/1/edit?html,output

Google Maps Route API V3: Bug for specific location, only when set as destination?

I'm currently using the Google Maps API to find transit routes between two locations. It works fine on almost all occassions, except when the destination is Schiphol, Netherlands (the national Dutch airport).
No matter what the starting location is, the Google Maps API won't find any transit routes that lead to Schiphol. Strange, because when I enter the exact same locations on http://maps.google.com, Google finds plenty of routes. Also, everything works fine when Schiphol, Netherlands is the starting point.
Please refer to this JSFiddle, or the code below.
var directionsService = new google.maps.DirectionsService;
directionsService.route({
origin: 'Rotterdam, Netherlands',
destination: 'Schiphol, Netherlands', // Change this to e.g. 'The Hague, Netherlands' and it works.
travelMode: google.maps.TravelMode.TRANSIT,
}, function(response, status) {
if (status === google.maps.DirectionsStatus.OK) {
var route = response.routes[0].legs[0];
window.alert('When Schiphol is destination: noute found!')
} else {
window.alert('When Schiphol is destination: no transit routes found.')
}
});
directionsService.route({
origin: 'Schiphol, Netherlands',
destination: 'Rotterdam, Netherlands',
travelMode: google.maps.TravelMode.TRANSIT,
}, function(response, status) {
if (status === google.maps.DirectionsStatus.OK) {
var route = response.routes[0].legs[0];
window.alert('When Schiphol is origin: route found!')
} else {
window.alert('When Schiphol is origin: no transit routes found.')
}
});

Multiple directions on the same Google Map on click

I would like to reproduce a multi direction route sistem on the same Google Map like this website: http://hotelberna.com/en/where-we-are/
The same start point and multiple destinations. When I click on each final destination, then the map show me the new route.
Thanks in advance
I think you must be talking about something like this, right?
http://jsfiddle.net/dm1o1ktf/
(a modified version of the sample code in the documentation)
What you need is to trigger some function like calcRoute when you select a new location; in which you calculate the new route using the directionsService, like this:
function calcRoute() {
var start = "Mountain View, CA";
var end = document.getElementById('end').value;
var request = {
origin:start,
destination:end,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
}
});
}

Is it possible to put a marker after some "km" from the start point in a DirectionsService's route?

This is my code :
var request = {
origin: start,
destination: end,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
directionsService.route(request, function (response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
}
});
now, I'd like to put a marker after 200km from the point origin: start : is it possible?
Here is an example that puts two markers on a route (one at 9.5km and one at 64.8km):
http://www.geocodezip.com/v3_GoogleEx_directions-waypoints_kmmarkersC.html
(so, yes, it is possible)
This example was created before the geometry library was released, and might be able to be re-written to use that.