Sql 选择问题

Sql 选择问题,sql,mysql,Sql,Mysql,假设我有一个包含城市列表的表格: city | latitude | longitude --------------------------- XX | 34.800 | 48.550 假设我有一个用户的大致位置(纬度/经度),我如何找到最近的城市?也就是说,如何找到纬度和经度最接近用户纬度/经度的城市?请查看 这里给出的计算方法独立于谷歌地图,你应该能够从那里得到完整的算法 人们只需要警惕不同的映射方法以及由此产生的不同坐标。根据坐标映射的用途,您可能需要调整算法的参数。谷歌地图

假设我有一个包含城市列表的表格:

city | latitude | longitude
---------------------------
XX   | 34.800   | 48.550
假设我有一个用户的大致位置(纬度/经度),我如何找到最近的城市?也就是说,如何找到纬度和经度最接近用户纬度/经度的城市?

请查看

这里给出的计算方法独立于谷歌地图,你应该能够从那里得到完整的算法


人们只需要警惕不同的映射方法以及由此产生的不同坐标。根据坐标映射的用途,您可能需要调整算法的参数。

谷歌地图api有一个新功能,可以反转地理缓存

玩得开心:)

您可以使用,或

下面的公式将计算两点之间的距离(以海里为单位)

3600*acos(垂直方向) *sin(纬度1度)+cos(纬度2度) *cos(纬度) *cos(纵向1_拉德-纵向2_拉德))

因此,您可以按如下方式将其连接到select(在下面的示例中,-7是所需的lat,-14是所需的lon)

假设lat/lon场以度为单位:

select * FROM NDB as c1
order by  acos(sin(radians(-7))
          * sin(radians(latitude)) + cos(radians(-7))
          * cos(radians(latitude))
          * cos(radians(longitude) - radians(-14)))
limit 0,1
对于大型数据集,这可能不是很有效,我只是针对一个包含22706条记录的表运行了它,耗时0.163s秒


如果性能存在问题,则最好预先计算所有点与固定基准面的距离,然后使用该距离,而不是在SQL中计算。

根据谷歌地图协议,反向地理查找的结果无法保存在数据库中。这就是为什么我更喜欢另一种解决方案。