1

我正在寻找计算两点之间距离的好解决方案。

我想按距离排序我的地理点。

我有:

Cursor c = database.rawQuery("SELECT name,latitude,longitude,((longitude-21.15)*(longitude-21.15) +(latitude-54.05)*(latitude-54.05)) AS len FROM Object ORDER BY len;", null);

但这是错误的解决方案......距离是错误的......

请帮我。

4

3 回答 3

3

您在这里遇到的问题是您正在组合:

  • GPS 坐标 (WGS84),用于表示球体上的点。
  • 毕达哥拉斯定理,需要一个二维直角坐标系来确定距离。

如果您追求准确性,这根本行不通!

以下是我使用过的一些选项。

选项 1 - 使用大圆距

此公式用于计算两个 GPS 坐标之间的距离(以米为单位)

Android 提供了一个函数distanceBetween作为 android.location.Location 类的一部分来帮助解决这个问题。

缺点是您必须从 SQLite 中提取所有点才能计算距离。

我还看到了一些混合动力车,例如:

  • 将 WGS84 (GPS) 视为矩形
  • 在您的数据库中指定一个区域以限制您在计算距离时提取的数据大小。

然后使用 distanceBetween 函数进一步过滤结果。

选项 2 - 使用直角坐标系

如果您的距离很小,那么您可以通过将数据库点存储在矩形 UTM 中来解决这个问题。

使用几乎相同的公式,但使用东距和北距,SQLite db 可用于提供最接近 UTM 点的 x 个点。一旦确定了这些点,就可以对 x 结果执行平方根函数以获得以米为单位的距离。

嗯?

使用 UTM 也有一些注意事项。它可能会帮助您查看计算两组坐标之间的距离

因此,您的解决方案最终取决于您的应用程序,并且是速度和准确性之间的折衷方案。

于 2013-12-08T08:16:07.273 回答
0

您正在计算距离的平方。由于 SQLite 没有平方根函数,因此您需要在 Java 代码中进行计算。

如果您只需要按距离排序,那么您当前的代码就可以了。

于 2013-03-18T10:36:08.627 回答
-1

您可以使用android.location.Location类的静态方法distanceBetween 。然后根据计算出的距离,您可以生成一些排序的对象集合,例如 SortedMap。

于 2013-03-18T11:32:08.733 回答