約 500 メートルのMKCoordinateSpanを作成する必要があります。
MKCoordinateSpanコンストラクターに渡す値を計算するにはどうすればよいですか?
任意のプログラミング (Obj-C、.Net) 言語での回答は問題ありません。
約 500 メートルのMKCoordinateSpanを作成する必要があります。
MKCoordinateSpanコンストラクターに渡す値を計算するにはどうすればよいですか?
任意のプログラミング (Obj-C、.Net) 言語での回答は問題ありません。
もう 1 つの方法は、MapKit のMKCoordinateRegionMakeWithDistance
関数を使用することです。
MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);
にMKCoordinateSpan
なりますrgn.span
。
高い精度が必要でない限り、近似を使用するとはるかに簡単になります。最初の問題は、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;
}
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);
}