使用指南针指向位置

Posted

技术标签:

【中文标题】使用指南针指向位置【英文标题】:Point to location using compass 【发布时间】:2011-07-02 20:18:37 【问题描述】:

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

我已经计算了从用户位置到注释位置的距离,并且我得到了 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 是旋转的?

【问题讨论】:

【参考方案1】:

我有时间再玩一次。

这样就可以了:

- (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);

【讨论】:

这太棒了..我会在我的项目中尝试它,我希望它能正常工作..你拯救了我的一天:) 你能把这个完整的课程发给我吗:) 是的,这些信息真的很有帮助。你能回答我与此相关的问题吗? - ***.com/questions/7173925/… @lesk 不使用代码来计算用户角度,而是使用问题代码。在问题结果 = 度和对我来说工作正常 我认为还值得记住的是,包含箭头的 UIImage 必须是垂直箭头,即当您将箭头添加到 xib 时,箭头图像直接指向顶部屏幕

以上是关于使用指南针指向位置的主要内容,如果未能解决你的问题,请参考以下文章

使用指南针指向实际坐标位置,而不仅仅是北

创建指向指定位置方向的自定义指南针箭头

Android自定义指南针指向自定义位置[重复]

如何检查指南针航向是不是指向特定位置?

iPhone 指南针 GPS 方向

如何根据我当前的位置使指南针指向我的特定纬度经度位置? [复制]