【问题标题】:Googlemaps native get marker position after dragGooglemaps native在拖动后获取标记位置
【发布时间】:2018-06-01 17:09:31
【问题描述】:

在设置“on marker drag end”监听器给出的新坐标时,我遇到了一个奇怪的问题。当尝试设置我的变量 this.lat 和 this.lng 时,甚至尝试在事件侦听器中控制台注销它们时,我收到以下错误:

ERROR 
Error {rejection: TypeError, promise: t, zone: r, task: e, stack: (...)…}
message: "Uncaught (in promise): TypeError: Cannot set property 'lat' of undefined↵TypeError: Cannot set property 'lat' of undefined↵    at file:///android_asset/www/build/28.js:180:27↵    at t.invoke (file:///android_asset/www/build/polyfills.js:3:14976)↵    at Object.zone._inner.zone._inner.fork.onInvoke (file:///android_asset/www/build/vendor.js:4248:33)↵    at t.invoke (file:///android_asset/www/build/polyfills.js:3:14916)↵    at r.run (file:///android_asset/www/build/polyfills.js:3:10143)↵    at file:///android_asset/www/build/polyfills.js:3:20242↵    at t.invokeTask (file:///android_asset/www/build/polyfills.js:3:15660)↵    at Object.zone._inner.zone._inner.fork.onInvokeTask (file:///android_asset/www/build/vendor.js:4239:33)↵    at t.invokeTask (file:///android_asset/www/build/polyfills.js:3:15581)↵    at r.runTask (file:///android_asset/www/build/polyfills.js:3:10834)"
promise: t
rejection: TypeError
stack: (...)
get stack: function () { [native code] }
set stack: function () { [native code] }
task: e
zone: r
__proto__: d

这就像两个变量不可访问或我不知道。现在尝试调试它 3 个小时,但没有任何运气。也许我只是没有注意到什么,所以任何帮助都会非常感激。有问题的函数是 updatePosition 其他一切都在工作。

这是我的代码:

import { Component } from '@angular/core';
import {IonicPage, NavController, NavParams, Platform} from 'ionic-angular';
import {HelperProvider} from "../../providers/helper/helper";
import {
  GoogleMaps,
  GoogleMap,
  GoogleMapsEvent,
  GoogleMapOptions,
  Marker, CameraPosition, ILatLng
} from '@ionic-native/google-maps';
import {Geolocation, GeolocationOptions} from "@ionic-native/geolocation";

@IonicPage()
@Component({
  selector: 'page-statement',
  templateUrl: 'statement.html',
})
export class StatementPage {

  map: GoogleMap;
  lat:any;
  lng:any;
  settlementLat:any;
  settlementLng:any;
  geoLocationOption: GeolocationOptions;
  showMap: boolean = false;

  constructor(
    public navCtrl: NavController,
    public platform: Platform,
    private geoLocation: Geolocation,
    private helper: HelperProvider,
    public navParams: NavParams) {

    const data = JSON.parse(localStorage.getItem('deviceData'));

    if(data.settlementLat && data.settlementLng){
      this.settlementLat = data.settlementLat;
      this.settlementLng = data.settlementLng;
    }

  }

  openMap(){
    this.showMap = true;
    setTimeout(()=> {this.loadMap()},500)
  }

  loadMap() {
    this.map = GoogleMaps.create('statementMap', {
      'camera': {
        'target': {
          "lat": parseFloat(this.settlementLat),
          "lng": parseFloat(this.settlementLng)
        },
        'zoom': 18
      }
    });

    this.map.one(GoogleMapsEvent.MAP_READY).then(() => {

      this.geoLocationOption = {
        maximumAge: 0,
        timeout : 15000,
        enableHighAccuracy: true
      };

      this.helper.presentLoading('Searching for GPS position...');
      this.getPosition();
    });
  }

  getPosition(){
    this.geoLocation.getCurrentPosition(this.geoLocationOption).then((resp) => {
      this.helper.closeLoading();
      this.lat = resp.coords.latitude;
      this.lng = resp.coords.longitude;

      let position: CameraPosition<ILatLng> = {
        target: {
          lat: this.lat,
          lng: this.lng
        },
        zoom: 18
      };

      this.map.moveCamera(position);

      this.map.addMarker({
        icon: 'blue',
        animation: 'DROP',
        draggable: true,
        position: {
          lat: this.lat,
          lng: this.lng
        }
      }).then(this.updatePosition)

    }).catch((error) => {
      this.helper.closeLoading();
      this.map.destroy();
      this.helper.presentToast('Please turn on your gps...');
      this.showMap = false;
    });
  }

  updatePosition(marker: Marker){
    marker.one(GoogleMapsEvent.MARKER_DRAG_END).then(() => {
      this.lat = marker.getPosition().lat;
      this.lng = marker.getPosition().lng;

      console.log(this.lat);
      console.log(this.lng);
    });
  }

}

【问题讨论】:

    标签: angular google-maps ionic3 ionic-native


    【解决方案1】:

    尽量避免对该运算符的无效使用,例如

        getPosition(){
          this.geoLocation.getCurrentPosition(this.geoLocationOption).then((resp) => {
            this.helper.closeLoading();
            var my_lat = resp.coords.latitude;
            var my_lng = resp.coords.longitude;
    
            let position: CameraPosition<ILatLng> = {
              target: {
                lat: this.lat,
                lng: this.lng
              },
              zoom: 18
            };
    
            this.map.moveCamera(position);
    
            this.map.addMarker({
              icon: 'blue',
              animation: 'DROP',
              draggable: true,
              position: {
                lat: my_lat,
                lng: my_lng
              }
            }).then(this.updatePosition)
    
          }).catch((error) => {
            this.helper.closeLoading();
            this.map.destroy();
            this.helper.presentToast('Please turn on your gps...');
            this.showMap = false;
          });
        }
    

    代码建议了 lat 和 lng 的解决方案,可能是您在其他人不当使用此代码时遇到其他问题

    【讨论】:

    • 仍然无法访问我的 this.lat 和 this.lng,但我删除了我的 this.updatePosition 并制作了一个粗箭头函数而不是那个,突然这些变量又可以访问了。所以问题解决了,感谢您的努力:)
    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2019-07-26
    • 2018-09-25
    相关资源
    最近更新 更多