PHP 半径搜索
Posted
技术标签:
【中文标题】PHP 半径搜索【英文标题】:PHP Radius Search 【发布时间】:2016-09-06 15:29:22 【问题描述】:我将构建一个应用程序,用户可以在其中查看其位置周围预定义半径内的兴趣点。
我的第一个想法是将所有 POI 的经纬度存储在数据库中,并通过 SQL 将用户位置与 POI 的位置进行比较。
问题在于我认为的性能。如果有数以千计的 POI 和数以千计的用户请求与他们的位置,这不会很经济或者这对于今天的服务器来说没有问题吗?
我的下一个方法是将地图划分为象限,并且只观察周围的象限。
tl;博士:
总而言之,我正在寻找:
一种进行半径搜索的方法 最多为其他用户缓存结果 缓存将在注册新 POI 时更新。如果你有任何想法如何实现这样的事情,请告诉我。
谢谢
法比安
【问题讨论】:
我认为这个***.com/questions/574691/… 链接对你有帮助。 【参考方案1】:我认为您正在寻找的是Harversine formula,它可以让您找到球体(在本例中为地球)中两点之间的距离。使用 SQL 的实现是这样的:
ACOS (
SIN(RADIANS($latitude)) *
SIN(RADIANS(T.latitude))+
COS(RADIANS($latitude)) *
COS(RADIANS(T.latitude))*
COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance
将此添加到查询的选择中将返回一个名为距离计算(以公里为单位)的列,通常是用户,从(T.latitude,T.longitude)到点($latitude,$longitude)有多远,通常是表格的元素。
如果您想过滤,并且不显示超过一定距离的元素,您可以设置如下条件:
HAVING distance<$radius
我想您正在使用 mysql,如果是这种情况,您必须使用 HAVING
而不是 WHERE
来对计算列(距离)创建条件。
一个完整的查询示例如下:
SELECT T.*, ACOS (
SIN(RADIANS($latitude)) *
SIN(RADIANS(T.latitude))+
COS(RADIANS($latitude)) *
COS(RADIANS(T.latitude))*
COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance
FROM your_table as T
HAVING distance < $radius
ORDER BY distance LIMIT $limit
如果您想进一步优化性能,请为查询添加一个限制,例如,您将拥有最近的 10 个地点。
请花点时间考虑Spatial data types,因为它们是专门为此类工作而设计的。
请注意,我不建议您将 php 变量直接插入到查询中,确实不安全,我这样做只是作为示例。
希望对你有所帮助。
【讨论】:
感谢您的快速响应。我现在将阅读该主题。 @F*** 对不起,答案很长,但我想我设法解释得很清楚。以上是关于PHP 半径搜索的主要内容,如果未能解决你的问题,请参考以下文章