我有一个用户数据库,每个用户都存储了关联的经度、纬度、半径(以米为单位)和 notificationID 值。
当用户登录我的应用程序时,我将检查他们的经度和纬度,并且需要检索遵循以下条件的 notificationID 列表:
用户 A 希望接收 1000m 半径范围内的通知。 用户B希望接收20000m半径范围内的通知。 用户C希望接收5000m半径范围内的通知。
因此,如果用户 C 发出推送通知,即使用户 A 与用户 C 的距离实际上比与用户 B 的距离更近,用户 B 也可能不会收到该通知。
如果不清楚,我很抱歉,我发现很难解释。
我之前做过一个查询,它将返回特定范围内的坐标,例如50m(下),但我遇到的问题是计算每个人的个人半径以及这与他们是否会收到其他用户的通知有何关系。
set @orig_lat= mysql_real_escape_string($_POST['Latitude']);
set @orig_lon=mysql_real_escape_string($_POST['Longitude']);
set @dist= mysql_real_escape_string($_POST['Distance']);
$Search_Query= "SELECT *,
3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat -
abs(
dest.lat)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS(
abs
(dest.lat) * pi()/180) * POWER(SIN((@orig_lon – dest.lon) * pi()/180 / 2), 2) ))
as distance FROM hotels dest having distance < @distORDER BY distance limit 10";
最佳答案
该查询每次都会使用全表扫描。这就是人们使用 GIS 的原因(不知道为什么 TLama 认为你应该切换 DBMS,MySQL 也具有地理空间功能)。
您没有说明您需要什么级别的准确性。如果是我,我可能不会为圆和 GIS 烦恼 - 在将半径计算为水平和垂直度数后,只需使用边界框即可。这可以在 where 子句中实现,从而允许有效使用索引。该框将在角落中包含额外 22% 的区域 - 但您可以在 HAVING 子句中过滤掉这些区域。
关于php - 获取用户特定半径内的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27857679/