从质心、宽度和距离创建边界框的最佳方法?
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_Envelope
或ST_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 不,缓冲区是一个圆圈。我在答案中添加了一个示例,可能会使事情更清楚。以上是关于从质心、宽度和距离创建边界框的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章