从质心、宽度和距离创建边界框的最佳方法?

Posted

技术标签:

【中文标题】从质心、宽度和距离创建边界框的最佳方法?【英文标题】:Best way to create a bounding box from a centroid, a width, and a distance? 【发布时间】:2021-10-28 18:18:49 【问题描述】:

我有一个操作的质心,操作的宽度(假设在两侧)和操作的距离。用这些数据在 Postgres 中制作边界框的最有效方法是什么?

例如:

我假设的质心是 0,0。手术室每边宽 4 英尺。该操作也是50英尺长。根据这些数据创建边界框的最佳方法是什么?

【问题讨论】:

【参考方案1】:

假设您的假设坐标对在以英尺为单位的空间参考系统中编码,例如NAD83,您只需创建一个 4 英尺缓冲区并使用ST_EnvelopeST_Extent 计算其 BBOX:

SELECT ST_Envelope(ST_Buffer('SRID=[YOUR-SRS];POINT (0 0)',4));
SELECT ST_Extent(ST_Buffer('SRID=[YOUR-SRS];POINT (0 0)',4));

另一种选择是使用geography 数据类型(metre 作为单位)来创建缓冲区,然后再次将其转换为 geometry 以创建 BBOX,例如

SELECT ST_Envelope(ST_Buffer('POINT (0 0)'::geography,4*3.2808)::geometry)

您也可以使用ST_Project 手动定义角点并使用ST_MakeBox2D 创建您的BBOX:

SELECT 
  ST_MakeBox2D(
   ST_Project('POINT(0 0)'::geography,4*3.2808,radians(225.0))::geometry, 
   ST_Project('POINT(0 0)'::geography,4*3.2808,radians(45.0))::geometry
  )::geometry 

演示:db<>fiddle

WITH j (poi) AS (VALUES ('POINT(-4.50 54.15)'::geography))
-- 1. a random point, e.g. from ST_Centroid.
SELECT poi::geometry FROM j
UNION
-- 2. a 4ft buffer around the point of query 1
SELECT ST_Buffer(poi,4*3.2808) FROM j
UNION
-- 3. an envelope over the buffer created in query 2 (outer bbox)
SELECT ST_Envelope(ST_Buffer(poi,4*3.2808)::geometry) FROM j
UNION
-- 4. Inner bbox created based on a lower left (azimuth 225°) 
-- and a up right (azimuth 45°) corner 4ft away from the POI.
SELECT 
  ST_MakeBox2D(
   ST_Project(poi,4*3.2808,radians(225.0))::geometry, 
   ST_Project(poi,4*3.2808,radians(45.0))::geometry
  )::geometry 
FROM j;

进一步阅读:

Buffers in PostGIS Caculate point 50 miles away (North, 45% NE, 45% SW) Increase the BBOX size but keep the ratio (Lon/Lat)

【讨论】:

缓冲区会围绕我的点建立一个正方形,不是吗?而不是距离和宽度不同的矩形 @NicholasLawrence 不,缓冲区是一个圆圈。我在答案中添加了一个示例,可能会使事情更清楚。

以上是关于从质心、宽度和距离创建边界框的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

在轮廓JavaCV周围绘制边界框?

d3 墨卡托地理边界到像素边界

从旋转的矩形计算边界框坐标

CSS盒模型深入理解

从 CLLocationCoordinate2D 中找到边界框

如何创建边界框并将文本放入其中?