PHP Radius Search


PHP Radius Search

我将构建一个应用程序,用户可以在该应用程序中查看所在位置周围预定义半径内的兴趣点。

我的第一个想法是将所有POI的纬度和经度存储在数据库中,并通过SQL将用户位置与POI的位置进行比较。

我认为问题出在表现上。如果有成千上万的POI和成千上万的用户请求他们的位置,这不会很经济,或者这对今天的服务器来说没有问题吗?

我的下一个方法是把地图分成象限,只观察周围的象限。

tl;dr:

总而言之,我正在寻找:

  • 进行半径搜索的方法
  • 最多为其他用户缓存结果
  • 当正在注册新的POI时,高速缓存将被更新

如果你有任何想法如何实现这样的事情,请告诉我。

谢谢

Fabian

我想你正在寻找的是Harversine公式,它可以让你找到球体(在这种情况下是地球)中两点之间的距离。使用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  

将其添加到查询的选择中,将返回一个名为distance calculation(以Km为单位)的列,该列通常是用户从(T.latitude,T.经度)(通常是表的元素)算起的距离。

如果你想过滤,并且不显示超过一定距离的元素,你可以设置一个条件,比如:

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个位置。

花点时间考虑空间数据类型,因为它们是专门为这类工作设计的。

请注意,我不建议您将php变量直接插入到查询中,这确实是不安全的,我只是举了一个例子。

希望这对你有帮助。