我在以下链接上使用JavaScript制作了一条简单的路线:
http://debug.iott.co.il/map/route.v.1.0.html
编辑这里是来自JavaScript的懒人图片。
它从A到B,从B到C,从C到D. 注意这一点,当用户点到C点时,他需要掉头才能到达D点,这对我没问题。
我试图在android studio上复制相同的东西,我得到的路径如下图所示:
所以不是从C到D掉头,而是让用户再次转到A,然后是B,最后是D. 我想弄清楚为什么我使用相同的配置(驾驶模式等)相同的API(谷歌方向),我得到不同的结果。 有任何想法吗 ?
编辑2:这是一些代码: JavaScript:
//You can calculate directions (using a variety of methods of transportation) by using the DirectionsService object.
var directionsService = new google.maps.DirectionsService();
//Define a variable with all map points.
var _mapPoints = new Array();
//Define a DirectionsRenderer variable.
var _directionsRenderer = '';
//This will give you the map zoom value.
var zoom_option = 6;
//LegPoints is your route points between two locations.
var LegPoints = new Array();
var currentPOI = 0;
//Google map object
var map;
var route = {
'ID': '768cbe75-cade-4498-95c5-7369e8ac9d20',
'Name': 'BY Route 1',
'Points': [{
'Latitude': 32.33197427500548,
'Longtitude': 34.894479140639305,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': ''
}, {
'Latitude': 32.330265,
'Longtitude': 34.893424,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}, {
'Latitude': 32.329581,
'Longtitude': 34.894216,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'U'
}, {
'Latitude': 32.330517,
'Longtitude': 34.892191,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}, {
'Latitude': 32.329863,
'Longtitude': 34.890681,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.333253,
'Longtitude': 34.890102,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.333216,
'Longtitude': 34.892721,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}, {
'Latitude': 32.337219,
'Longtitude': 34.893506,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.337473,
'Longtitude': 34.893954,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}, {
'Latitude': 32.337336,
'Longtitude': 34.893433,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}, {
'Latitude': 32.337335,
'Longtitude': 34.894009,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.337281,
'Longtitude': 34.894530,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.335042,
'Longtitude': 34.894198,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}, {
'Latitude': 32.335056,
'Longtitude': 34.894756,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.332629,
'Longtitude': 34.894617,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.333123,
'Longtitude': 34.893378,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.335002,
'Longtitude': 34.894187,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.335120,
'Longtitude': 34.895929,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.331783,
'Longtitude': 34.895945,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'R'
}, {
'Latitude': 32.332448,
'Longtitude': 34.894796,
'Direction': 0,
'TimeStamp': '\/Date(1465923981572+0300)\/',
'Icon': 'L'
}]
};
//InitializeMap() function is used to initialize google map on page load.
function InitializeMap() {
//DirectionsRenderer() is a used to render the direction
_directionsRenderer = new google.maps.DirectionsRenderer({
draggable: true,
map: map,
panel: document.getElementById('right-panel')
});
//Set the your own options for map.
var myOptions = {
zoom: zoom_option,
zoomControl: true,
center: new google.maps.LatLng(32.2679, 34.3718),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
//Define the map.
map = new google.maps.Map(document.getElementById("dvMap"), myOptions);
//Set the map for directionsRenderer
_directionsRenderer.setMap(map);
//Set different options for DirectionsRenderer mehtods.
//draggable option will used to drag the route.
_directionsRenderer.setOptions({
draggable: false
});
////Add the doubel click event to map.
//google.maps.event.addListener(map, "dblclick", function (event) {
// var _currentPoints = event.latLng;
// _mapPoints.push(_currentPoints);
// LegPoints.push('');
// getRoutePointsAndWaypoints(_mapPoints);
//});
//Add the directions changed event to map.
google.maps.event.addListener(_directionsRenderer, 'directions_changed', function() {
var myroute = _directionsRenderer.directions.routes[0];
CreateRoute(myroute);
zoom_option = map.getZoom();
});
InitialRoute();
}
function InitialRoute() {
var latlon = new google.maps.LatLng();
for (var i = currentPOI; i < route.Points.length && i < currentPOI+10; i++) {
latlon = new google.maps.LatLng(route.Points[i].Latitude, route.Points[i].Longtitude);
_mapPoints.push(latlon);
LegPoints.push(latlon);
window.setTimeout(function () { getRoutePointsAndWaypoints(_mapPoints); }, 100);
}
currentPOI += 10;
if (currentPOI > route.Points.length) {
currentPOI = 0;
}
}
function computeTotalDistance(result) {
var total = 0;
var myroute = result.routes[0];
for (var i = 0; i < myroute.legs.length; i++) {
total += myroute.legs[i].distance.value;
}
total = total / 1000;
document.getElementById('total').innerHTML = total + ' km';
}
function CreateRoute(myroute) {
var index = 0;
if (_mapPoints.length > 10) {
index = _mapPoints.length - 10;
}
for (var i = 0; i < myroute.legs.length; i++) {
saveLegPoints(myroute.legs[i], index);
index = index + 1;
}
}
//Saving the all the legs points between two routes
function saveLegPoints(leg, index) {
var points = new Array();
for (var i = 0; i < leg.steps.length; i++) {
for (var j = 0; j < leg.steps[i].lat_lngs.length; j++) {
points.push(leg.steps[i].lat_lngs[j]);
}
}
LegPoints[index] = points;
}
//This will draw the more then 10 points route on map.
function drawPreviousRoute(Legs) {
var segPointValue = new Array();
for (var i = 0; i < Legs; i++) {
var innerArry = LegPoints[i];
for (var j = 0; j < innerArry.length; j++) {
segPointValue.push(innerArry[j]);
}
addPreviousMarker(innerArry[0],i);
}
var polyOptions = {
path: segPointValue,
strokeColor: '#FFCC00',
strokeWeight: 5
};
var poly = new google.maps.Polyline(polyOptions);
poly.setMap(map);
}
//This wil add the marker icon to the route.
function addPreviousMarker(myLatlng,id) {
var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + id + "|FFCC00|0000FF");
//var pinImage = {
// url: "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + id + "|FFCC00|0000FF"
// //size: new google.maps.Size(71, 71),
// //origin: new google.maps.Point(0, 0),
// //anchor: new google.maps.Point(17, 34),
// //scaledSize: new google.maps.Size(25, 25)
//};
var marker = new google.maps.Marker({
position: myLatlng,
icon: pinImage,//"Images/red-circle.png",
title: ""
});
marker.setMap(map);
}
//getRoutePointsAndWaypoints() will help you to pass points and waypoints to drawRoute() function
function getRoutePointsAndWaypoints(Points) {
if (Points.length <= 10) {
drawRoutePointsAndWaypoints(Points);
}
else {
var newPoints = new Array();
var startPoint = Points.length - 10;
var Legs = Points.length - 10;
for (var i = startPoint; i < Points.length; i++) {
newPoints.push(Points[i]);
}
drawRoutePointsAndWaypoints(newPoints);
drawPreviousRoute(Legs);
}
}
function drawRoutePointsAndWaypoints(Points) {
//Define a variable for waypoints.
var _waypoints = new Array();
if (Points.length > 2) //Waypoints will be come.
{
for (var j = 1; j < Points.length - 1; j++) {
var address = Points[j];
if (address !== "") {
_waypoints.push({
location: address,
stopover: true //stopover is used to show marker on map for waypoints
});
}
}
//Call a drawRoute() function
drawRoute(Points[0], Points[Points.length - 1], _waypoints);
} else if (Points.length > 1) {
//Call a drawRoute() function only for start and end locations
drawRoute(Points[_mapPoints.length - 2], Points[Points.length - 1], _waypoints);
} else {
//Call a drawRoute() function only for one point as start and end locations.
drawRoute(Points[_mapPoints.length - 1], Points[Points.length - 1], _waypoints);
}
}
//drawRoute() will help actual draw the route on map.
function drawRoute(originAddress, destinationAddress, _waypoints) {
//Define a request variable for route .
var _request = '';
//This is for more then two locatins
if (_waypoints.length > 0) {
_request = {
origin: originAddress,
destination: destinationAddress,
waypoints: _waypoints, //an array of waypoints
optimizeWaypoints: false, //set to true if you want google to determine the shortest route or false to use the order specified.
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
} else {
//This is for one or two locations. Here noway point is used.
_request = {
origin: originAddress,
destination: destinationAddress,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
}
//This will take the request and draw the route and return response and status as output
directionsService.route(_request, function(_response, _status) {
if (_status == google.maps.DirectionsStatus.OK) {
_directionsRenderer.setDirections(_response);
computeTotalDistance(_directionsRenderer.getDirections());
}
});
}
Android中的代码是使用库的简单路由调用。
Routing routing = new Routing.Builder()
.travelMode(Routing.TravelMode.DRIVING)
.withListener(this)
.waypoints(firstEightWayPoints)
.language("iw")
.build();
routing.execute();