如何将地图设置为以标记为中心?- 角度谷歌地图

Com*_* v2 4 geolocation marker angular-google-maps angular

地理编码后,我无法将我的 Google 地图放在标记上。

我有两个标记:初始标记(一个居中,不改变),另一个根据地理编码而变化,地理编码后,每次都以中心为中心。

我的代码:TS

zoom = 10;

addressData: FormGroup;
submitted = false;
success = false;

lat: number;
lng: number;

userLat: number;
userLng: number;

currentCenter = { lat: null, lng: null };

private geoCoder: google.maps.Geocoder;

@ViewChild('googleMap') googleMap: AgmMap;

constructor(private maps: MapsAPILoader, private bulider: FormBuilder) { }

ngOnInit() {
    this.addressData = this.bulider.group({
        address: ["", Validators.required],
    });

    this.maps.load().then(() => {
        this.geoCoder = new google.maps.Geocoder();
    });
}

getAddress() {

    this.submitted = true;

    if (this.addressData.invalid) {
        return;
    }

    this.success = true;

    this.googleMap.mapReady.subscribe(map => {

        // Need to use two parameters in order to use Geocoder
        this.geoCoder.geocode(this.addressData.controls['address'].value, (results, status) => {
        if (status === google.maps.GeocoderStatus.OK) {
            this.userLat = results[0].geometry.location.lat();
            this.userLng = results[0].geometry.location.lng();
        } else {
            alert('Geocode was not successful for the following reason: ' + status);
        }

    }).then(place => {
        this.currentCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng() };
    }).catch(err => {
        console.log("Error: " + err);
    });

    this.submitted = false;
}
Run Code Online (Sandbox Code Playgroud)

HTML

<!-- Google maps, the starting latitude & longitude -->
<agm-map [latitude]="currentCenter.lat" [longitude]="currentCenter.lng" [zoom]="zoom" [mapTypeControl]='true'
#googleMap>
    <!-- Static marker -->
    <agm-marker [latitude]="defaultCenter.lat" [longitude]="defaultCenter.lng"></agm-marker>

    <!-- User geolocation marker, changes -->
    <agm-marker [latitude]="currentCenter.userLat" [longitude]="currentCenter.userLng"></agm-marker>
</agm-map>
Run Code Online (Sandbox Code Playgroud)

预期

地理编码后,地图每次都应以给定地址的标记为中心。

实际

地理编码器会找到地址,但不会根据地址将地图放在放置的标记上。

更新

我不能使用 Vadim 的代码,因为编译器告诉我我需要两个参数作为Geocode,但 Vadim 的代码只有一个。我无法使用此代码。另外,如果我添加第二个参数,它会说不then存在。

this.googleMap.mapReady.subscribe(map => {
    // This line needs two parameters not one      

    this.geoCoder.geocode(this.addressData.controls['address'].value)
    .then(place => {
        this.currentCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng() };
    }).catch(err => {
        console.log("Error: " + err);
    });
});
Run Code Online (Sandbox Code Playgroud)

Vad*_*hev 5

无需triggerResize借助Google Maps API 或调用 Map 组件方法,更新地图中心可以考虑以下方法:

a)加载地图后将地图中心设置为默认

<agm-map
  [latitude]="currentCenter.lat"
  [longitude]="currentCenter.lng"
  [zoom]="zoom"
  [mapTypeControl]="true"
>
  <!-- Static marker -->
  <agm-marker
    [latitude]="defaultCenter.lat"
    [longitude]="defaultCenter.lng"
  ></agm-marker>

  <!-- User geolocation marker, changes -->
  <agm-marker
    [latitude]="currentCenter.lat"
    [longitude]="currentCenter.lng"
  ></agm-marker>
</agm-map>
Run Code Online (Sandbox Code Playgroud)

为此,引入了两个属性:

  • currentCenter - 当前地图中心
  • defaultCenter - 默认(原始)地图中心

b) 一旦地址被解析,像这样更新地图中心:

ngOnInit() {
    this.agmMap.mapReady.subscribe(map => {
      this.geocode("New York, USA").then(place => {
        this.currentCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng()};
      })
      .catch(err => {
        console.log(err);
      });
    });
 }
Run Code Online (Sandbox Code Playgroud)

例子

declare var google: any;

import { Component, ViewChild, OnInit} from "@angular/core";
import { AgmMap } from "@agm/core";

@Component({
  selector: "app-map",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit {
  constructor() {}

  defaultCenter = {lat: 55.5815245, lng: 36.8251383};
  currentCenter = Object.assign({}, this.defaultCenter);
  zoom = 3;

  @ViewChild(AgmMap) agmMap;

  ngOnInit() {
    this.agmMap.mapReady.subscribe(map => {
      this.geocode("New York, USA").then(place => {
        this.currentCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng()};
      })
      .catch(err => {
        console.log(err);
      });
    });
  }

  geocode(address: string): Promise<any> {
    const geocoder = new google.maps.Geocoder();
    return new Promise((resolve, reject) => {
      geocoder.geocode(
        {
          address: address
        },
        (results, status) => {
          if (status === google.maps.GeocoderStatus.OK) {
            resolve(results[0]);
          } else {
            reject(new Error(status));
          }
        }
      );
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

更新

从输入元素获取地址:

<input [(ngModel)]="addressText">
<button (click)="findPlace()">Find a place</button>


findPlace() {
    this.geocode(this.addressText).then(place => {
      this.currentCenter = { lat: place.geometry.location.lat(), lng: place.geometry.location.lng()};
    })
    .catch(err => {
      console.log(err);
    });
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*urt 0

根据文档,该triggerResize()方法

使用当前的 lat/lng 值或 fitBounds 值调用以使地图居中

https://angular-maps.com/api-docs/agm-core/components/agmmap#triggerResize

但是,您不会更新地图的经度/纬度,因为您将该属性绑定到initLatinitLng<agm-map [latitude]="initLat" [longitude]="initLng" [zoom]="zoom">

您需要更新地图坐标才能重新定位到triggerResize()。请小心将模板绑定到类中的正确属性。在您显示的 ts 片段中,userLatuserLng不存在,因此您的地理定位标记也会出现问题。

更新的模板:

<agm-map [latitude]="lat" [longitude]="lng" [zoom]="zoom" [mapTypeControl]='true'>
<!-- Static marker -->
<agm-marker [latitude]="initLat" [longitude]="initLng"></agm-marker>

<!-- User geolocation marker, changes -->
<agm-marker [latitude]="lat" [longitude]="lng"></agm-marker>
</agm-map>
Run Code Online (Sandbox Code Playgroud)

您可能需要在 ts 文件中初始化lat和为某个值。lng