【问题标题】:Create buffers postgis table from points using date filter使用日期过滤器从点创建缓冲区 postgis 表
【发布时间】:2017-02-22 04:33:51
【问题描述】:

我正在尝试创建从点缓冲区生成的多边形的视图或表格,并根据年份对所有多边形进行分组。 源表中的数据字段:

point_id(int), point_created(date), geom geometry(Point,3301)
    1, 2014-05-09, point
    2, 2015-01-01, point
    2, 2015-02-05, point
    3, 2016-02-05, point
    4, 2017-02-10, point

我能够创建表,在该表中按年份对所有点进行分组并将缓冲区生成为多面体,但我需要根据年份之间的日期对点进行分组(将超过一年的点组合在一起),因此表必须如下所示:

polygon(geom), nr_of_features(int), year(string)
 1, 1, 2014(all point from 2014)   
 2, 3, 2015(all points from 2014 to 2015)
 3, 4, 2016(all points from 2014 to 2016)
 4, 5, 2017(all points from 2014 to 2017)

我现在正在使用的脚本:

CREATE TABLE my_new_table as 
SELECT ST_Union(ST_Buffer(geom,10))::geometry(MultiPolygon,3301) as polygon,count(point_id)::integer as nr_of_features,
extract(year from point_created) as year
FROM my_table
group by year;

欢迎任何帮助。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    如果我理解正确,你需要这样的东西:

    --just for create few years
    WITH RECURSIVE dates AS (
        SELECT '2014-12-31'::timestamp years
        UNION ALL
        SELECT years + interval '1 year' FROM dates WHERE years < '2019-12-31'
    )
    
    SELECT
        EXTRACT(YEAR FROM d.years) years,
        p.*
    FROM 
        points p
    INNER JOIN
        dates d ON p.date <= d.years
    ;
    

    现在您可以使用years 列来聚合积分。

    【讨论】:

    • 其实我也试过了,但问题是它没有对日期范围之间的所有点进行分组,但仍然只有一年的点,示例:WHEN t.date BETWEEN '2014-01-01' AND '2015 -12-31' THEN 2015 给我结果,从 2015-01-01 到 2015-12-31 的所有点都在哪里,但我需要到 2015-12-31 为止的所有前一年点。
    • 抱歉我的回答不正确,我更新了。 CASE...WHEN 总是在第一场比赛停止。
    【解决方案2】:

    我不得不稍微修改这个脚本,因为点日期介于 1994 年和当前日期之间,所以我将样本值“2014-12-31”更改为 2013-12-31 并将“2019-12-31”更改为 current_date .现在看来可以用了,谢谢。我有 13000 个点,使用此查询创建表需要 173 毫秒:

    WITH RECURSIVE dates AS (
        SELECT '1993-12-31'::timestamp years
        UNION ALL
        SELECT years + interval '1 year' FROM dates WHERE years < current_date
    )
    
    SELECT
        EXTRACT(YEAR FROM d.years) years,
        ST_Multi(ST_Collect(geom))::geometry(MultiPoint,3301) as polygon, count(years)::int as nr_features
    FROM 
        my_table p
    INNER JOIN
        dates d ON p.point_created <= d.years
       group by years
       order by years asc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多