【问题标题】:How to compare 2 location positions如何比较 2 个位置位置
【发布时间】:2013-08-11 09:28:53
【问题描述】:

我有一个带有TextView 的应用程序,它可以找到您的位置,当您移动时,TextView 中的值会发生变化。

我想知道如何才能注册第一个位置,然后在 5 分钟后查找该位置。

例如:

min 0
LAT 000000
LONG 000000

(保存)

min 5
LAT 1111111
LONG 111111

如果 min0 == min 5

...

总结一下,我想比较 2 个字符串(开头的 lat & long)和 5 分钟后的 lat & long。

任何建议将不胜感激。

【问题讨论】:

  • GPS/3G 没有那么精确。即使您没有移动一步,您的 GPS 位置也会因它的工作方式而改变。您需要设置一个半径,在其中您认为自己是静止的。

标签: android gps textview location latitude-longitude


【解决方案1】:

This Link 应该为您服务;

通过distanceTo or distanceBetween。您可以根据纬度和经度创建 Location 对象:

Location location = new Location("");
location.setLatitude(lat);
location.setLongitude(lon);

我遇到的另一个解决方案,

有一个标准公式 (Haversine)(也就是说,它适用于地球上任何一对经度/纬度),但性能很慢,因为它需要 7 个三角函数和 2 个平方根。

如果您的两个点相距不太远,您可以使用approximate 版本(Equirectangular),它要快得多。

// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double d = Math.sqrt(x * x + y * y) * R; // where R is the earth's Radius
                                         // R is 6,371 km

希望对您有所帮助。

【讨论】:

  • Equirectangular 投影有一个更好的变体:它在使用 Math.sqrt 之前乘以 R。如果你调用你的方法 distSqr(),你甚至有时可以避免 sqrt():调用者决定他是否只需要更快的距离的 sqr。例如与 60m = distSqr()
  • @AlexWien 那么这基本上就是用户要比较的 d^2 吗?对吗?
  • @AlexWien 我喜欢通过 X^2 的方法,但我唯一的问题是,它是否适用于所有条件?假设精度很重要,我们不能承受舍入误差,因为它将是 X^2。我希望你明白我的意思。
  • 不,没有影响。因为你已经在 xx + yy 中有那个正方形;您只需避免使用 sqrt。并且没有机会在 60.0 * 60.0 中出现双重溢出。
  • 哦不,我不是在谈论溢出,请查看此链接; programmers.stackexchange.com/questions/205351/…
【解决方案2】:

要比较两个字符串,请使用 String.equals(other String), http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#equals(java.lang.Object) 但位置和字符串格式必须相同。

如果您想在其上放置某种缓冲区,因此位置不必完全相同,您可以解析字符串并将 Lat 和 Long 保存为整数,然后将其与之前的 delta 进行比较触发您的 textview 更新。

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多