PHP / MySQL - 从实际 gps 坐标查找半径 500 米内的所有项目

Posted

技术标签:

【中文标题】PHP / MySQL - 从实际 gps 坐标查找半径 500 米内的所有项目【英文标题】:PHP / MySQL - Find all items in 500 meters radius from actual gps coordinates 【发布时间】:2017-10-20 17:13:52 【问题描述】:

我正在根据 GPS 坐标比较同一位置的价格。 所以例如我有一个带有坐标的项目:

lat: 45.815005 
lng: 15.978501

我想在我的 mysql 数据库中搜索每个项目,例如那个地方周围500米。 (它不需要是圆形的,X 上只有 500 米,Y 上只有 500 米)。 Latlng 在我的数据库中存储为单独的列类型 float(10,6)

我知道计算精确的 lng 和 lat 并不容易,但如果我错过每个站点几米,我很好。

这是一个相当复杂的问题,但我会感谢任何可以让我开始的建议。

【问题讨论】:

已经尝试和/或研究了什么? 怎么会不是一个圆圈呢?我认为您正在寻找半正弦公式。 它可能是一个正方形。但实际距离是 500m 三角形的斜边,而不是 500。 如果是正方形,则没有半径。 大声笑。好一个:-) 没有注意到半径。但据我所知,这只是在主题中提到的。 【参考方案1】:

考虑到半正弦公式,计算两个坐标之间的距离实际上并不难。

SELECT 
  -- stuff here
  , ( 6371000 * acos( cos( radians(45.815005) ) * cos( radians( stuff.lat ) ) * cos( radians( stuff.lng ) - radians(15.978501) ) + sin( radians(45.815005) ) * sin(radians(stuff.lat)) ) ) AS distance 
FROM 
  stuff
HAVING 
  distance < 500

Referenced Answer

对原始答案的必要更改:

    原始答案中提供的常数提供了英里或公里的值。我已将此处的常量更改为与仪表一起使用。

    常量已更改为使用您的坐标。您可能希望进一步调整查询以使用这些参数而不是常量。

    having 表达式略有变化,以反映您对 500 米的渴望。同样,这可能是您想要参数化的内容。

【讨论】:

以上是关于PHP / MySQL - 从实际 gps 坐标查找半径 500 米内的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句

在 PHP 中计算纬度/经度 GPS 点周围的半径

从 MySQL 数据库更新谷歌地图上“实时”标记的变化坐标

如何将 GPS 坐标发送到网络服务器?

MYSQL查询对GPS坐标进行排序

GPS经纬度坐标如何转化为图上坐标