Do not change map center or zoom level when rendering directions

前端 未结 2 827
花落未央
花落未央 2020-12-03 15:01

I want to have a large map of berlin from which you see multiple routes. Unfortunately a DirectionsRenderer zooms to the route so you have to manually zoom out again.

相关标签:
2条回答
  • 2020-12-03 15:17

    Use the preserveViewport option of the DirectionsRenderer to prevent the automatic zoom to the route, then set the viewport you like.

    {preserveViewport: true}
    

    Or if you want, calculate the union of the bounds of the directions responses, and fit the map to that.

    var bounds = new google.maps.LatLngBounds();
    routes.forEach(function(route) {
        new google.maps.DirectionsService().route(route, function(body) {
            var display = new google.maps.DirectionsRenderer({preserveViewport: true});
    
            display.setMap(map);
            display.setDirections(body);
            bounds.union(body.routes[0].bounds);
            map.fitBounds(bounds);
        });
    });
    

    proof of concept fiddle

    code snippet:

    var $canvas = document.querySelector('#map');
    
    var map = new google.maps.Map($canvas, {
      center: new google.maps.LatLng(52.46004869999999, 13.37898690),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      zoom: 14
    });
    
    var routes = [{
        origin: new google.maps.LatLng(52.459281, 13.356367),
        destination: new google.maps.LatLng(52.455833, 13.322948),
        travelMode: google.maps.TravelMode.BICYCLING
      },
      {
        origin: new google.maps.LatLng(52.597621, 13.430536),
        destination: new google.maps.LatLng(52.5918799, 13.2832929),
        travelMode: google.maps.TravelMode.BICYCLING
      }
    ];
    var bounds = new google.maps.LatLngBounds();
    routes.forEach(function(route) {
      new google.maps.DirectionsService().route(route, function(body) {
        var display = new google.maps.DirectionsRenderer({
          preserveViewport: true
        });
    
        display.setMap(map);
        display.setDirections(body);
        bounds.union(body.routes[0].bounds);
        map.fitBounds(bounds);
      });
    });
    html,
    body,
    div#map {
      height: 100%;
      width: 100%;
      padding: 0px;
      margin: 0px;
    }
    <div id="map"></div>
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>

    0 讨论(0)
  • 2020-12-03 15:24

    In my case, this worked for me:

      let directionsService = new google.maps.DirectionsService();
            // always pass the `preserveViewport` to maintain the zoom ratio when using directionsRenderer
           let directionsRenderer = new google.maps.DirectionsRenderer({map:this.map,preserveViewport: true});
            //store the request state in an object ` use 'google.maps.TravelMode.DRIVING' instead of 'DRIVING'`
            var request = {
              origin: {query:start},
              destination: {query:end},
              travelMode: google.maps.TravelMode.DRIVING,
            };
            directionsService.route(request, function (response, status) {
             directionsRenderer.setDirections(response);
              // const route = request.routes;
           })
    

    i didn't have to pass the setMap method.

    0 讨论(0)
提交回复
热议问题