具有 MySQL 未来证明的邻近搜索
Posted
技术标签:
【中文标题】具有 MySQL 未来证明的邻近搜索【英文标题】:Proximity Search w/ MySQL Future-Proof 【发布时间】:2014-10-14 16:46:22 【问题描述】:我的问题很简单。我目前正在研究和学习如何使用 php 和 mysql 以及 Google API 来允许我网站上的用户搜索特定城市,然后还包括附近的结果。我将继续自学,但我想对我的数据库进行未来验证,以便以后实施。
所以如果我有用户在注册时提交他们的邮政编码,我知道我可以使用 API 或函数来获取纬度和经度,然后我可以将该信息存储在自己的列中,例如“lat_lng” (邮政编码也将有自己的列)。
大问题:如何格式化 lat/long 列,以便稍后实现邻近搜索功能。示例:一位用户的 lat_lng 列可能读取为“41.854301,-71.193893”,仅用逗号分隔纬度和经度。其他用户会有不同的号码,但这足以让我在以后设置邻近搜索吗?
【问题讨论】:
我会将每个元素存储在自己的列中。 看看这个。在 POINT 类型的列上使用空间索引。如果您想轻松访问它们,您还应该将纬度和经度保留在它们自己的列中。 ***.com/a/4726072/4099592 @Jay Blanchard 好的,你的意思是,如果我将纬度(如上所列)存储在其自己的“纬度”列中,并将经度(如上)存储在其自己的“lng”列中,那我就完蛋了? 最好@Jbreen37 @slapyo 谢谢你的链接。似乎它会有效地工作,也似乎很复杂。您认为单独的列是否可以让我的数据库适应未来? 【参考方案1】:您正在寻找对点的拓扑或距离排序。您希望能够计算两个点或位置之间的距离。下面的公式产生不同精度的距离。选择一个能产生您想要的精度的。您会发现每个都需要单独的 lat 和 lon,因此请将它们放在单独的列中以简化 SQL 查询语句。
在给定地理位置 (lat,lon) 的情况下查找“附近”点使用两个众所周知的公式之一,harsine 公式(很受欢迎,因为它产生的有效数字较少的准确结果)和余弦定律公式(请参阅 @987654321 @fpr 解释)。
半正弦公式,
a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)
c = 2 ⋅ atan2( √a, √(1−a) )
d = R ⋅ c
其中φ是纬度,λ是经度,E是地球半径(6371.010km);请注意,三角函数需要将角度转换为弧度。
余弦定律:
d = acos( sin φ1 ⋅ sin φ2 + cos φ1 ⋅ cos φ2 ⋅ cos Δλ ) ⋅ E
可以使用毕达哥拉斯定理(对于较小的纬度、经度差异)找到近似值,使用较少的超越数(三角函数),
x = Δλ ⋅ cos φm
y = Δ
d = E ⋅ √x² + y²
但更粗略的近似使用曼哈顿距离(N-S 街道距离),
d = E * ( abs(x) + abs(y) ) / √2
【讨论】:
哇,这个答案看起来很棒,谢谢!等不及今晚下班后阅读它并回复你。谢谢查克。以上是关于具有 MySQL 未来证明的邻近搜索的主要内容,如果未能解决你的问题,请参考以下文章
MySQL从位于具有公共ID的不同表中的日期中获取最近的未来日期到给定日期