Ich habe gerade angefangen, mit räumlichen Datenbanken zu arbeiten, und möchte eine SQL-Abfrage (PostGIS) zur automatischen Verallgemeinerung von rohen GPS-Tracks (mit fester Tracking-Frequenz) schreiben. Das erste, woran ich arbeite, ist eine Abfrage, die Stillstandspunkte in Form einer Abfrage wie "x Punkte in einem Abstand von y Metern" identifiziert, um massive Punktwolken durch repräsentative Punkte zu ersetzen. Ich habe bereits erkannt, dass ich Punkte innerhalb einer bestimmten Entfernung fangen und die gerissenen zählen muss. Im Bild unten sehen Sie eine rohe Beispielspur (kleine schwarze Punkte) und die Zentren der Fangpunkte als farbige Kreise (Größe = Anzahl der Fangpunkte).
CREATE table simplified AS
SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
FROM raw
GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
ORDER BY count(raw.geom) DESC;
Ich wäre mit dieser Lösung genauso zufrieden, aber es gibt das Zeitproblem: Stellen Sie sich die Strecke als Ganztagesstrecke in einer Stadt vor, in der die Person zu bereits zuvor besuchten Orten zurückkehren kann. In meinem Beispiel repräsentiert der dunkelblaue Kreis das Haus der Person, die sie zweimal besucht hat, aber meine Anfrage ignoriert das natürlich.
In diesem Fall sollte die anspruchsvolle Abfrage nur Punkte mit zusammenhängenden Zeitstempeln (oder IDs) sammeln, damit hier zwei repräsentative Punkte erzeugt werden. Meine erste Idee war eine Änderung meiner Abfrage auf eine 3D-Version (Zeit als dritte Dimension), aber es scheint nicht zu funktionieren.
Hat jemand einen Rat für mich? Ich hoffe, dass meine Frage klar ist.
Danke für die Line-Idee. Ich habe festgestellt, dass ich einen Linestring erstellen und vereinfachen muss, wie Sie im folgenden Screenshot sehen können (Punkte sind Originalpunkte). Was ich noch brauche, ist die Bestimmung der Ruheplätze (> x Punkte in <x Metern Radius), idealerweise als ein Punkt mit einer Ankunfts- und einer Abfahrtszeit ... irgendwelche anderen Ideen?
Antworten:
Wenn Sie wirklich alle Punkte für die Visualisierung benötigen, können Sie eine Linie erstellen und st_simplify (dies ist die Implementierung von Douglas Peucker) würde die Arbeit ganz gut erledigen.
In einigen Fällen müssen Sie nicht einmal alle Punkte speichern, sodass Sie vor dem Speichern von Punktdaten filtern können. Wenn sich das Motiv nicht bewegt, speichern Sie es nicht. Sie können DouglasPeucker oder einen anderen Grundfilter anwenden, bevor Sie der DB Punkte hinzufügen. Einige GPS-Anbieter (wie die Android Location API) können die anfängliche Filterung basierend auf Zeit und Mindestentfernung automatisch durchführen. In einigen Fällen behalten Sie doppelte Daten bei: vorgefiltert für schnelle Visualisierungen und vollständiges Protokoll für das Archiv. Einfache Lagerung ist heutzutage ziemlich billig.
quelle
Inzwischen habe ich eine Lösung für mein Problem gefunden:
Zuerst habe ich für jeden Punkt einen "Entfernungstyp" bestimmt. Wenn der Punkt näher als x Meter am nächsten Punkt liegt, wird er als "Stopp", andernfalls als "Bewegen" bestimmt. Dann habe ich eine Fensterfunktion wie folgt gestartet:
Die resultierende Tabelle sieht wie folgt aus:
Der einfache nächste Schritt gruppiert die "Stopp" -Punkte, identifiziert den Schwerpunkt dieser Punktgruppen und verwendet minimale und maximale Zeitstempel als Ankunfts- und Abfahrtszeit.
quelle