0

在将点分组为线后,我想保留一些关于组的信息。

我的数据。

点表(点按分段分组,按帧分段,按时间排序)

我有以下 SQL 查询来创建按帧分组的点的新表:

-- Create frames from points

CREATE TABLE data.greenland_2011_p3_frames
(frm_id serial PRIMARY KEY,
geom GEOMETRY (LineString,3413));

INSERT INTO data.greenland_2011_p3_segs(geom) 

SELECT ST_MakeLine(geom) as point_geom 
FROM (SELECT * FROM data.greenland_2011_p3 ORDER BY time) a GROUP BY frame;

我想在新表中保留帧值和段值(来自原始表)

所以新表的形式为:

frm_id      geom       frame   segment
1        linestring    ######   ######
2        linestring    ######   ######
3        linestring    ######   ######
...          ...         ...      ...

这是一个示例框架/段

SEGMENT = 2011031614  (YYYYMMDD(SEG))  ***segment 14

FRAME = 2011031614001  or 2011031614002 (YYYYMMDD(SEG)(FRM))   ***segment 14 frames 1 and 2

编辑:

我想为此添加第二步。使用 Mike 的解决方案,我现在有一个包含以下内容的表格:

frm_id      geom       frame   segment
1        linestring   *14001    *14
2        linestring   *14002    *14
3        linestring   *14003    *14
4        linestring   *15001    *15
5        linestring   *15002    *15
....

我现在想创建这样的东西:

seg_id      geom      segment         frames
1        linestring     *14    <*14001,*14002,*14003>
2        linestring     *14       <*15001,*15002>
....

如何实现?

4

1 回答 1

1

假设你有一个点几何、帧、段和时间的主表:

create table greenland_2011_p3 (
  gid serial primary key,
  geom geometry(Point,3413),
  frame integer,
  segment integer,
  time timestamp
);
insert into greenland_2011_p3(geom, frame, segment, time)
values
('SRID=3413;POINT(0 0)', 10, 20, '2011-08-03 10:30'),
('SRID=3413;POINT(0 1)', 10, 20, '2011-08-03 10:32'),
('SRID=3413;POINT(1 1)', 12, 20, '2011-08-03 10:35'),
('SRID=3413;POINT(1 0)', 12, 20, '2011-08-03 10:38');

您可以在 select 语句中编写一个具有“ORDER BY”的聚合,并确定需要为结果分组哪些其他列:

SELECT ST_MakeLine(geom ORDER BY time) AS geom, frame, segment
FROM greenland_2011_p3
GROUP BY frame, segment;

或者,如果要将所有帧作为字符串列出,可以使用string_agg aggagrate 函数:

SELECT ST_MakeLine(geom ORDER BY time) AS geom, segment,
    '<' || array_agg(DISTINCT frame::text, ',') || '>' AS frames
FROM greenland_2011_p3
GROUP BY segment;

array_agg如果您想要一个用于其他目的的数组对象,还有一个函数。

于 2012-10-11T00:24:14.567 回答