26

約 500 メートルのMKCoordinateSpanを作成する必要があります。

MKCoordinateSpanコンストラクターに渡す値を計算するにはどうすればよいですか?

任意のプログラミング (Obj-C、.Net) 言語での回答は問題ありません。

4

3 に答える 3

99

もう 1 つの方法は、MapKit のMKCoordinateRegionMakeWithDistance関数を使用することです。

MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
    CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);

MKCoordinateSpanなりますrgn.span

于 2011-09-12T02:49:56.110 に答える
39

高い精度が必要でない限り、近似を使用するとはるかに簡単になります。最初の問題は、500 メートルを表す緯度の分数を見つけることです。緯度はどの場所でも一定で、約 111 km であるため簡単です。したがって、500 メートルは緯度 0.0045 度です。

場所によって経度の長さが異なるため、さらに難しくなります。で近似できます。

ここに画像の説明を入力

ここで、alpha は地球の赤道半径 6,378,137km、b/a は 0.99664719 (すべての GPS デバイスで使用される WGC84 回転楕円体モデルで使用される定数) でありここに画像の説明を入力、phi は緯度です。

幸運にも南緯 37.783 度のメルボルンにいると想像してみてください。ここでは南北は関係ありません。beta は 37.6899 であることがわかり、残りの部分を解くと、経度の長さは 88km になります。したがって、500 メートルは 0.0057 度です。

メルボルンの結果 -MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);

このオンライン計算機で答えとコードを確認できます

経度に関するウィキの記事には、これに関する詳細が記載されています (画像のソースはこちら)。

コード:

#define EARTH_EQUATORIAL_RADIUS (6378137.0)
#define WGS84_CONSTANT (0.99664719)

#define degreesToRadians(x) (M_PI * (x) / 180.0)

// accepts decimal degrees. Convert from HMS first if that's what you have
double spanOfMetersAtDegreeLongitude(double degrees, double meters) {

    double tanDegrees = tanf(degreesToRadians(degrees));
    double beta =  tanDegrees * WGS84_CONSTANT;
    double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0;
    double measuresInDegreeLength = lengthOfDegree / meters;
    return 1.0 / measuresInDegreeLength;
}
于 2011-09-11T23:34:39.500 に答える
-1

MonoTouch では、このソリューションを使用して、次のヘルパー メソッドを使用できます。

    public static void ZoomToCoordinateAndCenter (MKMapView mapView, CLLocationCoordinate2D coordinate, double meters, bool showUserLocationToo, bool animate)
    {
        if (!coordinate.IsValid ())
            return;

        mapView.SetCenterCoordinate (coordinate, animate);
        mapView.SetRegion (MKCoordinateRegion.FromDistance (coordinate, meters, meters), animate);      
    }
于 2011-09-13T18:14:24.030 に答える