PHP 和 MySQL 中使用纬度、经度和半径的地理围栏

iSe*_*See 5 php mysql latitude-longitude geofencing

我有一个包含纬度、经度、用户 ID 和半径列的 MySQL 表。当用户提供他的当前位置(纬度,经度)以及半径时,我想查询表以根据两个半径为他提供重叠位置。

例如,如果用户给我 12.5 的纬度;经度为 73.5,半径为 5 英里;我应该能够检索 MySQL 表中两个半径重叠的所有条目。

我最初的想法是为数据库中的每个纬度、长度创建一个边界框(基于半径),然后根据这个边界框查询传入的位置详细信息。这种方法是否正确?如果我走这条路,我应该担心什么?任何指导我朝着正确方向前进的帮助将不胜感激。

PS:以下链接是我用作参考的链接。

http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates

Mel*_*lon 4

像这样的事情应该可以解决问题:

SELECT 
    *
FROM
    YOUR_TABLE
WHERE
    SQRT((input_lat - db_lat) * (input_lat - db_lat) + (input_long - db_long) * (input_long - db_long)) <= input_radius
Run Code Online (Sandbox Code Playgroud)

我用这个:两点之间的距离

只有一件事缺失:将半径转换为与坐标相同的单位

链接内容(以防失效)

这个小操作计算两点之间的距离。该例程可以在任意数量的维度上运行,因此您可以将其冷应用到 2D 或 3D。

在二维中定义你的两个点。点 1 位于 (x1, y1),点 2 位于 (x2, y2)。

xd = x2-x1
yd = y2-y1
Distance = SquareRoot(xd*xd + yd*yd)
Run Code Online (Sandbox Code Playgroud)

在 3D 中定义您的两个点。点 1 位于 (x1, y1, z1) 处,点 2 位于 (x2, y2, z2) 处。

xd = x2-x1
yd = y2-y1
zd = z2-z1
Distance = SquareRoot(xd*xd + yd*yd + zd*zd)
Run Code Online (Sandbox Code Playgroud)

如您所见,这需要您执行平方根。如果你想编写快速的代码,就应该像避免瘟疫一样避免平方根。仅在确实需要时才执行平方根。

避免平方根的方法:如果不需要非常精确的距离,可以使用查找表来计算。

例如,如果您正在执行球体之间的碰撞检测,并且您只想知道两个球体是否发生碰撞,那么您不需要使用平方根。只需更改一段代码即可

来自: if SquareRoot(xd xd + yd yd) < 直径

至: if (xd xd + yd yd) < (直径*直径)