2011-05-13 1 views
7

je suis ayant une application de carte.quand une personne se déplace de l'emplacement actuel à un endroit particulier je veux calculer la distance couverte par la personne, la vitesse actuelle de la personne, la vitesse moyenne de la personne .peut-on m'aider à résoudre ce problème.please me fournir tout sloution pour résoudre ce problème.Mercicomment calculer la vitesse actuelle et la vitesse moyenne de l'utilisateur voyageant de l'emplacement actuel à loaction particulière dans la carte dans l'iphone

Répondre

6

Améliorez votre taux d'acceptation. Utilisez les méthodes suivantes pour obtenir la distance en miles ou en kilomètres. Vous devez déclarer le minuteur dans votre fichier d'en-tête pour le synthétiser.

//SpeedViewController.h 
#import <UIKit/UIKit.h> 
#import <CoreLocation/CoreLocation.h> 
#import <MobileCoreServices/UTCoreTypes.h> 

@interface SpeedViewController : UIViewController <CLLocationManagerDelegate,UINavigationControllerDelegate> 
{ 
    CLLocationManager *locManager; 
    CLLocationSpeed speed; 
    NSTimer *timer; 

    CLLocationSpeed currentSpeed; 
    float fltDistanceTravelled; 
} 

@property (nonatomic,retain) NSTimer *timer; 

-(float)getDistanceInKm:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; 
-(float)getDistanceInMiles:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; 

@end 

//SpeedViewController.h 
#import "SpeedViewController.h" 
#define kRequiredAccuracy 500.0 //meters 
#define kMaxAge 10.0 //seconds 
#define M_PI 3.14159265358979323846264338327950288 /* pi */ 


@implementation SpeedViewController 

@synthesize timer; 
- (void)startReadingLocation { 
    [locManager startUpdatingLocation]; 
} 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CLLocationManager *locationManager=[[CLLocationManager alloc] init]; 
    locationManager.delegate=self; 
    locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation; 
    [locationManager startUpdatingLocation]; 
} 
- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc. that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"new->%d old->%d",(newLocation==NULL),(oldLocation==NULL)); 

    if(newLocation && oldLocation) 
    { 
     fltDistanceTravelled +=[self getDistanceInKm:newLocation fromLocation:oldLocation]; 
    } 
} 

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    fltDistanceTravelled=0; 
    [self startReadingLocation]; 
} 


-(float)getDistanceInKm:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    float lat1,lon1,lat2,lon2; 

    lat1 = newLocation.coordinate.latitude * M_PI/180; 
    lon1 = newLocation.coordinate.longitude * M_PI/180; 

    lat2 = oldLocation.coordinate.latitude * M_PI/180; 
    lon2 = oldLocation.coordinate.longitude * M_PI/180; 

    float R = 6371; // km 
    float dLat = lat2-lat1; 
    float dLon = lon2-lon1; 

    float a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2); 
    float c = 2 * atan2(sqrt(a), sqrt(1-a)); 
    float d = R * c; 

    NSLog(@"Kms-->%f",d); 

    return d; 
} 

-(float)getDistanceInMiles:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    float lat1,lon1,lat2,lon2; 

    lat1 = newLocation.coordinate.latitude * M_PI/180; 
    lon1 = newLocation.coordinate.longitude * M_PI/180; 

    lat2 = oldLocation.coordinate.latitude * M_PI/180; 
    lon2 = oldLocation.coordinate.longitude * M_PI/180; 

    float R = 3963; // km 
    float dLat = lat2-lat1; 
    float dLon = lon2-lon1; 

    float a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2); 
    float c = 2 * atan2(sqrt(a), sqrt(1-a)); 
    float d = R * c; 

    NSLog(@"Miles-->%f",d); 

    return d; 
} 

@end 

Si vous avez d'autres questions, n'hésitez pas à laisser un commentaire. Je n'ai pas testé cela sur l'appareil mais, logiquement, cela devrait fonctionner.

Espérons que ça aide.

+0

Je connais la méthode startUpdatingLocation .is startReadingLocation et startUpdatingLocation même – Rani

+0

J'ai recherché la méthode startReadingLocation dans la documentation du développeur mais elle ne contient que stopupdatinglocation et startupdatinglocation. la méthode readlocation est une méthode standard ou définie par l'utilisateur – Rani

+0

@Rani I Apologize, juste oublié de mettre cette méthode dans ce code. Mise à jour le code. –

2

Afin de déterminer toute vitesse, vous aurez envie de comprendre:

Distance: Prenez vos deux dernières coordonnées géographiques des lectures (et le temps chacun a été enregistré) pour calculer la distance entre les

Pour ce faire, vous pouvez lire sur la théorie here, ou vous pouvez consulter le code here.

Vitesse: En utilisant la distance entre la dernière lecture des coordonnées GPS et la précédente, calculer la vitesse par la formule vitesse = distance/durée. Ainsi, la distance que vous avez trouvée entre les deux coordonnées géographiques est divisée par la durée en secondes ou minutes ou peu importe. Ensuite, votre réponse sera la vitesse est x miles ou kilomètres par quoi que ce soit.

Questions connexes