0

我有一个用户数据库,每个用户都存储了相关的经度、纬度、半径(以 m 为单位)和 notificationID 值。

当用户登录我的应用程序时,我将检查他们的经度和纬度,并且我需要检索符合以下条件的通知 ID 列表:

用户 A 想要接收来自 1000m 半径内的通知。用户 B 想要接收来自 20000m 半径范围内的通知。用户 C 想要接收来自 5000m 半径范围内的通知。

因此,如果用户 C 发出推送通知,即使用户 A 实际上比用户 B 更接近用户 C,它也可能被用户 B 而不是用户 A 接收。

抱歉,如果不清楚,我发现很难解释。

我之前做过一个查询,它将返回某个范围内的坐标,例如 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";
4

1 回答 1

0

该查询每次都会使用全表扫描。这就是人们使用 GIS 的原因(不确定为什么 TLama 认为您应该切换 DBMS,MySQL 也具有地理空间功能)。

你没有说你需要什么水平的准确度。如果是我,我可能不会为圆圈和 GIS 烦恼——只要在将半径计算为水平和垂直度数后使用边界框即可。这可以在允许有效使用索引的 where 子句中实现。该框将在角落中包含额外 22% 的区域 - 但您可以在 HAVING 子句中将其过滤掉。

于 2015-01-09T12:32:17.707 回答