嗨,我有下表
--------------------------------------------
| id | city | Latitude | Longitude |
--------------------------------------------
| 1 | 3 | 34.44444 | 84.3434 |
--------------------------------------------
| 2 | 4 | 42.4666667 | 1.4666667 |
--------------------------------------------
| 3 | 5 | 32.534167 | 66.078056 |
--------------------------------------------
| 4 | 6 | 36.948889 | 66.328611 |
--------------------------------------------
| 5 | 7 | 35.088056 | 69.046389 |
--------------------------------------------
| 6 | 8 | 36.083056 | 69.0525 |
--------------------------------------------
| 7 | 9 | 31.015833 | 61.860278 |
--------------------------------------------
现在我想获得两点之间的距离。假设一个用户有一个城市3,一个用户有一个城市7。我的情况是一个用户有一个城市和纬度,纬度正在搜索其他用户与城市的距离。例如,拥有城市3的用户正在搜索。他想得到其他城市的用户的距离是7。我已搜索到以下查询
SELECT `locations`.`city`, ( 3959 * acos ( cos ( radians(31.589167) ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians(64.363333) ) + sin ( radians(31.589167) ) * sin( radians( Latitude ) ) ) ) AS `distance` FROM `locations` HAVING (distance < 50)
据我所知,此查询查找从一个点到所有其他点的距离。现在我想获得一个点到另一点的距离。
任何指导方针将不胜感激。
我认为您的问题是您具有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 /* slow ! */
ORDER BY distance_in_km DESC
那就是(正如我们在美国马萨诸塞州波士顿附近所说的)邪恶的缓慢。
在这种情况下,您需要使用边界框计算。请参阅此文章以了解有关操作方法。
http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-
loc/
该公式包含一个LEAST()
函数。为什么?因为如果ACOS()
函数的html" target="_blank">参数甚至稍大于1,该函数就会引发错误。当所讨论的两个点非常靠近时,由于浮点epsilon(不准确,带有COS()
和SIN()
计算的表达式有时会产生略大于1的值)。)。该呼叫与问题对应。LEAST(1.0, dirty-great-expression)
有一个更好的办法,一个公式通过撒迪厄斯·文森。它使用ATAN2()
而不是ACOS()
这样,因此不易受到epsilon问题的影响。
问题内容: 目前,我在mysql数据库中的位置不足一百万,所有位置都包含经度和纬度信息。 我试图通过查询找到一个点和许多其他点之间的距离。它并没有我想要的那么快,尤其是每秒100次以上的命中。 是否有更快的查询,或者可能是比mysql更快的系统?我正在使用此查询: 注意:提供的距离以 英里为单位 。如果您需要 公里 ,请使用代替。 问题答案: 使用表中数据类型的值创建点。从Mysql 5.7.5开
问题内容: 我希望能够估算两个(纬度,经度)点之间的距离。我想下冲,因为这将用于A 图形搜索,并且我希望它能 快速* 。这些点最多相距800公里。 问题答案: Python中Haversine公式的答案(两个GPS点之间的轴承和距离)提供了可以回答您问题的Python实现。 使用下面的实现,我在一台旧笔记本电脑上 不到1秒的 时间内 执行了100,000次迭代 。我认为对于您来说,这应该足够了。但
问题内容: 在询问具体的代码示例之前,我只想问一下是否可以进行类似此伪代码的查询: 从表中选择项目,其中经度/经度=-在某个经度/经度点的x英里内- 那可行吗?还是我必须跳过一些箍?可以推荐的任何好的方法都很棒! 问题答案: 您应该搜索Haversine公式,但是一个好的开始可能是: 使用PHP,MySQL和Google Maps创建商店定位器 -请参见“使用MySQL查找位置”部分 使用MySQ
我有一对纬度 然而,我需要一个更灵活的解决方案,例如,我希望能够指定1/3, 1/4, 8/9等对点之间。 注:lat1,long1
问题内容: 这是我的尝试,这只是我的代码的一部分: 我正在使用以下公式来获取经度和纬度: 问题答案: 上面Dommer给出的Java代码给出的结果略有不正确,但是如果你正在处理GPS轨迹,则小错误加起来。这是Java中Haversine方法的实现,该方法还考虑了两点之间的高度差。
问题内容: 我正在使用以下sql代码来找出最接近设置坐标的“所有” poi,但是我想找出特定的poi而不是所有的poi。当我尝试使用where子句时,我得到一个错误,它不起作用,这是我目前遇到的问题,因为我只使用一张表来表示所有poi的所有坐标。 问题答案: 问题是您不能在or子句中引用别名列(在这种情况下)。例如,您不能执行以下操作: 这将在以下两个方面均失败:尝试处理时的语句以及尝试处理时的语