MKCoordinateSpan在米制单位下是多少?

29

我需要创建一个大约为500米的MKCoordinateSpan

我该如何计算传递到MKCoordinateSpan构造函数中的值?

任何编程语言(Obj-C、.Net)的答案都可以。

3个回答

103
另一种选择是使用MapKit的MKCoordinateRegionMakeWithDistance函数:
MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
    CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);

MKCoordinateSpan 将在 rgn.span 中。


41

如果您不需要非常精确的结果,可以使用近似值来简化计算。第一个问题是找到代表500米的纬度度数分数。这很容易,因为在任何位置,一度纬度是一个常数,大约为111公里。因此,500米相当于0.0045度的纬度。

然后就变得更加困难了,因为经度度数的长度取决于您所在的位置。可以用以下公式进行近似计算:

enter image description here

其中alpha是地球的赤道半径,为6,378,137公里,b/a为0.99664719(WGC84椭球模型中使用的常数,适用于所有GPS设备),enter image description here其中phi为纬度度数。

想象一下,如果您很幸运,现在位于墨尔本,经度为37.783度S。北方或南方都无关紧要。beta计算出为37.6899,其余部分解决后可以得出一个经度度数的长度为88公里。因此,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;
}

2
请不要使用这个答案。虽然得到分数很令人满足,但MKCoordinateRegionMakeWithDistance才是正确的方法。 - Adam Eberbach

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接