Moving a CLLocation by x meters

前端 未结 11 960
余生分开走
余生分开走 2020-11-30 04:54

I have a CLLocation defined, and I\'d like to move that point x meters to the east and y meters to the south. How may I achieve that?

11条回答
  •  执笔经年
    2020-11-30 05:15

    Slight adjustment to @CocoaChris answer: now a category on CLLocation, and using the built-in units.

    #import 
    
    
    @interface CLLocation (Movement)
    
    - (CLLocation *)locationByMovingDistance:(double)distanceMeters withBearing:(CLLocationDirection)bearingDegrees;
    
    @end
    
    
    @implementation CLLocation (Movement)
    
    - (CLLocation *)locationByMovingDistance:(double)distanceMeters withBearing:(CLLocationDirection)bearingDegrees
    {
        const double distanceRadians = distanceMeters / (6372797.6); // earth radius in meters
        const double bearingRadians = bearingDegrees * M_PI / 180;
    
        float lat1 = self.coordinate.latitude * M_PI / 180;
        float lon1 = self.coordinate.longitude * M_PI / 180;
    
        float lat2 = asin(sin(lat1) * cos(distanceRadians) + cos(lat1) * sin(distanceRadians) * cos(bearingRadians));
        float lon2 = lon1 + atan2(sin(bearingRadians) * sin(distanceRadians) * cos(lat1),
                                  cos(distanceRadians) - sin(lat1) * sin(lat2) );
    
        return [[CLLocation alloc] initWithLatitude:lat2 * 180 / M_PI
                                          longitude:lon2 * 180 / M_PI];
    }
    
    @end
    

提交回复
热议问题