Не получается сразу получить координаты геолокации в openlayers 5

Я реализую функцию отслеживания геолокации/позиции с помощью openlayers5 и angular 6. Несмотря на то, что я не получаю никаких ошибок, и это, кажется, работает нормально, я не сразу получаю координаты. Вот мой код, связанный с геолокацией.

ngOnInit() {
//initialize everything in the ngOnInit
    //set it
    this.geolocation = new Geolocation({      
      trackingOptions: {
        enableHighAccuracy: true
      },
      projection: 'EPSG:3857'
    });

    //handle errors
    this.geolocation.on('error', (error) => {
      this.geolocationerror=true;
      this.geolocationmsg = error;
    });

    //accuracy
    this.accuracyFeature = new Feature(); 
    this.geolocation.on('change:accuracyGeometry', ()=> {
      this.accuracyFeature.setGeometry(this.geolocation.getAccuracyGeometry());
    });

    //position point
    this.positionFeature = new Feature();
    this.positionFeature.setStyle(new Style({
      image: new CircleStyle({
        radius: 6,
        fill: new Fill({
          color: '#3399CC'
        }),
        stroke: new Stroke({
          color: '#fff',
          width: 2
        })
      })
    }));

    //track position
    this.geolocation.on('change:position', ()=> {
      let coordinates = this.geolocation.getPosition();
      this.positionFeature.setGeometry(coordinates ?
        new Point(coordinates) : null);
    });

    //on smaller screens toggle the geolocation on automatically
    if(window.innerWidth < 600){
      this.isChecked = true;
    }    

    //geolocation has its own vector layer
    this.geolocsource = new VectorSource({});
    this.geoloclayer = new VectorLayer({
      source: this.geolocsource,
      title:'location'
    });

  }//ngOnInit closes here


  //toggle geolocation on/off
  toggleGeolocation(checked){
    //erase any previous errors    
    this.geolocationmsg='';
    this.geolocationerror=false;
    ////toggled on
    if(checked){
      this.geolocation.setTracking(checked); //set on
      this.geolocsource.addFeatures([this.accuracyFeature, this.positionFeature]) ;
      this.geolocOn = true; // to show info in html     
      let center = this.geolocation.getPosition();
      //zoom there
      if (center){
        this.olmap.getView().animate({
          center: center,
          duration: 2000,
          zoom:16
        });        
      }
      //show the geolocation coords in html all the time
      this.geolocLiveCoords = this.geolocation.getPosition();
    }
    else{ //geolocation off
      this.geolocation.setTracking(checked);      
      this.geolocOn = false;
      this.geolocsource.clear();
      this.geolocLiveCoords='';
    }    
  }

и это часть HTML

<label for="track">track position<input id="trackpos" type="checkbox" [(ngModel)]="isChecked" (change)="toggleGeolocation(isChecked)"/></label>
<div  *ngIf='geolocationerror'>{{geolocationmsg}}</div>
<div  *ngIf='geolocOn'>{{geolocLiveCoords}}</div>

Флажок автоматически устанавливается для небольших экранов.

В любом случае, несмотря на то, что я не получаю ошибок, мне приходится несколько раз вручную устанавливать-снимать флажок, чтобы увидеть координаты геолокации и чтобы весь код работал. Он не работает при первом включении, он не получает координаты, поэтому я выключаю его и снова включаю. После этого он работает нормально, как и должен.

В чем проблема? Как я могу это исправить? Пожалуйста посоветуй.

Спасибо


person codebot    schedule 05.08.2018    source источник


Ответы (1)


Вы включаете отслеживание только тогда, когда вызываете toggleGeolocation с true, что на данном этапе происходит только тогда, когда вы устанавливаете флажок. Если вы хотите, чтобы он запустился сразу, вы должны вызвать его в конце вашего метода ngOnInit:

this.toggleGeolocation(this.isChecked);
person Simon K    schedule 05.08.2018
comment
Это хорошая идея, но даже в этом случае мне приходится пару раз вручную ставить-снимать галочку, чтобы увидеть координаты геолокации и чтобы весь код работал. Вот в чем проблема: в любом случае мне приходится пару раз переключаться вручную, чтобы геолокация работала. Как будто не работает сразу или не имеет координат при первом включении. Спасибо - person codebot; 06.08.2018
comment
Привет еще раз. Я знаю, что вызывает ошибку. Геолокация занимает некоторое время, чтобы получить позицию, как это обычно бывает. За это короткое время часть if(center)this.olmap.getView().animate({ функции toggleGeolocation оказывается ложной, не входит в блок кода и никогда не приближается к этой точке. Через какое-то время есть точка, но из-за этого if карта там никогда не масштабируется. Теперь я не знаю, как это исправить, потому что ни один из addFeatures или getPosition не имеет обратного вызова, который я могу безопасно использовать. Любая другая идея о том, когда увеличивать масштаб после того, как геолокация действительно имеет смысл? Спасибо - person codebot; 06.08.2018
comment
Я просмотрел их документацию и не смог найти способ получить от нее обратный вызов. Пробовали ли вы посмотреть, срабатывает ли после вызова getPosition общий geolocation.on('change', (event) => { ... })? Или, может быть, вам нужно подождать, пока он не сработает в первый раз, прежде чем вы сможете использовать getPosition? Если они не используют это событие, то единственное, что я вижу, это использование интервального таймера для проверки и ожидания результата. - person Simon K; 07.08.2018
comment
Поскольку эта проблема изменила контекст, я задал новый, более конкретный вопрос. Я также включаю новое решение, которое я пробовал (и потерпел неудачу). Вы можете проверить это здесь, если хотите. Спасибо за ваше время. - person codebot; 07.08.2018