使用/ MySQL Future-Proof进行邻近搜索

时间:2014-10-14 16:46:23

标签: php mysql search proximity zipcode

我的问题很简单。我目前正在研究和学习如何使用PHP和MySQL以及Google API来允许我网站上的用户搜索特定城市,然后还包括附近的结果。我将继续自己学习,但我希望能够在未来证明我的数据库,以便以后实施。

因此,如果我有用户在注册时提交他们的邮政编码,我知道我可以使用API​​或函数来获取经度和纬度,然后我可以将该信息存储在自己的列中,例如&#39 ; lat_lng' (邮政编码也有自己的专栏)。

大问题:如何格式化lat / long列,以便稍后我可以实现邻近搜索功能。示例:一个用户的lat_lng列可能显示为" 41.854301,-71.193893"用逗号分隔纬度和经度。其他用户会有不同的号码,但这对我来说是否足以在以后设置邻近搜索?

1 个答案:

答案 0 :(得分:0)

您正在寻找点上的拓扑或距离排序。您希望能够计算两个点或位置之间的距离。下面的公式以不同的精度产生距离。选择一个能产生所需精度的产品。您会发现每个都需要单独的lat和lon,因此请将它们保存在单独的列中以简化SQL查询语句。

在给定地理位置(lat,lon)的情况下查找“附近”点使用两个众所周知的公式之一,即hasrsine公式(因为它产生具有较少有效数字的精确结果而流行)和余弦公式的公式(请参阅{{ 3}} fpr解释)。

's hasrsine公式,

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

使用毕达哥拉斯定理(对于小lat,lon差异)可以找到近似值,使用更少的超越点(三角函数),

x =Δλ·cosφm

y =Δ

d =E⋅√x²+y²

然而,较粗略的近似使用曼哈顿距离(N-S街道距离),

d = E *(abs(x)+ abs(y))/√2