MySQL使用可变半径计算地理位置距离

时间:2015-03-25 13:28:43

标签: php mysql math geolocation lamp

我正在建立一个地理定位广告平台,但我遇到了障碍。我可以使用this (page 8)成功计算给定半径范围内的所有广告业务。现在,客户希望改变广告客户的半径,您可以将其视为"服务区域"。基本广告客户的服务半径为100英里,但其他公司规模较大或在广告上花费较多的公司可能拥有250或500英里的服务区域。通过此更改,以前的计算不起作用。

如何获取所有这些可变半径和距离,以便返回对访问者有效的所有广告客户?

为了更好地说明我的问题,请查看:enter image description here

目前,我们计算并返回用户半径100英里范围内的所有广告客户(公司A,B和C)。随着新的变化,我们需要返回所有具有覆盖用户的服务区域的公司,其中包括公司D.公司E的服务区域/半径较小,不覆盖用户,因此记录不应该退还。

广告客户目前的表格类似于:

id
name
lat
lng
radius

1 个答案:

答案 0 :(得分:2)

如果可以计算以英里为单位的两点距离的纬度/经度,请参阅:

Find distance between two points using latitude and longitude in mysql

因此,如果给出了访问者位置(让我们将其定义为visitor_latitudevisitor_longitude),则返回范围内所有广告商的查询是:

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