【问题标题】:MySQL Calculate Geolocation Distance with variable radiusesMySQL计算具有可变半径的地理位置距离
【发布时间】:2015-03-25 13:28:43
【问题描述】:

我正在构建一个地理定位广告平台,但遇到了障碍。我可以使用this (page 8) 成功计算给定半径内向用户做广告的所有企业。现在,客户想要更改广告商的半径,您可以将其视为“服务区域”。一个基本的广告商将有 100 英里的服务半径,但其他更大或在广告上花费更多的公司可能有 250 或 500 英里的服务范围。有了这个改变,之前的计算就不起作用了。

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

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

目前,我们计算并返回用户(公司 A、B 和 C)半径 100 英里内的所有广告商。通过新的更改,我们需要返回所有具有覆盖用户的服务区域的公司,其中包括公司 D。公司 E 的服务区域/半径较小,不覆盖用户,因此记录不应该被退回。

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

id
name
lat
lng
radius

【问题讨论】:

  • 将用户 lat lng 与广告商切换,而不是使用固定距离使用半径?

标签: php mysql math geolocation lamp


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我只是将我的 HAVING 子句设置为 &lt;= radius 并且它起作用了。我想我认为解决方案比这更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2014-01-05
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多