开发者社区> 问答> 正文

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

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

展开
收起
保持可爱mmm 2020-05-08 11:13:14 454 0
1 条回答
写回答
取消 提交回答
  • 使用表Point中Geometry数据类型的值创建点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)。

    实际上,这不是一个盒子,而是一个球形矩形:球体的经度和纬度绑定段。这可能与弗朗兹·约瑟夫(Franz Joseph Land)上的普通矩形不同,但在大多数人居住的地方都非常接近矩形。

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

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

    2020-05-08 11:13:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载