1

美好的一天,我是 Objective C Dev 的新手,我正在询问位于http://www.movable-type.co.uk/scripts/latlong.html的中点公式的实现。

公式:

Bx = cos(lat2).cos(Δlong)

By = cos(lat2).sin(Δlong)

latm = atan2(sin(lat1) + sin(lat2), √((cos(lat1)+Bx)² + By²))

lonm = lon1 + atan2(By, cos(lat1)+Bx)

我在 Objective C 中这个公式的实现是。

 - (CLLocationCoordinate2D) getMidPointCoords
 {
    double dLon = (self.toCoordinate.longitude - self.fromCoordinate.longitude) * (M_PI/180);
    double Bx = cos(self.toCoordinate.latitude)*cos(dLon);
    double By = cos(self.toCoordinate.latitude)*sin(dLon);
    double latM = atan2(sin(self.fromCoordinate.latitude)+sin(self.toCoordinate.latitude), sqrt( (cos(self.fromCoordinate.latitude)+Bx)*(cos(self.fromCoordinate.latitude)+Bx) + By*By) );
    double lonM = self.fromCoordinate.longitude + atan2(By, cos(self.fromCoordinate.latitude) + Bx);

    CLLocationCoordinate2D midPoint;
    midPoint.latitude = latM;
    midPoint.longitude = lonM;
 }

当我调试这段代码时,它显然返回了不正确的坐标。所以基本上我的问题是“这是因为我使用双打吗?” 还是我对这个公式的实现只是有缺陷?

提前感谢您提供的任何帮助或见解。

4

1 回答 1

1

您使用的三角函数 ( sin, cos, atan2) 要求其参数以弧度为单位,而不是度数。

例如,在这一行中:

double Bx = cos(self.toCoordinate.latitude)*cos(dLon);

cos(self.toCoordinate.latitude)是错误的,因为self.toCoordinate.latitude以度为单位,但cos需要弧度。

在您调用三角函数的任何地方,首先将参数从度数转换为弧度(将度数乘以(M_PI/180.0))。


此外,在这一行中:

double lonM = self.fromCoordinate.longitude + atan2(...

theself.fromCoordinate.longitude也需要转换为弧度,因为表达式的其余部分也是弧度。


最后,在最后,latMlonM有中点,但以弧度(不是度数)为单位。

因此,当设置midPoint.latitudeand时midPoint.longitude,您必须将latMandlonM从弧度转换回度数,方法是将它们乘以(180.0/M_PI)

于 2012-07-30T12:49:28.597 回答