【问题标题】:Removing directions overlay using angular-google-maps and angular2使用 angular-google-maps 和 angular2 删除方向覆盖
【发布时间】:2017-05-31 16:55:10
【问题描述】:

我使用 api 来填充带有多个标记的地图,我想要的功能是让用户单击与标记关联的按钮,它会从他们当前的位置绘制方向。在第一个实例中,它可以完美运行,但是在尝试更改坐标时绘制的当前方向仍然存在

我使用 angular2-google-maps 来绘制标记,但我必须找到一个自定义指令来指示方向。我认为问题是我需要销毁方向的实例,但使用 ngIf 没有帮助。我还尝试使用 directionDisplay.set('directions', null); 在我的指令中重置方向的实例。但这也没用

      /* directions.directive.ts */

      import {GoogleMapsAPIWrapper} from '@agm/core/services/google-maps-api-wrapper';
      import { Directive,  Input} from '@angular/core';
      declare var google: any;

      @Directive({
        selector: '<agm-map-directions  [origin]="origin" [destination]="destination" #test></agm-map-directions>'
      })
      export class DirectionsMapDirective {
        @Input() origin;
        @Input() destination;
        constructor (private gmapsApi: GoogleMapsAPIWrapper) {}
        ngOnInit(){
          this.gmapsApi.getNativeMap().then(map => {

                    var directionsService = new google.maps.DirectionsService;
                    var directionsDisplay = new google.maps.DirectionsRenderer;

                      console.log("test");
                    directionsDisplay.setMap(map);
                    directionsService.route({
                            origin: {lat: this.origin.latitude, lng: this.origin.longitude},
                            destination: {lat: this.destination.latitude, lng: this.destination.longitude},
                            waypoints: [],
                            optimizeWaypoints: true,
                            travelMode: 'DRIVING'
                          }, function(response, status) {
                                      if (status === 'OK') {


                                        directionsDisplay.setDirections(response);
                                      } else {
                                        window.alert('Directions request failed due to ' + status);
                                      }
                    });

          });
        }
      }

这是与之关联的html

    <agm-map [zoom]="13" [latitude]="currentLocation.result.latitude" [longitude]="currentLocation.result.longitude">
        <agm-marker [latitude]="currentLocation.result.latitude" [longitude]="currentLocation.result.latitude"></agm-marker>

        <agm-marker *ngFor="let device of location.ChargeDevice; let i = index" 
                    ngShow="device.SubscriptionRequiredFlag" 
                    [latitude]="convertStringToNumber(device.ChargeDeviceLocation.Latitude)" 
                    [longitude]="convertStringToNumber(device.ChargeDeviceLocation.Longitude)"
                    (markerClick)="clickedMarker(device)">
        </agm-marker>


        <div *ngIf="showDirections" >
            <agm-map-directions  [origin]="origin" [destination]="destination" #test></agm-map-directions>
        </div>
    </agm-map>

【问题讨论】:

    标签: javascript angular google-maps


    【解决方案1】:

    我和你有同样的问题。

    我通过创建一个全局对象来解决这个问题,该对象包含方向服务和方向显示的实例化,以便以后能够将它们作为参考传递。 (See javascript pass by reference)

      public directions: any = {
        directionsService: null,
        directionsDisplay: null
      }
    

    然后,我创建了一个初始化地图的函数,并在 ngOnInit() 函数中调用它:

     constructor(private _gmapsApi: GoogleMapsAPIWrapper) { }
    
     ngOnInit() {
        this.initalizeMap(this.directions);
      }
    
      initalizeMap(directions): void {
        this._gmapsApi.getNativeMap().then(map => {
          directions.directionsService = new google.maps.DirectionsService;
          directions.directionsDisplay = new google.maps.DirectionsRenderer;
          directions.directionsDisplay.setMap(map);
          directions.directionsDisplay.addListener('directions_changed', function() {
              this.displayRoute(this.origin, this.destination, directions.directionsService, directions.directionsDisplay);
          });
    
          this.displayRoute(this.origin, this.destination, directions.directionsService, directions.directionsDisplay);
        })
      }
    

    每当方向发生变化时,我都会在方向显示中添加一个监听器来显示路由。函数 displayRoute 将通过 @Input 传递的 origin 和 destination 作为参数,并引用我保存在方向对象中的方向服务和方向显示的实例。我采取的航路点也是通过@Input。

    displayRoute(origin, destination, service, display): void {
      var myWaypoints = [];
    
      for (var i = 0; i < this.waypoints.length; i++) {
        console.log(this.waypoints[i].markerID);
        console.log(this.waypoints[i].location);
      }
    
      for (var i = 0; i < this.waypoints.length; i++) {
        myWaypoints.push({
          location: new google.maps.LatLng(this.waypoints[i].location),
          stopover: true
        })
      }
    
      service.route({
        origin: origin,
        destination: destination,
        waypoints: myWaypoints,
        travelMode: 'WALKING',
        avoidTolls: true
      }, function(response, status) {
        if (status === 'OK') {
          console.log("Route OK.");
          display.setDirections(response);
        } else {
          alert('Could not display directions due to: ' + status);
        }
      });
     }
    

    最后一个也是最重要的一个函数是calculateRoute,每当我希望它重新计算路由时,我都会从注入服务的组件(在我的例子中为Map 组件)调用它。

      calculateRoute(): void {
        this._gmapsApi.getNativeMap().then(map => {
          this.displayRoute(this.origin, this.destination, this.directions.directionsService, this.directions.directionsDisplay);
        });
      }
    

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多