Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP半径搜索_Php_Sql_Location_Maps_Distance - Fatal编程技术网

PHP半径搜索

PHP半径搜索,php,sql,location,maps,distance,Php,Sql,Location,Maps,Distance,我将构建一个应用程序,用户可以在其位置周围的预定义半径内看到感兴趣的点 我的第一个想法是将所有POI的纬度和经度存储在数据库中,并通过SQL将用户位置与POI的位置进行比较 我认为问题在于性能。如果有数千个POI和数千个用户请求以及它们的位置,这将不会非常经济,或者这对今天的服务器来说不是问题吗 我的下一个方法是将地图分成四个象限,只观察周围的象限 tl;医生: 总之,我在寻找: 一种进行半径搜索的方法 充其量只能为其他用户缓存结果 当注册新POI时,缓存将被更新 如果你有任何想法如何实现这

我将构建一个应用程序,用户可以在其位置周围的预定义半径内看到感兴趣的点

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

我认为问题在于性能。如果有数千个POI和数千个用户请求以及它们的位置,这将不会非常经济,或者这对今天的服务器来说不是问题吗

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

tl;医生:

总之,我在寻找:

  • 一种进行半径搜索的方法
  • 充其量只能为其他用户缓存结果
  • 当注册新POI时,缓存将被更新
如果你有任何想法如何实现这样的事情,请让我知道

多谢各位


费边

我想你要找的是,它可以让你找到球体中两点之间的距离(在这个例子中是地球)。使用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  
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
将其添加到查询的select中,将返回一个名为“距离计算(以Km为单位)”的列,该列计算点($latitude,$longitude)的距离,通常是用户距离(T.latitude,T.longitude),通常是表的元素距离

如果要过滤,并且显示的图元不超过某一距离,则可以设置如下条件:

HAVING distance<$radius  
如果您想进一步优化性能,请为查询添加一个限制,例如,您将拥有10个最近的位置

花时间好好考虑一下,因为他们是专门为这类工作做的。p> 请注意,我不建议您将php变量直接插入到查询中,这是非常不安全的,我这样做只是作为一个示例


希望这对您有所帮助。

我认为此链接对您有帮助。感谢您的快速回复。“我现在就来读这个话题。@Fabian很抱歉回答得太长,但我想我已经把它解释得很清楚了。”。