谷歌方向|相同的API,不同的结果

时间:2016-11-08 14:02:44

标签: javascript java android-studio google-direction google-directory-api

我在以下链接上使用JavaScript制作了一条简单的路线:

http://debug.iott.co.il/map/route.v.1.0.html enter image description here

编辑这里是来自JavaScript的懒人图片。

它从A到B,从B到C,从C到D. 注意这一点,当用户点到C点时,他需要掉头才能到达D点,这对我没问题。

我试图在android studio上复制相同的东西,我得到的路径如下图所示:

android example

所以不是从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();

0 个答案:

没有答案