javascript – 在一张地图上显示多个Google地图标记和路线

我想将多个Google地图路线输出到一个Google地图上.数据来自XML文件,该文件具有多个标记.每个标记都有一个起点和终点(以纬度和经度值的形式).然后将这些标记添加到地图中,并调用Google Maps Directions Service以在每个标记的起点和终点之间绘制路线.

我遇到的问题是只绘制了一条路线(如果我刷新页面,它似乎只是随机选择一个标记并在这两个标记之间绘制方向).其他标记根本不显示.

我已经控制了.记录了for循环以检查它是否正在为XML中的每个标记运行(它是).我猜这与这两行有关,但这是一个猜测……

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

我已经读过这个问题了 – Using Google Maps 3 API to get multiple routes on a Map,但是我真的不明白答案/知道这与我的情况有多大关系.谢谢.

    jQuery(document).ready(function($) { 

    var map = new google.maps.Map(document.getElementById("map_canvas"), {
        zoom: 13,
        mapTypeId: 'roadmap'
    });

    // Try HTML5 geolocation
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
            map.setCenter(pos);
            map.setZoom(13);
        }, function() {
            handleNoGeolocation(true);
        });
    } else {
        // Browser doesn't support Geolocation
        handleNoGeolocation(false);
    } 

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

    // Change this depending on the name of your PHP file
    downloadUrl("xml.php", function(data) {
        var xml = data.responseXML;
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            var title = markers[i].getAttribute("title");
            mode = markers[i].getAttribute("mode");
            startpoint = new google.maps.LatLng(
                parseFloat(markers[i].getAttribute("startlat")),
                parseFloat(markers[i].getAttribute("startlng")));
            endpoint = new google.maps.LatLng(
                parseFloat(markers[i].getAttribute("endlat")),
                parseFloat(markers[i].getAttribute("endlng")));
            calcRoute();
            console.log('marker');
        }
    });
    directionsDisplay.setMap(map);

});


function calcRoute() {
    var request = {
        origin: startpoint,
        destination: endpoint,
        //waypoints: waypts,
        travelMode: google.maps.DirectionsTravelMode[mode]
    };
    directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(response);
        }
    });
}

function downloadUrl(url, callback) {
    var request = window.ActiveXObject ?
    new ActiveXObject('Microsoft.XMLHTTP') :
    new XMLHttpRequest;

    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            request.onreadystatechange = doNothing;
            callback(request, request.status);
        }
    };

    request.open('GET', url, true);
    request.send(null);
}

function doNothing() {}
最佳答案
我认为你所链接答案的关键点是每条路线都需要自己的DirectionsRenderer对象.并没有提到它,但似乎每条路线也应该有自己的DirectionsService对象.您将在所有路线中共享每个这些对象中的一个.我怀疑这些共享对象会被覆盖每个路由.

这是一个更新,应该通过为每个路由创建新对象来解决这个问题:

    jQuery(document).ready(function($) { 

    var map = new google.maps.Map(document.getElementById("map_canvas"), {
        zoom: 13,
        mapTypeId: 'roadmap'
    });

    // Try HTML5 geolocation
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
            map.setCenter(pos);
            map.setZoom(13);
        }, function() {
            handleNoGeolocation(true);
        });
    } else {
        // Browser doesn't support Geolocation
        handleNoGeolocation(false);
    } 

    // Change this depending on the name of your PHP file
    $.get("xml.php", function( xml ) {
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            addMarkerPair( markers[i] );
        }
    }, 'xml' );
});

function addMarkerPair( pair ) {
    function get( name ) {
        return pair.getAttribute( name );
    }
    var title = get("title");
    var mode = get("mode");
    var startpoint = new google.maps.LatLng(
        +get("startlat"),
        +get("startlng")
    );
    var endpoint = new google.maps.LatLng(
        +get("endlat"),
        +get("endlng")
    );
    calcRoute( mode, startpoint, endpoint );
    console.log('marker');
}

function calcRoute( mode, startpoint, endpoint ) {
    var directionsService = new google.maps.DirectionsService();
    var directionsDisplay = new google.maps.DirectionsRenderer();
    directionsDisplay.setMap(map);
    var request = {
        origin: startpoint,
        destination: endpoint,
        //waypoints: waypts,
        travelMode: google.maps.DirectionsTravelMode[mode]
    };
    directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(response);
        }
    });
}

我也冒昧地修复和简化了一些事情:

>将标记循环体移动到单独的addMarkerPair函数,以提高可读性.
>在addMarkerPair中添加了一个get函数,作为pair.getAttribute的简写.
>使用而不是parseInt.任何一个人都会做同样的事情;我喜欢它的简洁.
>添加几个缺少的var声明.
>将必要的参数传递给calcRoute作为函数参数而不是全局变量.
>使用$.get而不是downloadUrl.当jQuery已经拥有它时,不需要你自己的函数.

此外,作为XML解析的另一种替代方法,您可以使用jQuery来访问XML元素.但我坚持使用代码更接近你已经在做的事情.

转载注明原文:javascript – 在一张地图上显示多个Google地图标记和路线 - 代码日志