首页 > 解决方案 > MySQL 8.0:将多边形创建为围绕点的圆

问题描述

我想在 MySQL 中的定义点周围生成一个半径为 10 公里的圆的多边形(没有 PHP 或其他编程语言)。该点以经纬度地理坐标的形式提供,例如曼谷市的“100.8160803 13.7538929”,SRID 为 4326。

多边形不必是完美的圆形,六边形或八边形也可以。

尝试使用ST_Buffer但这不起作用,因为它无法处理 SRID(当然,除了 SRID 0)。

我发现了许多关于如何在某个点周围定位某个半径内的点的教程/查询,例如:MySQL - Find points within radius from database

这是此类查询的代码:

SELECT id, 
( 6371 * 
    ACOS( 
        COS( RADIANS( db_latitude ) ) * 
        COS( RADIANS( $user_latitude ) ) * 
        COS( RADIANS( $user_longitude ) - 
        RADIANS( db_longitude ) ) + 
        SIN( RADIANS( db_latitude ) ) * 
        SIN( RADIANS( $user_latitude) ) 
    ) 
) 
AS distance FROM the_table HAVING distance <= $the_radius ORDER BY distance ASC"

但我仍然不知道如何围绕一个点生成一个圆形多边形

标签: mysqlgeometrygeospatial

解决方案


如果目标是在某个点的距离内找到点,则不需要圆形多边形。空间索引使用边界矩形,因此您不会使用更好的圆形近似来获得更好的索引。

与其尝试制作一个圆形多边形,不如制作一个包含内部圆圈的矩形。点(x,y)的矩形点将像x-r y-r, x+r y-r, x+r y+r, x-r y+r

然后使用空间索引(带 eg MBRContains)得到候选点(快),然后使用距离计算过滤掉边界矩形内但不在圆内的点(慢,但只针对少数候选点) )。

检查答案以获取更多详细信息。


推荐阅读