MySQL 计算具有可变半径的地理位置距离
MySQL Calculate Geolocation Distance with variable radiuses
我正在构建一个地理定位广告平台,但 运行 遇到了麻烦。我可以使用 this (page 8) 成功计算给定半径内向用户投放广告的所有企业。现在,客户想要更改广告商的半径,您可以将其视为 "service areas"。例如,一个基本广告商的服务半径为 100 英里,但其他规模更大或广告支出更多的公司的服务范围可能为 250 或 500 英里。进行此更改后,之前的计算将不起作用。
如何获取所有这些可变半径和距离,以便 return 所有对访问者有效的广告商?
为了更好地说明我的问题,请看一下:
目前我们计算并 return 用户方圆 100 英里范围内的所有广告商(公司 A、B 和 C)。随着新的变化,我们需要 return 所有拥有覆盖用户的服务区域的公司,其中包括公司 D。公司 E 有一个较小的服务 area/radius,不覆盖用户, 因此该记录不应 returned.
广告商的 table 目前看起来类似于:
id
name
lat
lng
radius
鉴于 lat/lng 可以计算两点的距离(以英里为单位),请参阅:
Find distance between two points using latitude and longitude in mysql
因此,如果给定访问者位置(让我们将其定义为 visitor_latitude
和 visitor_longitude
),则 returns 范围内所有广告商的查询是:
SELECT *,
69.0412 * DEGREES(ACOS(COS(RADIANS(lat))
* COS(RADIANS(visitor_latitude))
* COS(RADIANS(lng - visitor_longitude))
+ SIN(RADIANS(lat))
* SIN(RADIANS(visitor_latitude)))) AS distance
FROM advertisers
WHERE distance <= radius
我正在构建一个地理定位广告平台,但 运行 遇到了麻烦。我可以使用 this (page 8) 成功计算给定半径内向用户投放广告的所有企业。现在,客户想要更改广告商的半径,您可以将其视为 "service areas"。例如,一个基本广告商的服务半径为 100 英里,但其他规模更大或广告支出更多的公司的服务范围可能为 250 或 500 英里。进行此更改后,之前的计算将不起作用。
如何获取所有这些可变半径和距离,以便 return 所有对访问者有效的广告商?
为了更好地说明我的问题,请看一下:
目前我们计算并 return 用户方圆 100 英里范围内的所有广告商(公司 A、B 和 C)。随着新的变化,我们需要 return 所有拥有覆盖用户的服务区域的公司,其中包括公司 D。公司 E 有一个较小的服务 area/radius,不覆盖用户, 因此该记录不应 returned.
广告商的 table 目前看起来类似于:
id
name
lat
lng
radius
鉴于 lat/lng 可以计算两点的距离(以英里为单位),请参阅:
Find distance between two points using latitude and longitude in mysql
因此,如果给定访问者位置(让我们将其定义为 visitor_latitude
和 visitor_longitude
),则 returns 范围内所有广告商的查询是:
SELECT *,
69.0412 * DEGREES(ACOS(COS(RADIANS(lat))
* COS(RADIANS(visitor_latitude))
* COS(RADIANS(lng - visitor_longitude))
+ SIN(RADIANS(lat))
* SIN(RADIANS(visitor_latitude)))) AS distance
FROM advertisers
WHERE distance <= radius