в какой момент мы должны позвонить в Google map fitBound?

#angular #typescript #google-maps #google-maps-api-3 #google-maps-markers

Вопрос:

Я работаю над веб-приложением, и там я использую карту Google для рисования путей(с помощью api направления) и маркеров на основе списка местоположений. Пути направления и маркеры работают без каких-либо проблем, но мне нужно позвонить в fitBounds после завершения рисования всех путей и маркеров.

Это то, что я пробовал до сих пор

   init() {
    this.drawPaths(this.routes, directionsRendererOptions)
    .subscribe(() => {
        console.log('Path added')
      }, e => {
        console.log('Error', e)
      }, 
      () => {
        console.log('Completed');
        this.addMarkers(this.serviceViewModels);

        setTimeout(() => {
          this.setBounds();
        }, 1000)
    });
  }


drawPaths(routes: { origin: LatLng | string, destination: LatLng, waypoints, useTolls: boolean }[],
            directionRendererOptions?): Observable<{ encodedPath: string, routeIndex: number }> {
    this.routes = routes;
    return interval(300)
      .pipe(
        take(routes.length),
        mergeMap((routeIndex: number) => {
          const route = routes[routeIndex];
          return this.drawPath(route.origin, route.destination, route.waypoints, route.useTolls, routeIndex, directionRendererOptions);
        }),
        map((response: { result, status, routeIndex: number }) => {
          return {encodedPath: response.result.routes[0].overview_polyline, routeIndex: response.routeIndex};
        }),
      );
  }

  drawPath(origin: LatLng | string, destination: LatLng, waypoints,
           useTolls = false,
           locationIndex?: number, directionsRendererOptions?)
    : Observable<{ result, status, routeIndex: number }> {
    return new Observable(observer => {
      const directionsService = new google.maps.DirectionsService();
      let directionsRenderer = new google.maps.DirectionsRenderer({
        suppressMarkers: true,
        preserveViewport: false,
      });

      if (directionsRendererOptions) {
        directionsRenderer = new google.maps.DirectionsRenderer({
          suppressMarkers: true,
          preserveViewport: false,
          draggable: directionsRendererOptions.draggable,
          polylineOptions: directionsRendererOptions.polylineOptions,
        });
      }

      const request = {
        origin,
        destination,
        travelMode: google.maps.TravelMode.DRIVING,
        optimizeWaypoints: true,
        waypoints,
        avoidTolls: !useTolls
      };

      directionsRenderer.setMap(this.map);
      directionsService.route(request, (result, status) => {
        if (status === 'OK') {
          directionsRenderer.setDirections(result);
          observer.next({result, status, routeIndex: locationIndex});
        } else {
          observer.error({result, status});
        }
        observer.complete();
      });
    });
  }

  addMarkers(serviceViewModels: ServiceViewModel[]): void {
    serviceViewModels?.forEach((m, index) => {
      const marker = new google.maps.Marker();
      const label = {text: 'Start', color: 'white', fontWeight: 'bold', fontSize: '14px'};
      const icon = {
        url: `./assets/icons/circle.svg`, scaledSize: new google.maps.Size(30, 30),
        labelOrigin: new google.maps.Point(15, 15),
      };
      marker.setMap(this.map);
      marker.setLabel({...label, text: this.setLabelText(index, this.serviceViewModels.length)});
      marker.setPosition(m.locationDetails?.geoLocation);
      marker.setIcon(icon);
      this.markers.push(marker);
    });
  }

  setBounds(){
    const bounds = new google.maps.LatLngBounds();
    this.markers.forEach((mkr, i) => {
      bounds.extend(mkr.getPosition());
    })
    this.map.fitBounds(bounds);
    this.map.panToBounds(bounds);
  }
 

Этот код работает без проблем с таймаутом. Но когда его удаляют, границы задаются неправильно, и карта фокусируется на одном маркере

кто-нибудь знает, что не так с этим кодом? или я что-то упускаю?