2010-12-07 61 views
5

我在我的android应用程序中有一个包含地理位置指针(lat和lon是十进制度值)的数据库表,大约有1000个点。我需要选择20个最近点到某个给定的地理点。获取下一个N最接近的地理点

我在Stackoverflow找到答案如何计算两个地理点之间的距离,并非常高兴,直到我试图写我的查询。我发现,在android的内置sqlite中不能使用trignometrical函数。

但后来我有一个想法。我并不需要计算距离。近点是另一点,它们的地理坐标应该有较小的差异。

我怎么能用这个事实? (lat_0 - lat_n)^ 2 +(lon0-lon_n)^ 2是否足以保存点,其中lat_0和lon_0是给定点的地理坐标?

谢谢

穆尔

UPD

因此,要为我的问题的答案的最好方法是测试方法,我上面描述。

它工作得很好,但并不完全与精确距离相比。

所以如果你只需要计算一个距离,这个解决方案是可以的,但在我的情况下,我还需要按距离排序站点,并且不能使用这个解决方案。

我要感谢John在CashCommons和Philip。谢谢你们

回答

2

如果你的积分在城市内分开(或多或少),那么近似值就可以正常工作。但是,如果你去世界各地,这个近似值会分崩离析。

编辑:根据Philip的评论,您应该缩放其中一个组件。德国北纬约50度,所以经度乘以(cos50度)会更好。

1

是的。 :-)实际距离是sqrt((lat_0-lat_n)^ 2 +(lon0-lon_n)^ 2),但按(lat_0-lat_n)^ 2 +(lon0-lon_n)^ 2排序就足够了。

+0

我编辑了我的问题,lat和lon坐标存储为十进制度值,而不是度量值。 – Tima 2010-12-07 22:57:18

+0

好的,你的区域有多大?哪个区域?如果它不是太大并且不覆盖极点,则不需要数据库中的三角函数。(或者甚至将整个数据从数据库中提取出来,然后处理并写回。) – Philip 2010-12-07 23:00:56

+0

我也考虑过你的“甚至”解决方案:) – Tima 2010-12-07 23:09:36

0

嗯......我不确定这个订单会如何工作?你不需要每个点的不同顺序来表明它是邻居。

最简单的解决方案是迭代所有点并计算点之间的geometrical distance。对于1000分,这应该发生得相当快。

最优化的解决方案(就检索速度而言)是在将每个点插入数据库时​​计算每个点的邻居。例如,您可以将ID列表保存为逗号分隔的字符串并插入到数据库中?然后当你需要某个邻居时,你直接向他们做。但是,如果您需要插入新的点,这将会变得很痛苦。基本上你需要重新计算邻居。