我在做app,使用sqlite db文件获取数据。 数据库中的表,包含商店名称,地址,城市,纬度,经度等列。
我能够获得实用的位置纬度和经度,还能够使用经度和纬度值计算当前位置与商店位置之间的距离(以db为单位)。
我的问题是 我需要获取/显示距离当前位置最近(距离)的10个商店名称(来自db)。
请建议我或提供参考链接以解决此问题
谢谢
答案 0 :(得分:2)
有thousands upon thousands of sites可以为您提供计算两点之间距离的公式。大多数人认为你想要考虑地球的曲率;没有它,它是简单的几何(毕达哥拉斯定理)。在伪代码中:
sqrt((x1-x2)^ 2 +(y1-y2)^ 2)
构造一个SQL查询,它包含您在ORDER BY
子句中选择的任何公式,并考虑您要搜索的固定点的纬度和经度。既然你不关心绝对距离,而只关心距离的大小,你可以做一些事情来节省CPU时间,比如跳过毕达哥拉斯定理的平方根部分。
要将结果集限制为10,请在查询中使用LIMIT 10
,然后您将获得前10个匹配。
答案 1 :(得分:1)
请注意,如果您有很多位置,SQLite将不会成为进行地理查询的理想平台。您将不得不对每个查询的每一行进行距离计算,这将是CPU密集型且速度慢。
最好找一个可以进行地理索引并以兼容格式提供数据的库。 (尝试搜索“Java地理索引”。)Lucene有一个地理扩展,但我不知道它是否曾用于alpha。
答案 2 :(得分:0)
另一种方法是将“最接近的”代码移动到网络中的某个应用服务器。这样你就不会在移动设备上做任何cpu密集的东西,它只需要一个主动的inet连接。
答案 3 :(得分:0)
我最近创建了一个类似这样的应用程序,这就是我做的方式:
distance = locationA.distanceTo(locationB);
if (distance <= 1000 * 10)
//the 1000 stands for one kilometer, times 10 means 10 kilometers
{
point = new GeoPoint(
(int) (lat * 1E6),
(int) (lng * 1E6));
OverlayItem overlayItem = new OverlayItem(point, name,
suburb+", "+state+", "+postcode);
itemizedOverlay.addOverlay(overlayItem);
}