【问题标题】:closest matching values sqlite [duplicate]最接近的匹配值 sqlite [重复]
【发布时间】:2017-09-29 12:20:32
【问题描述】:

我在 java 中使用 SQLite 连接到数据库,在数据库中用户将传递一些数据,SQLite 将基于此返回一个包含 5 个结果的列表。

我无法找出一种使用两个变量来返回最接近匹配结果的代码方式

它自己的程序将使用经度和纬度在数据库中搜索最近的 5 个火车站,并将它们排序到最近的最远,我的问题是经度和纬度将通过 android 应用程序动态输入。所以我不能硬编码 Long 和 Lat

这是我当前的代码

SELECT Latitude, Longitude, StationName FROM stations WHERE Latitude like '51%' AND Longitude like '-3%' LIMIT 5

正如您所见,为了测试其余的代码,我使用了通配符和类似选项来让我看起来它正在工作,但这只会给我一个按字母顺序排列的所有火车站的完整列表,一个现实的lat 更像是 53.4198,离那个最近的火车站可能是 53.4183。

请帮忙

【问题讨论】:

  • 对于这类事情,您最好使用 SQLite GIS 扩展 SpatiaLite 之类的东西。
  • 有更好的方法可以做到这一点,例如stackoverflow.com/questions/25170175/…。如果距离较大,则需要使用更好的公式,并考虑地球的球形形状。

标签: java sqlite


【解决方案1】:

您必须计算距离,然后按该距离排序。我想这会对你有所帮助。

SELECT Latitude, Longitude, StationName,
(
   3959 *
   acos(cos(radians(UserLatitude)) * 
   cos(radians(Latitude)) * 
   cos(radians(Longitude) - 
   radians(UserLongitude)) + 
   sin(radians(UserLatitude)) * 
   sin(radians(Latitude )))
) AS distance 
 FROM stations  
 ORDER BY distance ASC LIMIT 0,5;

谢谢:)

【讨论】:

  • 如果 DBMS 不支持三角函数,仍然可以使用类似的方法,不仅存储 lat 和 long,还存储它们的 sin 和 cos 值。
  • 那么,如果三角函数不起作用怎么办? @亨利
  • 不知道在我之前的评论中添加什么。将 lat、sinlat、coslat 和类似的经度存储在 db 表中,然后使用相同的公式。请注意,对于仅对记录进行排序,您不需要 acos,因为它在有趣的区间内是单调的..
  • 哇...好方法@Henry
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2015-03-18
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多