MKCoordinateSpan in Meters?

Ian*_*ink 26 iphone geolocation xamarin.ios mkcoordinatespan ios

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

如何计算要传递给MKCoordinateSpan构造函数的值?

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

小智 95

另一种方法是使用MapKit的MKCoordinateRegionMakeWithDistance功能:

MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
    CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);
Run Code Online (Sandbox Code Playgroud)

MKCoordinateSpan会在rgn.span.

  • +1,这是简单的方法 - 我不知道那个! (6认同)
  • 这真的很好 (2认同)

Ada*_*ach 39

除非你需要很高的准确度,否则你可以通过近似使它更容易.第一个问题是找到代表500米的纬度的分数.很容易,因为纬度在任何位置都是恒定的,大约111公里.所以500米是纬度.0045度.

然后它变得更难,因为经度的长度取决于你在哪里.它可以近似为

在此输入图像描述

其中alpha是地球的赤道半径,6,378,137km,b/a是0.99664719(所有GPS设备使用的WGC84球体模型使用的常数)和 在此输入图像描述 其中phi是纬度.

想象一下,你有幸在墨尔本经度为37.783度S.北方或南方在这里无关紧要.beta测试结果是37.6899,其余部分解决了纵向度为88km的问题.所以500米是.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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请不要使用这个答案。尽管获得积分令人欣慰,但 MKCoordinateRegionMakeWithDistance 是正确的方法。 (2认同)