【问题标题】: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英尺长。根据这些数据创建边界框的最佳方法是什么?

【问题讨论】:

    标签: sql postgresql postgis geospatial bounding-box


    【解决方案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;
    

    进一步阅读:

    【讨论】:

    • 缓冲区会围绕我的点建立一个正方形,不是吗?而不是距离和宽度不同的矩形
    • @NicholasLawrence 不,缓冲区是一个圆圈。我在答案中添加了一个示例,可能会使事情更清楚。
    猜你喜欢
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多