使用纬度,经度和半径在PHP和MySQL中进行地理围栏
我有一个
MySQL表,列有纬度,经度,userId和半径.当用户提供他当前的位置(纬度,长度)以及半径时,我想查询该表以基于两个半径向他提供重叠位置.
例如,如果用户给我一个12.5的纬度;经度73.5,半径5英里;我应该能够检索MySQL表中两个半径重叠的所有条目. 我最初的想法是为数据库中的每个lat创建一个边界框(基于半径),然后根据此边界框查询传入的位置详细信息.这种方法是否正确?如果我走这条路,有什么我应该关注的吗?任何指导我正确方向的帮助将不胜感激. PS:以下链接是我用作参考的. http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates 解决方法
像这样的东西应该做的伎俩:
SELECT * FROM YOUR_TABLE WHERE SQRT((input_lat - db_lat) * (input_lat - db_lat) + (input_long - db_long) * (input_long - db_long)) <= input_radius 我用过这个:Distance between two points 只有一件事:将半径转换为与坐标相同的单位 链接的内容(如果它下降) 这个小操作计算两点之间的距离.该例程可以在任意数量的维度上工作,因此您可以将其冷应用于2D或3D. 在2D中 xd = x2-x1 yd = y2-y1 Distance = SquareRoot(xd*xd + yd*yd) 在3D中 xd = x2-x1 yd = y2-y1 zd = z2-z1 Distance = SquareRoot(xd*xd + yd*yd + zd*zd) 如您所见,这需要您执行平方根.如果你想编写快速代码,应该像瘟疫一样避免平方根.如果你真的需要,只执行平方根. 避免方根的方法: 例如,如果您在球体之间执行碰撞检测,并且您想要知道的是两个是否发生碰撞,那么您不需要使用平方根.只需更改一段代码即可 从:????如果SquareRoot(xdxd ydyd)<直径 至:????if(xdxd ydyd)< (直径*直径) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |