2013-03-18 84 views
1

我正在寻找很好的解决方案来计算两点之间的距离。Android和两点之间的距离使用sqlite

我想根据距离排序我的地理点。

我:

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); 

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

请帮助我。

+0

';'在查询中似乎对我来说不对。 – SudoRahul 2013-03-18 10:32:31

+0

看看这个问题:http://stackoverflow.com/questions/3126830/query-to-get-records-based-on-radius-in-sqlite/9536914#9536914 – rciovati 2013-03-18 10:49:42

回答

0

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

如果您只需要按照距离排序,那么您当前的代码就没有问题。

+0

问题是,他们是地理点。 在代码距离计数时,排序很糟糕。 – Unmerciful 2013-03-18 10:39:31

+0

如果你需要计算测地距离,你必须用Java来完成。或者尝试一下(我从来没有测试过,所以祝你好运):https://code.google.com/p/spatialite-android/ – Benoit 2013-03-18 10:53:38

-1

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

3

你有这里的问题是,你结合:

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

如果您准确性不高,这将无法正常工作!

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

选项1 - 使用大圆距离

该公式用于计算两个GPS坐标

Android提供了一个功能distanceBetween作为android.location的一部分之间以米为单位的距离。位置类来协助这一点。

缺点是你必须从SQLite中提取所有点以计算距离。

我也看到了一些杂交如:

  • 治疗WGS84(GPS)为矩形
  • 指定在您的分贝的区域限制的数据,你拔出来计算距离时的大小。

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

选项2 - 使用直角坐标系

如果你的距离较小,则可以解决这个问题是在UTM为矩形存储数据库点。

使用一个几乎相同的公式,但使用easting和northings,SQLite db可以用来提供距离UTM点最近的x个点。一旦识别出这些点,就可以对x结果执行平方根函数以获得以米为单位的距离。

咦?

还有一些关于使用UTM的注意事项。它可以帮助你看Calculating Distance Between Two Sets of Coordinates

所以你的解决方案最终取决于你的应用程序,并且是速度和准确性之间的妥协。