问题
I can't get this algorithm right. I'm trying to make a compass that points at a certain location instead of just pointing to, let's say, north. Something is wrong. I've spent a lot of time trying to figure this out, but i just can't find it. Any ideas?
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
double distanceEast = (location.longitude > 0 && otherLocation.longitude < 0) ? 180 - location.longitude + otherLocation.longitude - -180: otherLocation.longitude - location.longitude;
if (distanceEast < 0) {
distanceEast += 360;
}
double distanceWest = (location.longitude < 0 && otherLocation.longitude > 0) ? -180 - location.longitude - 180 - otherLocation.longitude : location.longitude - otherLocation.longitude;
if (distanceWest < 0) {
distanceWest += 360;
}
float latitudinalDifference = (otherLocation.latitude - location.latitude);
float longitudinalDifference = fmin(distanceEast,distanceWest);
float arcTan = atan(longitudinalDifference / latitudinalDifference);
float oldRadian = (-manager.heading.trueHeading *M_PI /180.0f)+arcTan+M_PI;
float newRadian = (-newHeading.trueHeading *M_PI /180.0f)+arcTan+M_PI;
CABasicAnimation *animation;
animation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.fromValue = [NSNumber numberWithFloat:oldRadian];
animation.toValue = [NSNumber numberWithFloat:newRadian];
animation.duration = 0.5f;
directionsArrow.layer.anchorPoint = CGPointMake(0.5, 0.5);
[directionsArrow.layer addAnimation:animation forKey:@"rotationCompass"];
directionsArrow.transform = CGAffineTransformMakeRotation(newRadian);
}
回答1:
double lon = location.longitude - otherLocation.longitude;
double y = sin(lon) * cos(otherLocation.latitude);
double x = cos(location.latitude) * sin(otherLocation.latitude) - sin(location.latitude) * cos(otherLocation.latitude) * cos(lon);
double angle = atan2(y, x);
angle
is the bearing between the two locations.
回答2:
“Map Coordinates Systems” in the Location Awareness Programming Guide says “Specifically, on a Mercator map projection, a straight line drawn between any two points on the map yields a course heading that can be used in actual navigation on the surface of the Earth.” This makes me think you should convert your map coordinates to map points (MKMapPointForCoordinate
) and call atan
on the difference between map points. (Actually, you should probably use atan2
, not atan
.) Have you tried that?
来源:https://stackoverflow.com/questions/13600648/calculating-heading-of-compass-to-a-specific-coordinate-instead-of-to-north