Per*_*ril 3 sql sqlite gps android location
我在sqlite中有这个表
Locations
ID
Lat ( latitude)
Lon ( longitude)
Type
Name
City
Run Code Online (Sandbox Code Playgroud)
我有100个记录,我需要得到(使用我自己的坐标)我表中最近的点.
我所做的是获得当前点与表中每个点之间的最短距离,并返回最短点,但我正在寻找更好的解决方案
谢谢
一种可能的解决方案是为您感兴趣的整个地图使用网格,并将点预分配给特定的行/列.然后:
应该减少你需要做的计算次数.
如果您希望始终在X距离内找到一个位置,您可以查询x/y坐标,这些坐标将在您的坐标范围内+/- x KM(一个正方形),计算它们是否落在您的点的xKM圆圈内,然后选择最短的.
更新 - 网格选项
我假设你已经在两点计算之间做距离,并且不会描述.
如果您有方便的地图集,您可以通过在索引中查找位置来查看示例.它将为您提供一个页面和网格位置,如M5.如果你去那个页面,它会有用数字和字母标记的行和列,如果你看到第M行和第5列相交的方块,你会在那里找到那个城市.要为您的系统执行此操作,您需要:

因此,如果用户是绿色标记,他将在C4中.您将搜索C4中的所有其他点并确定最接近的是#2.然后你还必须检查一个网格,以确保没有比你找到的更近的项目,所以这包括正方形:B3,B4,B5,C3,C5,D3,D4,D5 .当你这样做时,你将从C3中选择#3并完成.
如果用户在方形D2中没有其他点,那么你会在C2中找到你的第一场比赛.检查C1,C2,C3,D1,D3,E1,E2,E3时.一旦找到,你将再次需要检查另一个半径,这将是:B0-4,C0,C4,D0,D4,E0,E4,F0-4.您可以看到网格选择对于尽可能提高效率非常重要.
另请注意,假设您的网格与我的手绘示例不同.
选项2:
如果您希望X km内的结果,并且您希望数据库快速计算出来,您可以执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
现在,这将为您提供正方形的所有结果.重要的是,然后检查它们实际上是在圆圈中 - 您需要在角落中放下任何角落,因为实际上可能存在比圆形边缘更近的坐标.因此,对于每个点,检查它是否首先在圆内(测试点是否在圆内)的方程式,然后计算距离并保持最接近的距离.如果没有得到结果,请加宽圆圈.
同样,选择良好的半径取决于您的数据.
| 归档时间: |
|
| 查看次数: |
1678 次 |
| 最近记录: |