【发布时间】:2021-10-28 18:18:49
【问题描述】:
我有一个操作的质心,操作的宽度(假设在两侧)和操作的距离。用这些数据在 Postgres 中制作边界框的最有效方法是什么?
例如:
我假设的质心是 0,0。手术室每边宽 4 英尺。该操作也是50英尺长。根据这些数据创建边界框的最佳方法是什么?
【问题讨论】:
标签: sql postgresql postgis geospatial bounding-box
我有一个操作的质心,操作的宽度(假设在两侧)和操作的距离。用这些数据在 Postgres 中制作边界框的最有效方法是什么?
例如:
我假设的质心是 0,0。手术室每边宽 4 英尺。该操作也是50英尺长。根据这些数据创建边界框的最佳方法是什么?
【问题讨论】:
标签: sql postgresql postgis geospatial bounding-box
假设您的假设坐标对在以英尺为单位的空间参考系统中编码,例如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
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;
进一步阅读:
【讨论】: