微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 从一个点获得最短距离

我在sqlite中有这个表

Locations
ID
Lat ( latitude)
Lon ( longitude) 
Type
Name
City

我有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

现在,这将为您提供正方形的所有结果.重要的是,然后检查它们实际上是在圆圈中 – 您需要在角落中放下任何角落,因为实际上可能存在比圆圈边缘更近的坐标.因此,对于每个点,检查它是否在圆圈内(Equation for testing if a point is inside a circle)然后计算距离并保持最近的距离.如果没有得到结果,请加宽圆圈.

同样,选择良好的半径取决于您的数据.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐