【问题标题】:How to get bbox of grouped geometries using postgis queries?如何使用 postgis 查询获取分组几何的 bbox?
【发布时间】:2023-03-30 20:23:01
【问题描述】:

我的 postgresql 表中有一个积分表。

CREATE TABLE my_points(
    gid serial PRIMARY KEY,
    created_on TIMESTAMP NOT NULL,
    geog geography(POINTZ,4326) 
);

所以我想获得按 created_on 分组的更新数据的有界框。今天更新的数据是不同的位置。

比如表格数据是这样的:

 gid      created_on             geog
 ------------------------------------
 1        08/15/2021 10:38:11    (1,2)
 2        08/15/2021 10:38:11    (2,2)
 3        08/15/2021 10:38:11    (3,2)
 4        08/15/2021 11:12:04    (1,2)
 5        08/15/2021 11:12:04    (2,4)

在此表中,按日期分为两组。 08/15/2021 10:38:11 的 ID 为 (1,2,3) 和 08/15/2021 11:12:04 的 ID 为 (4,5

所以我需要对两个有界框进行选择查询,以便按 created_on 日期分组。

我需要一个 seelct 查询来查找蓝色方形 geoemtries。

如何选择?

【问题讨论】:

  • 我可能是错的,但我认为你真的不需要这样做,像 Qgis 这样的可视化工具会为你绘制至少 2 个点的正方形
  • @eshirvana,我将在网络或其他环境中使用此框。

标签: sql postgresql postgis extent


【解决方案1】:

使用ST_UnionGROUP BY 创建一个点簇,然后使用ST_EnvelopeST_Extent 绘制边界框:

ST_信封

以几何形式返回所提供几何的最小边界框:

SELECT 
  ST_Envelope(
    ST_Union(geog::geometry)) 
FROM my_points
GROUP BY created_on;

ST_Extent

检索给定几何图形或几何图形组的 BBOX:

WITH j (created_on,geog) AS (
  SELECT 
    created_on, ST_Union(geog::geometry)
  FROM my_points
  GROUP BY created_on
)
SELECT ST_Extent(geog) FROM j
GROUP BY created_on;

演示:db<>fiddle

CREATE TABLE my_points(
    gid serial PRIMARY KEY,
    created_on TIMESTAMP NOT NULL,
    geog geography(POINT,4326)
);

INSERT INTO my_points VALUES
(1,'2021-08-15 10:38:11','SRID=4326;POINT(-4.481927586167595 54.32254424440715)'),
(2,'2021-08-15 10:38:11','SRID=4326;POINT(-4.44759531077697 54.28408149183809)'),
(3,'2021-08-15 10:38:11','SRID=4326;POINT(-4.563638401597283 54.29169676415854)'),
(4,'2021-08-15 11:12:04','SRID=4326;POINT(-4.52449960765197 54.23234056232733)'),
(5,'2021-08-15 11:12:04','SRID=4326;POINT(-4.478494358628533 54.1893743942604)');

结果:

WITH j (created_on,geog) AS (
  SELECT 
    created_on, ST_Union(geog::geometry)
  FROM my_points
  GROUP BY created_on
)
SELECT ST_Extent(geog) FROM j
GROUP BY created_on;
                                   st_extent                                   
-------------------------------------------------------------------------------
 BOX(-4.563638401597283 54.28408149183809,-4.44759531077697 54.32254424440715)
 BOX(-4.52449960765197 54.1893743942604,-4.478494358628533 54.23234056232733)

【讨论】:

  • 这可行,但如果组有 2 个点,则返回 LINESTRING。如果 group 有 3 个或更多,ite 返回 Polygon。我想总是从组中返回一个 bbox。
猜你喜欢
  • 2015-05-24
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
相关资源
最近更新 更多