确定最小边界圆的半径或直径
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"
结果最终是一个以公里为单位的半径和质心。
如果我的 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
语句,只 returnradius
.
应该很容易。请注意该算法存在一些问题,例如 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"
结果最终是一个以公里为单位的半径和质心。