繁体   English   中英

如何通过两列聚合多个点并从中创建一个LineString / MultiLineString

[英]How to aggregate multiple points by two columns and create a LineString / MultiLineString out of them

我有一个名为locations的表,其中包含以下行:

id uuid NOT NULL,
"deviceId" text COLLATE pg_catalog."default",
"userId" uuid,
"userName" text COLLATE pg_catalog."default",
"creationDateTime" timestamp with time zone,
shape geometry,
CONSTRAINT id PRIMARY KEY (id)

想象一下,我的用户每小时将点数注册到该表的shape列中。当注册该点的时间并注册到表中时,将其保存到creationDateTime列中,如下所示: 2018-08-22 00:03:41.649+04:30

我如何提取此信息:

each User ---- each day ---- list of geometry(shape column)例如each User ---- each day ---- list of geometry(shape column)

第一天的User1包含几何点列表。 第二天的User1包含几何点列表等等。

我通过mongo对同一项目进行了此查询:

{$project: {
    _id: 0,
    uId : "$UserId",
    dId : "$DeviceId",
    ts :"$CreationDateTime",
    point : "$Point"
    }
 }, 
{$group: {
    _id :{
        did: "$dId",
        day: { $dayOfMonth: "$ts" }
    },
    docs: { $push: "$$ROOT" }
     }
 },

 {
    $sort:{"_id.day": -1}
 }

但是我怎么用postgresql做到这一点? 在postgre上不存在这种聚合,而在postgresql上我是新来的。 这是我的查询:

(Select test1."deviceId",test1."shape", test1."creationDateTime" From   
    (Select * from locations) as test1 Group By test1."deviceId",test1."shape",test1."creationDateTime"
ORDER BY  test1."creationDateTime")

此查询不适合结果,我知道此查询有问题。 用户的deviceId经常与其他行重复出现。我该如何处理?

最后,我想为per user - per day - multi poly line创建多折线per user - per day - multi poly line

可能有上百万种方法可以回答这个问题。 这是其中之一:

考虑你的表结构..

CREATE TEMPORARY TABLE locations
(id uuid,
deviceId text COLLATE pg_catalog."default",
userId uuid,
userName text COLLATE pg_catalog."default",
creationDateTime timestamp with time zone,
shape geometry);

..以及这些样本数据..

INSERT INTO locations (userId, creationDateTime, shape) 
VALUES ('d1166a84-ab66-11e8-98d0-529269fb1459',CURRENT_DATE,'POINT(-1.25 51.75)'),
       ('d1166a84-ab66-11e8-98d0-529269fb1459',CURRENT_DATE,'POINT(-1.15 52.96)'),
       ('d1166a84-ab66-11e8-98d0-529269fb1459',CURRENT_DATE,'POINT(-0.13 50.82)'),
       ('d1166a84-ab66-11e8-98d0-529269fb1459',CURRENT_DATE-1,'POINT(-2.22 53.48)'),
       ('d1166a84-ab66-11e8-98d0-529269fb1459',CURRENT_DATE-1,'POINT(-0.11 51.51)');

..您可以汇总每个用户+日期的积分,并使用ST_MakeLineGROUP BY创建LINESTRING

SELECT userId, creationDateTime, ST_AsText(ST_MakeLine(shape))
FROM locations
GROUP BY userId, creationDateTime
ORDER BY  creationDateTime;

                userid                |    creationdatetime    |                    st_astext                    
--------------------------------------+------------------------+-------------------------------------------------
 d1166a84-ab66-11e8-98d0-529269fb1459 | 2018-08-28 00:00:00+02 | LINESTRING(-2.22 53.48,-0.11 51.51)
 d1166a84-ab66-11e8-98d0-529269fb1459 | 2018-08-29 00:00:00+02 | LINESTRING(-1.25 51.75,-1.15 52.96,-0.13 50.82)
(2 Zeilen)

用户d1166a84-ab66-11e8-98d0-529269fb14592018-08-28 00:00:00+02图形化显示 在此处输入图片说明

您可以通过相同的方式使用ST_Collect创建MULTIPOINT

SELECT userId, creationDateTime, ST_AsText(ST_Collect(shape))
FROM locations
GROUP BY userId, creationDateTime
ORDER BY  creationDateTime;

                userid                |    creationdatetime    |                    st_astext                    
--------------------------------------+------------------------+-------------------------------------------------
 d1166a84-ab66-11e8-98d0-529269fb1459 | 2018-08-28 00:00:00+02 | MULTIPOINT(-2.22 53.48,-0.11 51.51)
 d1166a84-ab66-11e8-98d0-529269fb1459 | 2018-08-29 00:00:00+02 | MULTIPOINT(-1.25 51.75,-1.15 52.96,-0.13 50.82)
(2 Zeilen)

在此处输入图片说明

编辑 -使用CTE (又称为WITH子句)为每个用户每天创建一组LINESTRINGSMULTILINESTRING ):

WITH j AS (
  SELECT userId, creationDateTime, ST_MakeLine(shape) AS shape
  FROM locations
  GROUP BY userId, creationDateTime)
SELECT userId, ST_AsText(ST_Collect(shape))
FROM j
GROUP BY userId

                userid                |                                    st_astext                                     
--------------------------------------+----------------------------------------------------------------------------------
 d1166a84-ab66-11e8-98d0-529269fb1459 | MULTILINESTRING((-2.22 53.48,-0.11 51.51),(-1.25 51.75,-1.15 52.96,-0.13 50.82))
(1 

在此处输入图片说明

基本上,您要做的是将所需的记录(在这种情况下为用户和日期)进行分组,并使用您选择的聚合函数,例如ST_MergeLineST_CollectST_UnionST_Multi等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM