【问题标题】:get co-ordinates within a user's specified radius获取用户特定半径内的坐标
【发布时间】:2016-04-02 06:49:31
【问题描述】:

我有一个用户数据库,每个用户都存储了相关的经度、纬度、半径(以 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";

【问题讨论】:

  • OT:如果这样的任务是您应用程序的主要目标,我会考虑使用 PostgreSQL/PostGIS 后端。

标签: php mysql coordinates radius


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多