2017-10-11 2 views
1

Je souhaite détecter la latitude et la longitude à chaque fois que je clique sur le bouton. J'ai essayé de faire des recherches sur de nombreux sites et blogs mais je n'ai pas trouvé de solution spécifique. J'ai aussi installé cordova-plugin-géolocalisation et utilisé comme ceci:Ionic 2 - Erreur de timeout de géolocalisation

import { Component } from '@angular/core'; 
import { IonicPage, NavController, NavParams, Platform } from 'ionic-angular'; 
import {Camera, CameraOptions} from '@ionic-native/camera'; 
import { Geolocation, Geoposition } from '@ionic-native/geolocation'; 

constructor(public navCtrl: NavController, public navParams: NavParams, private camera : Camera, 
    public geolocation: Geolocation, public platform: Platform) { 
    } 

capturePhotos() 
{ 
    let GPSoptions = {timeout: 10000, enableHighAccuracy: true, maximumAge: 3600}; 
     this.geolocation.getCurrentPosition(GPSoptions).then((position) => { 

     console.log("IN"); 

     console.log(position.coords.latitude); 
     console.log(position.coords.longitude); 

     }, (error) => 
     { 
     console.log('Error getting location', error); 
     }); 
} 

Après avoir obtenu l'erreur de délai d'attente j'ai augmenté le délai d'attente pour, mais sans succès 50000. Au-dessus de la fonction capturephoto sera appelée comme ci-dessous:

<ion-navbar hideBackButton side="left"> 
     <ion-title style="margin-left: 0px;"> 
      <div> 
       <ion-icon ios="ios-add" md="md-add" class="menuIcon" (click)="capturePhotos()"></ion-icon><span class="menuTitle">My Photos</span> 
      </div> 
     </ion-title> 
    </ion-navbar> 

Lorsque je tente de l'exécuter dans l'émulateur Android, il va chercher Lat long quand je première fois, cliquez sur l'icône ajouter, mais quand je clique sur seconde ou plus de temps, il arrête travail et jette l'erreur: PositionError {} code: 3 message: "Délai d'attente expiré"

+0

Définissez 'enableHighAccuracy: false' et vérifiez. – hrdkisback

+0

Désolé, cela ne fonctionne pas. – Aparna

+0

'laisser GPSoptions = {timeout: 10000, enableHighAccuracy: true, maximumAge: 3600};' fonctionne correctement dans mon projet. – hrdkisback

Répondre

1

Je résolu ce problème en faisant les modifications suivantes:

1) Je mis mon mode de localisation à haute précision dans mon les paramètres du téléphone.

2) Après cela j'ai changé le code de "this.geolocation" en "navigator.geolocation".

3) Il y avait un problème dans mon code avec les rappels. Lorsque je détecte un retard, j'appelle une autre fonction et je redirige vers la nouvelle page. Donc résolu ce problème de rappel et après cela, je reçois maintenant des valeurs lat lon chaque fois que je clique sur le bouton.

0

il y a cette réponse phonegap geolocation allways fail on timeout,

Votre code semble bien, cependant, pour commencer, essayez de getPosition sans options (options par défaut)

+0

Eh bien, j'ai d'abord développé mon code sans appliquer d'options, mais il ne fonctionnait pas même à la première fois, donc j'ai ajouté des options. Donc ça me donne du temps quand je clique la première fois sur l'icône. J'ai également parcouru ce lien mais aucune des solutions ne semble fonctionner pour moi. Est-ce quelque chose dont j'ai besoin pour réinitialiser les paramètres de géolocalisation ou quoi que ce soit pour récupérer le lat long à nouveau? Merci. – Aparna

0

Ce n'est pas une solution idéale (using watchPosition) mais cela fonctionne pour moi sur iOS et ça devrait marcher pour vous.

home.ts

import {Component} from '@angular/core'; 
import {Platform, NavController} from 'ionic-angular'; 
import {Geolocation, Geoposition} from '@ionic-native/geolocation'; 

import 'rxjs/add/operator/filter'; 
import {last} from "rxjs/operator/last"; 

@Component({ 
    selector: 'page-home', 
    templateUrl: 'home.html' 
}) 
export class HomePage { 
    latest: Geoposition; 
    displayed: Geoposition; 
    timestamp: number = 0; 

    constructor(private platform: Platform, public navCtrl: NavController, private geolocation: Geolocation) { 
    this.latest = { 
     coords: { 
     altitude: 0, 
     heading: 0, 
     latitude: 0, 
     longitude: 0, 
     accuracy: 0, 
     altitudeAccuracy: 0, 
     speed: 0 
     }, 
     timestamp: 0 
    }; 
    this.displayed = this.latest; 
    this.platform.ready() 
     .then(() => { 

     const subscription = this.geolocation.watchPosition({ 
      enableHighAccuracy: true, 
      maximumAge: 8000, 

     }) 
      .filter((p) => p.coords !== undefined) //Filter Out Errors 
      .subscribe(position => { 
      if (position.coords !== undefined) { 
       this.latest = position; 
      } 

      }); 

     }); 

    } 

    refreshLocation() { 
    this.displayed = this.latest 
    } 

} 

home.html

<ion-header> 
    <ion-navbar> 
    <ion-title> 
     Movement information 
    </ion-title> 
    </ion-navbar> 
</ion-header> 

<ion-content padding> 
    <button ion-button (click)="refreshLocation()" full>Update</button> 
    <ion-list> 
    <ion-item no-padding no-margin> 
     time: {{timestamp}} 
    </ion-item> 
    <ion-item no-padding no-margin> 
     lat: {{displayed.coords.latitude}} 
    </ion-item> 
    <ion-item no-padding no-margin> 
     long: {{displayed.coords.longitude}} 
    </ion-item> 
    <ion-item no-padding no-margin> 
     altitude: {{displayed.coords.altitude}} 
    </ion-item> 
    <ion-item no-padding no-margin> 
     heading: {{displayed.coords.heading}} 
    </ion-item> 
    <ion-item no-padding no-margin> 
     speed: {{displayed.coords.speed}} 
    </ion-item> 
    </ion-list> 
</ion-content> 
+0

Hey Philip merci beaucoup pour votre réponse et j'ai essayé votre code dans mon application. Il ne lance pas d'erreur de timeout maintenant mais quand je clique sur le bouton deuxième fois la valeur de latitude et longitude est 0. – Aparna

+0

J'ai remarqué que parfois cela donne des valeurs étranges au début en particulier. Je ne sais pas de quoi il s'agit. Je suppose que vous pourriez également filtrer les valeurs aberrantes. –