确定最小边界圆的半径或直径

Determining the radius or diameter of a Minimum Bounding Circle

如果我的 MBC 类似于以下查询:

SELECT ST_AsText(ST_MinimumBoundingCircle(geom)::geometry) AS Circle
FROM "Regions"

我想知道如何轻松确定它的半径。我求助于找到圆的质心,此时我可以尝试计算 MBC 返回的多边形中的一个点与质心之间的距离,但是我似乎无法从多边形中只获取一个顶点。

谢谢。

ST_MinimumBoundingCircle是用户贡献的函数,源码写在PL/pgSQL。您可以 modify the source 作为重命名函数 ST_MinimumBoundingRadius(inputgeom geometry) 并进行以下修改:

  • 只需要一个参数inputgeom geometry
  • 将 return 类型(靠近顶部)从 geometry 更改为 double precision
  • 对于 POINT 类型,将 RETURN hull; 更改为 RETURN 0;
  • 删除接近末尾的 ST_Buffer 语句,只 return radius.

应该很容易。请注意该算法存在一些问题,例如 ticket #2996.

我设计了一个简单但可能不是很有效的解决方案。就我的目的而言,它运行良好。

SELECT
    ROUND(
        ST_Distance_Sphere(
            ST_Centroid(ST_MinimumBoundingCircle(geom)),
            ST_PointN(ST_Boundary(ST_MinimumBoundingCircle(geom)), 1)
        ) / 1000
    ) AS radius,
    ST_AsGeoJSON(ST_Centroid(geom)) AS center
FROM
    "Regions"

结果最终是一个以公里为单位的半径和质心。