Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将DrawingManager与@angular/google地图一起使用_Angular_Google Maps_Google Maps Api 3_Angular Material - Fatal编程技术网

将DrawingManager与@angular/google地图一起使用

将DrawingManager与@angular/google地图一起使用,angular,google-maps,google-maps-api-3,angular-material,Angular,Google Maps,Google Maps Api 3,Angular Material,我一直在尝试将DrawingManager与mapsapi的官方角度组件包装一起使用,但它没有发挥应有的作用。如果有人能做到这一点,我会很感激能找到解决办法。这是我尝试过的解决方案的代码片段和stackblitz链接,但没有成功。(在stackblitz中,它没有识别google名称空间,但如果您下载它,在本地机器上就可以了) Github问题链接: 编辑1: 事实证明,问题在于地图没有完全加载,并且在此之前设置的DrawingManager没有生效。这个包装器模块中没有加载回调,所以我能找

我一直在尝试将
DrawingManager
与mapsapi的官方角度组件包装一起使用,但它没有发挥应有的作用。如果有人能做到这一点,我会很感激能找到解决办法。这是我尝试过的解决方案的代码片段和stackblitz链接,但没有成功。(在stackblitz中,它没有识别google名称空间,但如果您下载它,在本地机器上就可以了)

Github问题链接:

编辑1:
事实证明,问题在于地图没有完全加载,并且在此之前设置的
DrawingManager
没有生效。这个包装器模块中没有加载回调,所以我能找到的最安全的方法是click方法。用户需要单击一次,以便启用
DrawingManager
。我认为应该有一个更好的解决方案。

首先,您需要添加一个Google API密钥来使用所描述的maps API

对于角度,建议使用组件。你可以找到一个有效的Stackblitz


如果您想在没有agm的情况下工作,您必须实现自己的服务来加载脚本,就像在中完成一样。

我遇到了以下讨论:

Maps组件的主要贡献者表示,他不打算添加加载回调或任何与底层MapAPI相关的内容,所以我采用了另一种黑客方法来了解map是否加载到组件中

组件。ts:

mapLoaded = false;
idleMap(event: any)  {
    if(this.mapLoaded)
      return;
    this.mapLoaded = true;
    this.drawingManager = new google.maps.drawing.DrawingManager({
      drawingMode: google.maps.drawing.OverlayType.POLYGON,
      drawingControl: true,
      map:this.map._googleMap,
      drawingControlOptions: {
        position: google.maps.ControlPosition.TOP_CENTER,
        drawingModes: [google.maps.drawing.OverlayType.POLYGON]
      }
    });
    google.maps.event.addListener(this.drawingManager, 'overlaycomplete', (event) => {
      if (event.type === google.maps.drawing.OverlayType.POLYGON) {
        let ar = event.overlay.getPath().getArray();
        ar.push(ar[0]);
        this.model.location.push(ar);
      }
    });
  }
<google-map
    (tilesloaded)="idleMap($event)">
  </google-map>
html:

mapLoaded = false;
idleMap(event: any)  {
    if(this.mapLoaded)
      return;
    this.mapLoaded = true;
    this.drawingManager = new google.maps.drawing.DrawingManager({
      drawingMode: google.maps.drawing.OverlayType.POLYGON,
      drawingControl: true,
      map:this.map._googleMap,
      drawingControlOptions: {
        position: google.maps.ControlPosition.TOP_CENTER,
        drawingModes: [google.maps.drawing.OverlayType.POLYGON]
      }
    });
    google.maps.event.addListener(this.drawingManager, 'overlaycomplete', (event) => {
      if (event.type === google.maps.drawing.OverlayType.POLYGON) {
        let ar = event.overlay.getPath().getArray();
        ar.push(ar[0]);
        this.model.location.push(ar);
      }
    });
  }
<google-map
    (tilesloaded)="idleMap($event)">
  </google-map>

组件可用后,使用
@ViewChild
设置器创建DrawingManager:

home.component.html:

<div *ngIf="apiLoaded | async">
    <google-map [options]="options"></google-map>
</div>

home.component.ts:

export class HomeComponent implements OnInit {

  @ViewChild(GoogleMap, { static: false }) set map(m: GoogleMap) {
    if (m) {
      this.initDrawingManager(m);
    }
  }

  apiLoaded: Observable<boolean>;
  drawingManager: any;

  options: google.maps.MapOptions = {
    zoom: 18,
    mapTypeId: 'satellite',
    disableDefaultUI: true
  };

  constructor(httpClient: HttpClient) {
    this.apiLoaded = httpClient.jsonp('https://maps.googleapis.com/maps/api/js?key=<API_KEY>&libraries=drawing', 'callback')
      .pipe(
        map(() => true),
        catchError(() => of(false)),
      );
  }

  initDrawingManager(map: GoogleMap) {
    const drawingOptions = {
      drawingMode: google.maps.drawing.OverlayType.POLYGON,
      drawingControl: true,
      drawingControlOptions: {
        position: google.maps.ControlPosition.TOP_CENTER,
        drawingModes: [
          google.maps.drawing.OverlayType.POLYGON,
        ],
      },
      polygonOptions: {
        strokeColor: '#00ff00',
      },
    };
    this.drawingManager = new google.maps.drawing.DrawingManager(drawingOptions);
    this.drawingManager.setMap(map.googleMap);
  }
导出类HomeComponent实现OnInit{
@ViewChild(GoogleMap,{static:false})集合映射(m:GoogleMap){
如果(m){
这是一名初始绘图经理(m);
}
}
可观察的:可观察的;
绘图经理:任何;
选项:google.maps.MapOptions={
缩放:18,
mapTypeId:'卫星',
disableDefaultUI:true
};
构造函数(httpClient:httpClient){
this.apiload=httpClient.jsonp('https://maps.googleapis.com/maps/api/js?key=&libraries=drawing“,”回调“)
.烟斗(
映射(()=>true),
catchError(()=>of(false)),
);
}
initDrawingManager(地图:谷歌地图){
常量绘图选项={
drawingMode:google.maps.drawing.OverlyType.POLYGON,
drawingControl:对,
drawingControlOptions:{
位置:google.maps.ControlPosition.TOP_CENTER,
绘图模式:[
google.maps.drawing.OverlyType.POLYGON,
],
},
多克隆选择:{
strokeColor:“#00ff00”,
},
};
this.drawingManager=新的google.maps.drawing.drawingManager(drawingOptions);
this.drawingManager.setMap(map.googleMap);
}

感谢您的回答,我已经从stackblitz中故意删除了api密钥,因为我无法公开不受限制的api密钥,而且它可以在开发模式下工作。手动加载是一个选项,但并不完全是我想要的。我的观点是使用官方Google Maps组件的可能性,因为它可能比l更干净手动和我认为使用官方的一个更好的选择比AGM。如果没有解决方案,我会去与AGM,感谢Np,如果你喜欢看这里