Ran*_*ani 7 iphone performance distance objective-c mapkit
我有一个地图应用程序.当一个人从当前位置旅行到特定位置时,我想计算该人所覆盖的距离,该人的当前速度,该人的平均速度.
使用以下方法获得英里或公里的距离.你必须在头文件中声明计时器来合成它.
//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
Run Code Online (Sandbox Code Playgroud)
我没有在设备上测试过这个,但从逻辑上说它应该可行.