2017-02-20 3 views
1

Ich, m versuche, Ansicht oder Tabelle zu erstellen, wo Polygone aus Punktpuffern generiert werden und gruppieren alle Polygone basierend auf Jahr. Datenfelder aus der Quellentabelle:Puffer erstellen Postgis-Tabelle von Punkten mit Datumsfilter

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 

Ich konnte Tabelle erstellen, wo ich alle Punkte nach Jahr gruppiert und erzeugt als Multipolygon Puffer, aber was ich brauche, ist zu einer Gruppe Punkt basierend auf dem Datum zwischen den Jahren (Gruppe mehr als eine Jahr Punkte zusammen) muss so Tabelle wie folgt aussehen:

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, m jetzt mit:

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; 

Jede Hilfe ist willkommen.

Antwort

0

Wenn ich Sie richtig verstehen müssen Sie etwas wie folgt aus:

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

Jetzt können Sie die years Spalte verwenden, um die Punkte zu aggregieren.

+0

Eigentlich habe ich versucht, es auch, aber Problem ist, dass sie nicht alle Punkte zwischen Datumsbereich Gruppierung, aber immer noch nur ein Jahr Punkten, Beispiel: WENN t .date ZWISCHEN '2014-01-01' UND '2015-12-31' DANN 2015 gib mir Ergebnis, wo sind alle Punkte vom Datum 2015-01-01 bis 2015-12-31, aber ich brauche alle Vorjahrespunkte bis das Datum 2015-12-31. – Kajar

+0

Sorry meine Antwort war nicht korrekt, ich habe es aktualisiert. Der CASE ... WANN stoppt immer beim ersten Match. – banazs

0

Ich musste dieses Skript ein wenig ändern, da die Datumsangaben zwischen 1994 und dem aktuellen Datum liegen, also habe ich den Beispielwert '2014-12-31' auf 2013-12-31 und '2019-12-31' auf geändert aktuelles Datum. Es scheint jetzt zu funktionieren, danke. Ich habe 13000 Punkte, und es dauert 173msec Tabelle mit dieser Abfrage zu erstellen:

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

Willkommen, ich bin froh, dass es funktioniert hat! – banazs

Verwandte Themen