web-dev-qa-db-ja.com

メートル単位のMKCoordinateSpan?

MKCoordinateSpanを作成する必要があります。これは約500メートルです。

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

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

26
Ian Vink

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

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

MKCoordinateSpanrgn.spanにあります。

94
user467105

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

経度の長さはあなたがどこにいるかによって変わるので、それからそれは難しくなります。それはで近似することができます

enter image description here

ここで、アルファは地球の赤道半径、6,378,137 km、b/aは0.99664719(すべてのGPSデバイスで使用されているWGC84回転楕円体モデルで使用されている定数)であり、 enter image description here ここで、phiは緯度です。

幸運にも南緯37.783度のメルボルンにいると想像してみてください。ここでは北か南かは関係ありません。ベータは37.6899であることがわかり、残りの部分は、縦方向の角度が88kmになるように解決されます。したがって、500メートルは.0057度です。

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

あなたはあなたの答えとあなたのコードをチェックすることができます このオンライン計算機で

wiki記事 経度については、これについてさらに詳しく説明しています(そしてここに画像のソースがあります)

コード:

#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;
}
39
Adam Eberbach