指向使用指南针的位置

问题描述:

我正在尝试开发一个应用程序的指南针,它在地图上有一组注释。我希望能够选择注释,然后让指南针将用户指向所选位置。指向使用指南针的位置

我已经计算了从用户位置到注释位置的degress,并且我拥有了iPhone的磁性标题和真正的标题。我也知道如何旋转图像。 但我无法弄清楚下一步是什么。

用户的位置,并标注位置之间的度计算如下:

// get user location 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation]; 
    [locationManager startUpdatingHeading]; 
    CLLocation *location = [locationManager location]; 
    CLLocationCoordinate2D coordinate = [location coordinate]; 

    float x1 = coordinate.latitude; 
    float y1 = coordinate.longitude; 
    float x2 = [annLatitude floatValue]; 
    float y2 = [annLongitude floatValue]; 

    float dx = (x2 - x1); 
    float dy = (y2 - y1); 

    if (dx == 0) { 
     if (dy > 0) { 
      result = 90; 
     } 
     else { 
      result = 270; 
     } 
    } 
    else { 
     result = (atan(dy/dx)) * 180/M_PI; 
    } 

    if (dx < 0) { 
     result = result + 180; 
    } 

    if (result < 0) { 
     result = result + 360; 
    } 

真与磁航向检索这样的:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { 
    arrow.transform = CGAffineTransformMakeRotation(newHeading.magneticHeading); 

    // NSLog(@"magnetic heading: %f", newHeading.magneticHeading); 
    // NSLog(@"true heading: %f", newHeading.trueHeading); 
} 

谁能告诉我是什么现在应该做,使箭头指向的位置 - 即使iPhone旋转?

我有时间再玩一次。

这将做到这一点:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation]; 
    [locationManager startUpdatingHeading]; 

    CLLocation *location = [locationManager location]; 
    CLLocationCoordinate2D user = [location coordinate]; 

    [self calculateUserAngle:user]; 
} 

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    CLLocationCoordinate2D here = newLocation.coordinate; 

    [self calculateUserAngle:here]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { 
    compass.transform = CGAffineTransformMakeRotation(newHeading.magneticHeading * M_PI/180); 
    needle.transform = CGAffineTransformMakeRotation((degrees - newHeading.magneticHeading) * M_PI/180); 
} 

-(void) calculateUserAngle:(CLLocationCoordinate2D)user { 
    locLat = [[targetLocationDictionary objectForKey:@"latitude"] floatValue]; 
    locLon = [[targetLocationDictionary objectForKey:@"longitude"] floatValue]; 

    NSLog(@"%f ; %f", locLat, locLon); 

    float pLat; 
    float pLon; 

    if(locLat > user.latitude && locLon > user.longitude) { 
     // north east 

     pLat = user.latitude; 
     pLon = locLon; 

     degrees = 0; 
    } 
    else if(locLat > user.latitude && locLon < user.longitude) { 
     // south east 

     pLat = locLat; 
     pLon = user.longitude; 

     degrees = 45; 
    } 
    else if(locLat < user.latitude && locLon < user.longitude) { 
     // south west 

     pLat = locLat; 
     pLon = user.latitude; 

     degrees = 180; 
    } 
    else if(locLat < user.latitude && locLon > user.longitude) { 
     // north west 

     pLat = locLat; 
     pLon = user.longitude; 

     degrees = 225; 
    } 

    // Vector QP (from user to point) 
    float vQPlat = pLat - user.latitude; 
    float vQPlon = pLon - user.longitude; 

    // Vector QL (from user to location) 
    float vQLlat = locLat - user.latitude; 
    float vQLlon = locLon - user.longitude; 

    // degrees between QP and QL 
    float cosDegrees = (vQPlat * vQLlat + vQPlon * vQLlon)/sqrt((vQPlat*vQPlat + vQPlon*vQPlon) * (vQLlat*vQLlat + vQLlon*vQLlon)); 
    degrees = degrees + acos(cosDegrees); 
} 
+0

这是伟大的..我要把它尝试我的项目,我希望它工作得很好..你救了我的一天:) – 2011-05-06 18:24:12

+0

你能送我完整的类为此:) – 2011-05-07 12:16:34

+0

是的,这些信息真的很有帮助。你能回答我的问题吗? - http://*.com/questions/7173925/how-to-rotate-a-direction-arrow-using-clheading – Dhawal 2011-08-25 05:00:46