How to get angle between two POI?

后端 未结 3 425
傲寒
傲寒 2020-12-19 21:49

How do I calculate the angle in degrees between the coordinates of two POIs (points of interest) on an iPhone map application?

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-19 22:40

    I'm guessing you try to calculate the degrees between the coordinates of two points of interest (POI).

    Calculating the arc of a great circle:

    +(float) greatCircleFrom:(CLLocation*)first 
                          to:(CLLocation*)second {
    
        int radius = 6371; // 6371km is the radius of the earth
        float dLat = second.coordinate.latitude-first.coordinate.latitude;
        float dLon = second.coordinate.longitude-first.coordinate.longitude;
        float a = pow(sin(dLat/2),2) + cos(first.coordinate.latitude)*cos(second.coordinate.latitude) * pow(sin(dLon/2),2);
        float c = 2 * atan2(sqrt(a),sqrt(1-a));
        float d = radius * c;
    
        return d;
    }
    

    Another option is to pretend you are on cartesian coordinates (faster but not without error on long distances):

    +(float)angleFromCoordinate:(CLLocationCoordinate2D)first 
                   toCoordinate:(CLLocationCoordinate2D)second {
    
        float deltaLongitude = second.longitude - first.longitude;
        float deltaLatitude = second.latitude - first.latitude;
        float angle = (M_PI * .5f) - atan(deltaLatitude / deltaLongitude);
    
        if (deltaLongitude > 0)      return angle;
        else if (deltaLongitude < 0) return angle + M_PI;
        else if (deltaLatitude < 0)  return M_PI;
    
        return 0.0f;
    }
    

    If you want the result in degrees instead radians, you have to apply the following conversion:

    #define RADIANS_TO_DEGREES(radians) ((radians) * 180.0 / M_PI)
    

提交回复
热议问题