Неперехваченное исключение при вызове службы направлений Google Maps

Я получаю сообщение об ошибке Uncaught InvalidValueError: in property origin: not a string; and not a LatLng or LatLngLiteral: not an Object, когда звоню в службу маршрутов Google Maps — несмотря на это, кажется, что маршруты добавлены на карту?

Вот функция, которая вызывает службу маршрутов между текущим местоположением (currentPos) и местоположением не слишком далеко (LatLng(52.705151, -2.741861))

    function calcRoute() {
    var start = currentPos;
    var end = new google.maps.LatLng(52.705151, -2.741861);
    var request = {
        origin: start,
        destination: end,
        travelMode: google.maps.TravelMode.WALKING
    };
    directionsService.route(request, function (response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(response);
        }
    });
}

Вот код, который инициализирует карту и вызывает функцию calcRoute():

    var directionsDisplay;
var directionsService = new google.maps.DirectionsService();

var currentPos;
var destinationPos;

var map;

function initialize() {
    directionsDisplay = new google.maps.DirectionsRenderer();
    var mapOptions = {
        zoom: 14
    };

    map = new google.maps.Map(document.getElementById('map_canvas'),
        mapOptions);

    directionsDisplay.setMap(map);

    var infoWindow = new google.maps.InfoWindow();

    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function (position) {
            currentPos = new google.maps.LatLng(position.coords.latitude,
                                             position.coords.longitude);

            var marker = new google.maps.Marker({
                position: currentPos,
                map: map,
                title: "You are here"
            });

            marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')

            map.setCenter(currentPos);

            $.ajax({
                type: 'GET',
                url: $('#AddMarkersToMap').val(),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    addMarkers(data, infoWindow);
                },
                error: function () {
                    alert("Error");
                }
            });


        }, function () {
            handleNoGeolocation(true);
        });
    } else {
        handleNoGeolocation(false);
    }

    calcRoute();


}

Некоторые гуглы предположили, что исключение может быть вызвано тем, что карта не загрузилась, поэтому я попытался ввести вызов calcRoute, подобный этому, который не помог:

    $(function () {
        calcRoute()
    });

person NRKirby    schedule 06.04.2015    source источник


Ответы (1)


Ваша переменная currentPos не определена, когда вы вызываете calcRoute.
getCurrentPosition является асинхронной и не будет выполняться до calcRoute и, следовательно, не будет установлена ​​currentPos.
Если вам нужно использовать currentPos в calcRoute, вы должны вызвать ее в обратном вызове для getCurrentPosition для убедитесь, что он определен.

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {
        currentPos = new google.maps.LatLng(position.coords.latitude,
                                         position.coords.longitude);

        var marker = new google.maps.Marker({
            position: currentPos,
            map: map,
            title: "You are here"
        });

        marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')

        map.setCenter(currentPos);

        $.ajax({
            type: 'GET',
            url: $('#AddMarkersToMap').val(),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                addMarkers(data, infoWindow);
            },
            error: function () {
                alert("Error");
            }
        });
        calcRoute();
        //\\//\\//\\
    }, function () {
        handleNoGeolocation(true);
    });
person Musa    schedule 06.04.2015