24

の 2 つの場所の中間点を特定しようとしていMKMapViewます。ここ(およびここ) で概説されている方法に従って、Objective-C で書き直しましたが、マップの中心はバフィン島の北東のどこかにあり、2 つのポイントの近くにはありません。

上記のリンクにある Java メソッドに基づく私のメソッド:

+(CLLocationCoordinate2D)findCenterPoint:(CLLocationCoordinate2D)_lo1 :(CLLocationCoordinate2D)_loc2 {
    CLLocationCoordinate2D center;

    double lon1 = _lo1.longitude * M_PI / 180;
    double lon2 = _loc2.longitude * M_PI / 100;

    double lat1 = _lo1.latitude * M_PI / 180;
    double lat2 = _loc2.latitude * M_PI / 100;

    double dLon = lon2 - lon1;

    double x = cos(lat2) * cos(dLon);
    double y = cos(lat2) * sin(dLon);

    double lat3 = atan2( sin(lat1) + sin(lat2), sqrt((cos(lat1) + x) * (cos(lat1) + x) + y * y) );
    double lon3 = lon1 + atan2(y, cos(lat1) + x);

    center.latitude  = lat3 * 180 / M_PI;
    center.longitude = lon3 * 180 / M_PI;

    return center;
}

2 つのパラメーターには、次のデータがあります。

_loc1:
    latitude = 45.4959839
    longitude = -73.67826455

_loc2:
    latitude = 45.482889
    longitude = -73.57522299

上記はマップ上に正しく配置されています (モントリオール内および周辺)。私は2つの中間点にマップを配置しようとしていますが、私のメソッドは次を返します:

latitude = 65.29055
longitude = -82.55425

北極圏のどこかで、南に約 500 マイルあるはずです。

4

5 に答える 5

15

lon2ただの予感ですが、あなたのとlat2変数が で計算されていてM_PI/100ではないことに気付きましたM_PI/180

double lon1 = _lo1.longitude * M_PI / 180;
double lon2 = _loc2.longitude * M_PI / 100;

double lat1 = _lo1.latitude * M_PI / 180;
double lat2 = _loc2.latitude * M_PI / 100;

それらを180に変更すると、少し役立つ場合があります。

于 2012-05-11T22:19:54.383 に答える
10

迅速なユーザーの場合、@dinjas が示唆するように修正されたバリアント

import Foundation
import MapKit
extension CLLocationCoordinate2D {
    // MARK: CLLocationCoordinate2D+MidPoint
    func middleLocationWith(location:CLLocationCoordinate2D) -> CLLocationCoordinate2D {

        let lon1 = longitude * M_PI / 180
        let lon2 = location.longitude * M_PI / 180
        let lat1 = latitude * M_PI / 180
        let lat2 = location.latitude * M_PI / 180
        let dLon = lon2 - lon1
        let x = cos(lat2) * cos(dLon)
        let y = cos(lat2) * sin(dLon)

        let lat3 = atan2( sin(lat1) + sin(lat2), sqrt((cos(lat1) + x) * (cos(lat1) + x) + y * y) )
        let lon3 = lon1 + atan2(y, cos(lat1) + x)

        let center:CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat3 * 180 / M_PI, lon3 * 180 / M_PI)
        return center
    }
}
于 2016-10-12T11:55:10.763 に答える
2

OP が地理的中間点を計算するために使用する式は、cos/sin/sqrt の計算を説明するこの式に基づいていると言うことが重要です。

この式は、4 つの四半期と本初子午線を含む長距離地理的中間点を示します。

ただし、計算が 1 キロメートル前後の短距離の場合、単純な平均を使用しても同じ中間点の結果が得られます。すなわち:

let firstPoint = CLLocation(....)
let secondPoint = CLLocation(....)

let midPointLat = (firstPoint.coordinate.latitude + secondPoint.coordinate.latitude) / 2
let midPointLong = (firstPoint.coordinate.longitude + secondPoint.coordinate.longitude) / 2

実際には 10 km 使用できますが、偏差が予想されます。高速なソリューションを使用した短距離中間点の推定のみが必要な場合は、それで十分です。

于 2018-04-09T11:06:44.377 に答える
-10

私はあなたがそれを少し考えすぎていると思います。ただ行う:

float lon3 = ((lon1 + lon2) / 2)
float lat3 = ((lat1 + lat2) / 2)

lat3 と lon3 が中心点になります。

于 2012-05-11T22:24:27.983 に答える