2017-02-20 11 views
1

Я пытаюсь создать представление или таблицу, где многоугольники, созданные из точечных буферов, и группировать все полигоны в зависимости от года. Поле данных из исходной таблицы:Создание буферов postgis таблицы из точек с использованием фильтра даты

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 

Я был в состоянии создать таблицу, в которой я сгруппированную все точки по годам и генерируемую буфер, как MultiPolygon но то, что мне нужно, чтобы сгруппировать точки на основе даты между годами (группа более чем один год пункты вместе), так что таблица должна выглядеть следующим образом:

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) 

Script I, использую прямо сейчас:

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; 

Любая помощь приветствуется.

ответ

0

Если я вас правильно понимаю что вам нужно что-то вроде этого:

--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 столбец агрегировать точек.

+0

На самом деле я попробовал это также, но проблема в том, что его не группировка всех точек между диапазон дат, но все еще только один год точек, выборки: при Т .date BETWEEN '2014-01-01' AND '2015-12-31' THEN 2015 дайте мне результат, где все точки с даты 2015-01-01 по 2015-12-31, но мне нужны все предыдущие годы до дата 2015-12-31. – Kajar

+0

Извините, мой ответ был неправильным, я обновил его. CASE ... КОГДА всегда останавливается в первом матче. – banazs

0

Мне пришлось немного изменить этот сценарий, потому что дата точки находится между 1994 годом и текущей датой, поэтому я изменил значение образца «2014-12-31» на 2013-12-31 и «2019-12-31» на текущая дата. Кажется, сейчас работает, спасибо. У меня есть 13000 очков и занимает 173msec создать таблицу, используя этот запрос:

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; 
+0

Добро пожаловать, я рад, что это сработало! – banazs