检测您是否距离兴趣点一公里

时间:2011-09-26 15:59:18

标签: android math

我有一个有趣的问题。我的纬度值为51.445376,经度值为-0.190624(例如,假设这是由机器人位置监听器收到的)。这个特定的位置(及其值)是一个兴趣点,它存储在我的数据库中。我在我的android上使用位置监听器,我将用户当前位置发送到服务器,以检测用户是否进入该特定兴趣点的一公里半径范围内。有谁知道用什么算法来检查用户当前的经度和纬度是否在经度和纬度的一个半径范围内?或者我能看到的东西?

也许有人可以帮助我,因为我的数学并不是世界上最伟大的。

3 个答案:

答案 0 :(得分:4)

对于地理坐标,请使用此功能(公共域):

public static double distanceInKM(
           double latStart,double lonStart,
           double latEnd,double lonEnd
){
      latStart=Math.toRadians(latStart);
      latEnd=Math.toRadians(latEnd);
      return 6370.997*Math.acos(
              Math.cos(Math.toRadians(lonEnd - lonStart))*Math.cos(latStart)*
              Math.cos(latEnd)+Math.sin(latStart)*Math.sin(latEnd));
}

至少有两种流行的计算地理距离的方法:Haversine和Vincenty方法。尽管Vincenty非常准确,但它对您的需求来说也有点复杂。上述方法显示了基于余弦球面定律的距离函数。

答案 1 :(得分:1)

This post from 2008 might be helpful

它链接到MovableType description如何使用Haversine公式来计算球体上两点之间的距离。重要的是要注意它不是100%准确,因为地球不是一个完美的球体(它的赤道半径与极半径差不多20公里),但应该足以满足你的需要。

MovableType链接还描述了如何使用等矩形投影(纬度/长度到直角坐标的平移)和毕达哥拉斯定理来确定距离的粗糙(但更快)近似(适用于~1的小距离) -2km。)

答案 2 :(得分:0)

一个简单的解决方案:首先找到距离,首先找到dx和dy。

说我有点1(p1)和点2(p2)

dx = p2.x - p1.x; dy = p2.y - p1.y;

现在找到距离d如下

d = sqrt(dx ^ 2 + dy ^ 2)

在像java这样的编程语言中,您可以使用以下几行:

double d = Math.sqrt(dx*dx + dy*dy);

希望这有助于您的出发点!

注意:x&必须根据您的lat& lon信息计算y。我打算写一个简短的代码片段,但我看到其他人有一个很好的解决方案(我赞成他的回复)。