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

目前,我在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

回答:

  • 使用表PointGeometry数据类型的值创建点MyISAM。从Mysql 5.7.5开始,表现在InnoDB还支持SPATIAL索引。

  • SPATIAL在这些点上创建索引

  • 使用MBRContains()查找值:

    SELECT  *

    FROM table

    WHERE MBRContains(LineFromText(CONCAT(

    ‘(‘

    , @lon + 10 / ( 111.1 / cos(RADIANS(@lon)))

    , ‘ ‘

    , @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)

实际上,这不是一个盒子,而是一个球形矩形:球体的经度和纬度绑定段。这可能与

上的普通矩形不同,但在大多数人居住的地方都非常接近矩形。

  • 应用其他过滤以选择圆内的所有内容(而不是正方形)

  • 可能应用其他精细过滤以解决大圆距离(对于大距离)

以上是 查找两个纬度/经度点之间距离的最快方法 的全部内容, 来源链接: utcz.com/qa/411972.html

回到顶部