我有一个用户数据库,每个用户都有相关的经度,纬度,半径(以m为单位)和存储的notificationID值。
当用户登录我的应用时,我会检查他们的经度和纬度,我需要检索遵循此标准的notificationID列表:
用户A希望收到半径1000米范围内的通知。 用户B希望接收来自20000米半径范围内的通知。 用户C希望接收来自半径5000米范围内的通知。
因此,如果用户C发出推送通知,即使用户A实际上比用户B更接近用户C,用户B也可能不会收到用户A。
道歉,如果不清楚,我发现很难解释。
我已经完成了一个查询,之前会返回某个范围内的坐标,例如50米(下方),但我正在努力的是计算每个人的个人半径以及如果他们将收到其他用户的通知,将会如何计算。
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";
答案 0 :(得分:0)
该查询每次都会使用全表扫描。这就是人们使用GIS的原因(不确定为什么TLama认为你应该转换DBMS,MySQL也有地理空间能力)。
您没有说出您需要的准确度。如果是我,我可能不会打扰圆圈和GIS - 只需在你将半径计算成水平和垂直度之后使用一个边界框。这可以在允许有效使用索引的where子句中实现。该方框将在角落中包含额外22%的区域 - 但您可以在HAVING子句中过滤掉这些区域。