【问题标题】:AGM angular Google Maps Set Zoom programmaticallyAGM 角度谷歌地图以编程方式设置缩放
【发布时间】:2019-07-13 10:39:54
【问题描述】:

我正在使用 AGM(Angular Google Maps)和 OpenLayers。

我需要以编程方式设置 AGM 的缩放,但无法弄清楚它是如何工作的。

HTML 地图...

<div id="mapWrap" class="mapWrap" style="padding: 0px; width: 100%; height: 
100%; text-align: left">

  <agm-map  
    [latitude]="lat" 
    [longitude]="lng"
    [zoom]="currZoom" 
    [mapTypeId]="mapType" 
    [mapTypeControl]="mapControls" 
    [zoomControl]="mapControls" 
    [streetViewControl]="mapControls" 
  ></agm-map>

  <div id="map" class="map" style="padding: 0px; width: 100%; height: 100%;z-index: 0; position: absolute; opacity: 0.5"></div>
</div>

组件代码

import { Component, OnInit, ViewChild } from '@angular/core';
import { AgmMap } from '@agm/core';
import { GoogleMap } from '@agm/core/services/google-maps-types';

import olMap from 'ol/Map';
import TileLayer from 'ol/layer/Tile';
import View from 'ol/View';
import OSM from 'ol/source/OSM.js';
import XYZ from 'ol/source/XYZ';
import {transform} from 'ol/proj';
import {msFormValues} from './../values/ms-form-values';

@Component({
  selector: 'ms-map',
  templateUrl: './ms-map.component.html',
  styleUrls: ['./ms-map.component.scss']
})
export class MsMapComponent implements OnInit {

// testCoord = 
transform([msFormValues.googleLng,msFormValues.googleLat],'EPSG:3857', 
'EPSG:4326');

lat: number = msFormValues.googleLat;
lng: number = msFormValues.googleLng;
currZoom: number = msFormValues.googleZoom;
mapType = 'satellite' ;
mapControls = false;

constructor() {}

ngOnInit() {
  const osmLayer = new TileLayer({
    source: new OSM()
  });

  const xyzLayer = new TileLayer({
    source: new XYZ({
      url: 'http://tile.osm.org/{z}/{x}/{y}.png'
    })
  });
  msFormValues.view = new View({
    center: [0,0],
    zoom: 0,
    projection: 'EPSG:3857',
    maxZoom: 20,
    minZoom: 5
  });

  msFormValues.googleZoom = msFormValues.view.getZoom();
  msFormValues.map = new olMap({
    target: 'map',
    layers: [
      osmLayer,
      // xyzLayer
    ],
    view: msFormValues.view
  }); 

  msFormValues.view.on('change:center',function() {
    var mapCenter = transform(msFormValues.view.getCenter(),'EPSG:3857', 'EPSG:4326');
    msFormValues.googleLat = mapCenter[1];
    msFormValues.googleLng = mapCenter[0];
  });
  msFormValues.view.on('change:resolution',function() {
    msFormValues.googleZoom = msFormValues.view.getZoom();   
  });

  }
  setMapType(mapTypeId: string) {}
}

我实际上是从 AngularJS 移植这个的 谷歌的原始 JS 然而在 Angular 6 中似乎只是将谷歌库拉到一个组件库中并不是很简单,一旦你尝试将你的组件安装到另一个应用程序中就不起作用了。

【问题讨论】:

  • 到底是什么问题?你似乎用 0 的缩放来初始化谷歌地图视图?你不能把它改成你想要的吗?或者您是在问如何编写一个改变缩放的函数?
  • 对不起,所以在我“.on('change:resolution'”的组件代码中我改变了缩放但没有任何反应......我知道我曾经能够调用“setZoom”但我不确定如何使用 AGM 来做到这一点

标签: angular angular-components angular-google-maps openlayers-5 angular-library


【解决方案1】:

未触发缩放更改检测的原因是您的currZoom 变量从未更改。我通过保持currZoom 变量与地图同步解决了这个问题。当用户更改缩放时,它将更新您的变量。然后,当您想以编程方式更改缩放比例时,就会检测到差异。

<agm-map  
       [zoom]="currZoom"
       (zoomChange)="onZoomChange($event)" <---------- Add this
></agm-map>
currZoom: number = 4       // <---- Example 4 for initial value

onZoomChange(newZoomValue) {
    this.currZoom = newZoomValue;
}

现在您可以更新currZoom 变量,agm-map 元素将检测到更改。

this.currZoom = 5;

【讨论】:

    【解决方案2】:

    只是为了补充答案,您还可以使用间隔动画缩放

    zoomIn(){
       const interValZoom = setInterval(() => {
        this.zoom = this.zoom + 1 ;
            if (this.zoom > 15) {
                clearInterval(interValZoom); 
                 // stop the zoom at your desired number
                }
        }, 100);
    }
    

    然后在你的按钮上

    <button (click)="zoomIn()"> Animate Zoom</button>
    

    【讨论】:

      【解决方案3】:

      所以根据@agm/core 文档有一个缩放@input https://angular-maps.com/api-docs/agm-core/components/agmmap#zoom

      更改此输入的值会影响地图的缩放

      在你的组件中添加这样的函数

      public setZoom(): void {
        this.zoom = 10;
      }
      

      然后将函数绑定到一个按钮上

      <button (click)="setZoom()">Set Zoom</button>
      

      根据您的需要进行调整

      【讨论】:

      • 是的,这行得通...我调整了我的测试以仅包括 AGM 地图并且它正在工作,我将发布我遇到的其他问题。谢谢
      • @jahller 当我们有标记集群时它不起作用。即使在设置缩放级别之后。它仍然放大。因为当我们单击集群时,标记集群会缩放地图。有什么解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多