我有一个SQLite表:
Locations
ID
Lat ( latitude)
Lon ( longitude)
Type
Name
City
我举个例子,我有100条记录,我需要使用我的坐标在表格中找到最近的点。
我的方法是计算当前点与表格中每个点之间的距离,然后返回距离最短的那个点,但我正在寻找更好的解决方案。
谢谢。
选项2:
如果您期望在X公里范围内获得结果,并且希望您的数据库能够快速计算,您可以执行以下操作:
LatMin = currentLatCoord-radiusValInDegrees
LatMax = currentLatCoord+radiusValInDegrees
LonMin = currentLonCoord-radiusValInDegrees
LonMax = currentLonCoord+radiusValInDegrees
SELECT *
From Locations
WHERE Lat BETWEEN LatMin AND LatMax
AND Lon BETWEEN LonMin AND LonMax
现在这样做可以给你一个放在正方形中的所有结果。重要的是,你需要检查它们是否实际上在圆内——你需要舍弃任何在角落里的点,因为可能比边缘上的坐标更接近。因此,对于每个点,请先检查它是否在圆内(测试一个点是否在圆内的公式),然后计算距离并保留最近的那个。如果没有得到结果,请扩大圆的半径。
同样地,选择好的半径将取决于您的数据。
你看过这个网站,关于如何计算两点之间的距离吗?
但要记住它仅基于地球表面给出距离,而不是基于实际到达该位置的路径。因此,如果您想根据实际路径计算距离,则可以使用Google MAP API。
Google Maps API根据实际路径给出两点之间的距离。
希望这些信息肯定能帮助到您。
享受编程...:)
两点之间的距离: ((x1 - x2) ^ 2 + (y1 - y2) ^ 2) ^ 0.5
。然而,这些点之间的距离是直线距离。很可能会有像当地道路与高速公路这样的变量,更不用说单行道和水路,需要找到最近的桥梁。因此,我建议使用Google和Bing地图api。它们免费提供有限数量的搜索。
在SQLite中基于半径获取记录的查询中有一个相当聪明的解决方案,它是基于在插入行时预计算每个位置的一些三角函数值,然后可以仅使用算术函数在查询中计算距离。
我已经在自己的代码中非常成功地使用了它。
取决于你在靠近极地时对正确性的关注程度
如果最接近的勾股距离足够好,你可以在sql的orderby中使用这个
例如:SELECT * FROM locations ORDERBY (Lat-myLat)*(Lat-myLat) + (Lon-myLon)*(Lon-myLon) LIMIT 1
虽然不是技术上最正确的方法,但节省了从数据库获取所有位置并循环遍历它们的步骤,让sqlite代替你完成这些操作
尽管这不是最佳选择。
假设你正在尝试查找固定数量的位置/位置表数据的 N 英里/公里半径内的最短距离,而这些数据并不经常更改。
添加另一个名为 Distance_Index(DI)的列,它是自引用键ArrayType。运行一次过程,并根据与此DI的距离按升序更新ID。现在,从下一次开始,距离就在您身边了。只需向数据库发出查询并使用它即可。
现在,在您的问题中,如果位置数在N之内,则DI不会太长。仅作为意见。
a
,和一个点表a[]
。目前,您做的事情是这样的:b[]
- 从b[i]
到a
获取distance
- 如果distance
小于minimumDistance
- 设置minimumDistance = distance
- 设置closestPoint = i
返回closestPoint
如果是这样,您正在以O(n)
时间找到它,这不能真正得到改进。您必须检查所有点以查看哪些是最接近的。n
的数量。这可以大大减少需要比较的点数。代价是一些预处理时间和稍微复杂的逻辑。如果您有一个长点列表(或distance()
函数需要很长时间),您肯定会想要做这样的事情。