栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在mysql中使用经度和纬度查找两点之间的距离

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在mysql中使用经度和纬度查找两点之间的距离

我认为您的问题是您具有

city
两个城市之间的值,您希望计算它们之间的距离。

该查询将为您完成工作,并以km为单位得出距离。它使用球余弦定律公式。

请注意,您将表格与其自身相连,因此可以检索两个坐标对以进行计算。

SELECt a.city AS from_city, b.city AS to_city,    111.111 *    DEGREES(ACOS(LEAST(1.0, COS(RADIANS(a.Latitude))         * COS(RADIANS(b.Latitude))         * COS(RADIANS(a.Longitude - b.Longitude))         + SIN(RADIANS(a.Latitude))         * SIN(RADIANS(b.Latitude))))) AS distance_in_km  FROM city AS a  JOIN city AS b ON a.id <> b.id WHERe a.city = 3 AND b.city = 7

请注意,该常数

111.1111
是每米纬度的公里数,它是根据米的旧的拿破仑式定义,即从赤道到极点的距离的千分之一。该定义对于位置查找器工作足够接近。

如果要确定英里数而不是公里数,请

69.0
改用。

http://sqlfiddle.com/#!9/21e06/412/0

如果您正在寻找附近的地点,则可能会想使用类似以下的子句:

   HAVINg distance_in_km < 10.0        ORDER BY distance_in_km DESC

那就是(正如我们在美国马萨诸塞州波士顿附近所说的)邪恶的缓慢。

在这种情况下,您需要使用边界框计算。请参阅此文章以了解有关操作方法。
http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-
loc/

该公式包含一个

LEAST()
函数。为什么?因为如果
ACOS()
函数的参数甚至稍大于1,该函数就会引发错误。当所讨论的两个点非常靠近时,由于浮点epsilon(不准确,带有
COS()
SIN()
计算的表达式有时会产生略大于1的值)。)。该呼叫与问题对应。
LEAST(1.0,dirty-great-expression)

有一个更好的办法,一个公式通过撒迪厄斯·文森。它使用

ATAN2()
而不是
ACOS()
这样,因此不易受到epsilon问题的影响。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400665.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号