使用纬度和经度iphone在地图上的两个点之间的距离的等式

时间:2011-09-12 21:16:45

标签: iphone google-maps

我正在尝试计算iPhone地图上两点(Pins)之间的距离。 一切正常但是如果你将其中一个引脚靠近左边缘而另一个引脚放在地图的右边缘,则distanceFromLocation方法总是返回点之间的最短距离(当然地球不平坦)。我尝试切换CLLocations但它仍然显示我最短的距离。

对于我的应用程序,我需要计算两个引脚之间的最短距离和最长距离。 问题似乎微不足道,但我无法解决问题。 任何帮助或线索表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

有一个函数MKCoordinateRegionForMapRect可以返回MKCoordinateRegion。在没有尝试的情况下,似乎所有你需要做的就是准确地指定矩形作为一个对角线由一个针脚限定的区域,另一个对角线由另一个针脚限定。您可以使用CGRectUnion两次将引脚原点作为矩形原点和任意小的宽度和高度。

然后,引脚之间的距离将是由spanitudeDelta表示的距离的平方根,并且在平方和平方中返回的longitudeDelta将被添加。 (即毕达哥拉斯定理,两个边长是三角形的水平和垂直边,对角线是你的点之间的直线。)

以米为单位查找latitudeDelta很容易,每个纬度都是111km。

要查找经度Delta的米,您需要更多代码。

#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 lengthOfDegreeLongitude(double degrees) {

    double tanDegrees = tanf(degreesToRadians(degrees));
    double beta =  tanDegrees * WGS84_CONSTANT;
    double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0;

    return lengthOfDegree;
}

将该函数赋予您感兴趣的位置的经度,并将结果乘以度数的longitudeDelta,以获得以米为单位的距离。然后你有一个水平距离和一个垂直距离,你可以找到你正在寻找的对角线。

如果您正在寻找N-S中非常大的距离,则不准确会变坏,因为经度的长度将随着计算而变化。你可以稍微改善111km的纬度,这只是来自记忆。