我正在开发一款使用GPS位置的应用。知道位置我得到纬度和经度。
我没有定期获得位置,但我想知道用户是否已经移动。为此,我存储了最后的位置和当前位置(纬度和经度)
我这样做:
if (latitudNew != latitudOld && longitudNew != longitudNew)
{
float R = 6378.137;
double dLat = ((latitudNew - latitudOld) * M_PI) / 180;
double dLong = ((longitudNew - longitudOld) * M_PI) / 180;
double a = sin(dLat/2) * sin(dLat/2) + cos((latitudOld*M_PI)/180) * cos((latitudNew*M_PI)/180) * sin(dLong/2) * sin(dLong/2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = R * c;
}
距离存储在d。
中我的问题是它永远不会超过if条件,所以我知道我没有正确比较它。
我不能使用this solution,因为我可以有负数(一个或两个或没有)。
任何想法??
答案 0 :(得分:3)
比较双打并不是一个好主意。您需要做的是减去这两个值,然后检查两者之间的差异是否大于您需要定义的阈值,如0.0001。
答案 1 :(得分:3)
你有这条线:
ERROR 1442: 1442: Can't update table 'user_has_academy_module' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
SQL Statement:
UPDATE `system`.`user_has_academy_module` SET `is_complete`='1' WHERE `user_id`='1' and`module_id`='11' and`academy_team_id`='49' and`academy_id`='29'
这是if (latitudNew != latitudOld && longitudNew != longitudNew)
。你有一个拼写错误,你正在测试变量是否与自身不相等。它总是假的。你的意思是为其中一个放longitudNew != longitudNew
。虽然您可能希望将longitudOld
替换为&&
,但是如果这些条件中的任何一个为真,您希望在if块中执行代码。
此外,这有点不合适......正确的拼写是经度和纬度。你离开了两个人。
答案 2 :(得分:2)
这看起来对我来说是正确的,你可以像在C中那样比较Objective-C中的double
。你从中获取信息的数据源可能会使值四舍五入,使它们看起来相等或者数据不经常更新。
此外,您可能希望更改逻辑,使||
中的if
代替&&
。你仍然认为位置更新是一个更新,即使它只是在两个中的一个。