mysql - 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"
但我仍然不知道如何围绕一个点生成一个圆形多边形。
解决方案
如果目标是在某个点的距离内找到点,则不需要圆形多边形。空间索引使用边界矩形,因此您不会使用更好的圆形近似来获得更好的索引。
与其尝试制作一个圆形多边形,不如制作一个包含内部圆圈的矩形。点(x,y)的矩形点将像x-r y-r, x+r y-r, x+r y+r, x-r y+r
然后使用空间索引(带 eg MBRContains
)得到候选点(快),然后使用距离计算过滤掉边界矩形内但不在圆内的点(慢,但只针对少数候选点) )。
检查此答案以获取更多详细信息。
推荐阅读
- c - 为什么这个程序在释放时会崩溃?
- r - 计算每个变量的唯一真/假
- javascript - pdf没有嵌入到html IE11中
- r - 引用该函数 list() 之外的另一个对象的值的最佳实践是什么
- python - 用于 32 位 Oracle 的 Python
- nginx - 如何设置让加密证书到 nginx
- xamarin - Xamarin iOS 代码将视频从相机保存到相册
- python - Anaconda 在离线系统上安装:“UID:未定义变量”
- node.js - 在 node.js 中调用 childprocess.spawn 后如何获取计算的命令行代码?
- python - RuntimeWarning:在 double_scalars h[i]=(delta_tau*((sigma*x[i])**2))/(s*h[i-1]-delta_tau*r*h[i-1] 中遇到无效值)