You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

行程变更时如何清除Google Maps中的旧Polyline?

解决Google Maps更新路线时旧Polyline无法清除的问题

问题根源

你遇到的问题是因为每次生成备选路线时,都会创建新的DirectionsRenderer实例,但没有保存这些实例的引用,导致旧的路线无法被清除。此外,你尝试调用的polyline.remove()无效,因为polyline变量指向的是路由对象而非Google Maps的Polyline实例,且该变量在事件监听器的作用域中不存在。

解决方案

我们需要维护一个全局数组来存储所有DirectionsRenderer实例,每次更新路线前先清除所有旧实例,再创建新的路线渲染器。

修改后的完整代码

<div id="formulaire" class="box">
    <input id="start" type="text" value="$4DTEXT($vo_personne.origine)" class="input my-1">
    <input id="end" type="text" value="$4DTEXT($vo_personne.destination)" class="input my-1">
    
    <div class="select my-1">
        <select id="mode_transport">
            <option value="DRIVING">Voiture</option>
            <option value="TRANSIT">Transports</option>
        </select>
    </div>
    
    <input type="submit" value="Actualiser le trajet" class="button my-1">
</div>

<script>
// 全局变量:存储所有路线渲染器实例
let directionRenderers = [];

// onglets jquery UI
$( function() {
    $( "#tabs" ).tabs();
} );

// Google Maps
function initMap() {
    directionsRenderer = new google.maps.DirectionsRenderer({
        polylineOptions : {
            strokeColor: '#0047b3',
            strokeOpacity: 1.0,
            strokeWeight: 7
        }
    });
    
    directionsService = new google.maps.DirectionsService();
    
    map = new google.maps.Map(document.getElementById("carte"), {
        zoom: 5,  
        center: { lat : 46.603354, lng: 1.888334}, // france
    });

    calculateAndDisplayRoute(directionsService, directionsRenderer);

    // 事件监听器(无需polyline.remove())
    document.getElementById("mode_transport").addEventListener("change", () => {
        calculateAndDisplayRoute(directionsService, directionsRenderer);
    }); 
    document.getElementById("start").addEventListener("change", () => {
        calculateAndDisplayRoute(directionsService, directionsRenderer);
    }); 
    document.getElementById("end").addEventListener("change", () => {
        calculateAndDisplayRoute(directionsService, directionsRenderer);
    });
}

function calculateAndDisplayRoute(directionsService, directionsRenderer) {
    start = document.getElementById("start").value;
    end = document.getElementById("end").value; 
    selectedMode = document.getElementById("mode_transport").value;

    directionsRequest = {
        origin: start,
        destination: end,
        travelMode: google.maps.TravelMode[selectedMode],
        provideRouteAlternatives: true,
        optimizeWaypoints: true,
    };

    directionsService
        .route(directionsRequest)
        .then((response) => {
            // 清除所有旧路线
            directionRenderers.forEach(renderer => renderer.setMap(null));
            directionRenderers = [];

            // 配置主路线渲染器
            directionsRenderer.setDirections(response);
            directionsRenderer.setMap(map);
            directionsRenderer.setPanel(document.getElementById("itineraire"));
            directionRenderers.push(directionsRenderer);
            
            // 添加备选路线渲染器(跳过主路线)
            for (var i = 1, len = response.routes.length; i < len; i++) {
                const altRenderer = new google.maps.DirectionsRenderer({
                    map: map,
                    directions: response,
                    routeIndex: i,
                    // 备选路线使用不同样式区分
                    polylineOptions: {
                        strokeColor: '#ff0000',
                        strokeOpacity: 0.7,
                        strokeWeight: 5
                    }
                });
                directionRenderers.push(altRenderer);
            }
        })
        .catch((e) => window.alert("Directions request failed due to " + e));
}

// création de la carte à l'ouverture de la page
window.initMap = initMap;
</script>

关键说明

  • 清除旧路线:通过遍历directionRenderers数组,调用setMap(null)将旧路线从地图上移除,然后清空数组。
  • 保存新实例:将主路线和备选路线的渲染器都添加到数组中,以便下次更新时可以清除。
  • 样式区分:给备选路线设置不同的线条样式,方便用户区分主路线和备选路线。
  • 避免冗余:循环从i=1开始,跳过主路线(已由主渲染器处理),避免重复渲染。

内容的提问来源于stack exchange,提问作者Melody Nelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:57:16