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 半径搜索的主要内容,如果未能解决你的问题,请参考以下文章

半径内的html5地理位置搜索

MySQL 半径搜索

Radius 搜索 PHP、MYSQL 和谷歌地图

Objective-c 使用半径搜索位置

如何根据经纬度按半径搜索?

javascript 谷歌地图半径搜索