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)

ObjectiveCでのこの式の私の実装はです。

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

使用している三角関数 ( sincosatan2) では、パラメーターを度ではなくラジアンにする必要があります。

たとえば、次の行で:

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

は度数ですが、ラジアンが必要なため、これcos(self.toCoordinate.latitude)は間違っています。self.toCoordinate.latitudecos

三角関数を呼び出すすべての場所で、最初にパラメーターを度からラジアンに変換します (度に を掛けます(M_PI/180.0))。


さらに、次の行で:

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

式のself.fromCoordinate.longitude残りの部分もラジアンであるため、これもラジアンに変換する必要があります。


最後に、最後に中点がlatMありlonMますが、単位はラジアンです (度ではありません)。

したがって、midPoint.latitudeとを設定するときmidPoint.longitudeは、 を掛けてlatMlonMをラジアンから度に戻す必要があり(180.0/M_PI)ます。

于 2012-07-30T12:49:28.597 に答える