gpt4 book ai didi

mysql - 查找两个纬度/经度点之间距离的最快方法

转载 作者:IT老高 更新时间:2023-10-28 12:48:33 31 4
gpt4 key购买 nike

我目前在 mysql 数据库中只有不到一百万个位置,所有位置都包含经度和纬度信息。

我试图通过查询找到一个点与许多其他点之间的距离。它没有我想要的那么快,尤其是每秒点击 100 次以上。

除了 mysql 之外,是否有更快的查询或更快的系统?我正在使用这个查询:

SELECT 
name,
( 3959 * acos( cos( radians(42.290763) ) * cos( radians( locations.lat ) )
* cos( radians(locations.lng) - radians(-71.35368)) + sin(radians(42.290763))
* sin( radians(locations.lat)))) AS distance
FROM locations
WHERE active = 1
HAVING distance < 10
ORDER BY distance;

注意:提供的距离以 英里 为单位。如果您需要公里,请使用 6371 而不是 3959

最佳答案

  • 使用 MyISAM 表中 Geometry 数据类型的 Point 值创建您的点。 As of Mysql 5.7.5, InnoDB tables now also support SPATIAL indices.

  • 在这些点上创建一个SPATIAL索引

  • 使用 MBRContains() 查找值:

      SELECT  *
    FROM table
    WHERE MBRContains(LineFromText(CONCAT(
    '('
    , @lon + 10 / ( 111.1 / cos(RADIANS(@lat)))
    , ' '
    , @lat + 10 / 111.1
    , ','
    , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
    , ' '
    , @lat - 10 / 111.1
    , ')' )
    ,mypoint)

,或者,在 MySQL 5.1 及更高版本中:

    SELECT  *
FROM table
WHERE MBRContains
(
LineString
(
Point (
@lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
@lat + 10 / 111.1
),
Point (
@lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
@lat - 10 / 111.1
)
),
mypoint
)

这将选择框内的所有点 (@lat +/- 10 km, @lon +/- 10km)

这实际上不是一个盒子,而是一个球面矩形:球体的经纬线段。这可能与 弗朗茨约瑟夫地 上的普通矩形不同,但在大多数有人居住的地方都非常接近。

  • 应用额外的过滤来选择圆圈内的所有内容(不是正方形)

  • 可能应用额外的精细过滤来解决大圆距离(对于大距离)

关于mysql - 查找两个纬度/经度点之间距离的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006654/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com