【发布时间】:2011-11-14 22:58:21
【问题描述】:
我需要创建一个大约 500 米的 MKCoordinateSpan。
如何计算要传递给 MKCoordinateSpan 构造函数的值?
任何编程(Obj-C、.Net)语言的答案都可以。
【问题讨论】:
标签: iphone ios geolocation xamarin.ios mkcoordinatespan
我需要创建一个大约 500 米的 MKCoordinateSpan。
如何计算要传递给 MKCoordinateSpan 构造函数的值?
任何编程(Obj-C、.Net)语言的答案都可以。
【问题讨论】:
标签: iphone ios geolocation xamarin.ios mkcoordinatespan
另一种选择是使用 MapKit 的 MKCoordinateRegionMakeWithDistance 函数:
MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);
MKCoordinateSpan 将位于rgn.span。
【讨论】:
除非您需要很高的准确性,否则您可以使用近似值使其更容易。第一个问题是找到代表 500 米的纬度的分数。容易,因为纬度在任何位置都是常数,大约 111 公里。所以 500 米是 0.0045 度纬度。
然后它会变得更难,因为经度的长度取决于您所在的位置。可以近似为
其中 alpha 是地球的赤道半径,6,378,137 公里,b/a 是 0.99664719(所有 GPS 设备都使用的 WGC84 椭球模型的常数)和,其中 phi 是纬度。
想象一下,您有幸身处南纬 37.783 度的墨尔本。在这里,南北无关紧要。 beta 的计算结果为 37.6899,其余部分求解得到长度为 88 公里的纵向度数。所以 500 米是 0.0057 度。
墨尔本的结果 - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);
你可以检查你的答案和你的代码with this online calculator
经度上的wiki article 对此有更多详细信息(以及此处图片的来源)
代码:
#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);
}
【讨论】: