2011-09-11 11 views
24

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

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

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

答えて

88

別の方法としては、MapKitのを使用することです0機能:

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

MKCoordinateSpanrgn.spanになります。

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);  
    } 
+5

+1、それは簡単な方法です - 私はそのことについて知らなかった! –

+2

Google MonoTouchに私を強制するためにこれは本当に素晴らしい – Eugene

39

正確性が必要な場合を除き、近似を使用して簡単に行うことができます。第1の問題は、500メートルを表す緯度の割合を見つけることです。緯度の度合いはどの地点でも約111kmで一定であるため、簡単です。したがって500メートルは緯度.0045度です。

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

enter image description here

アルファ、6378137キロは、B/Aが0.99664719(すべてのGPSデバイスによって使用中WGC84スフェロイドモデルの使用で一定)と enter image description here PHI地球の赤道半径である

で近似することができます緯度の程度です。

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

結果 - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);

あなたの答えとあなたのコード経度のwiki articleが、この上の多くの詳細を持っているwith this online calculator

を確認することができます(そしてそれここでは画像のソース)

コード:

#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; 
} 
+3

すごい:MonoTouchでは –

+1

この答えを使用しないでください。ポイントを取得するのに満足しているので、MKCoordinateRegionMakeWithDistanceは正しい方法です。 –

-2

、そしてあなたは、このヘルパーメソッドを使用することができます。このソリューションを使用しました。今それは答えです。あまりにも私はあなたに1つの親指を与えることができない悪い...
+9

-1です。 – sean

+0

モノトックの解決策は何も問題ありません! –