Riesige Punktwolkenlaserdaten in PostGIS - Speichern und Verarbeiten

14

Ich frage mich, wie es möglich ist, riesige Mengen von lasergescannten Punktwolkendaten in PostGIS zu speichern, unter Berücksichtigung des Zeitaspekts für die Verarbeitung. Ich weiß, dass es Pointin PostGIS ein Geometrie-Objekt gibt . Aber meines Wissens speichert es jeden Punkt in einem neuen Tupel, was das Suchen nach einem bestimmten Punkt zu einem sehr langsamen Vorgang machen kann, wenn einige Millionen oder mehr von ihnen gespeichert sind.

Zu diesem Thema habe ich einen Artikel der HSR Rapperswill gefunden. Er schlägt vor , drei Möglichkeiten , um solche Daten zu speichern: Whole data in one tupel, Each point in one tupeloder Splitting Data into Blocksdie von Info-Tabellen Bezug genommen werden, halten die jeden Block erstreckt. Da der dritte Weg für das Auffinden gespeicherter Punkte am nützlichsten zu sein scheint, frage ich mich, ob jemand bereits einige Erfahrungen damit gemacht hat.

Das Papier finden Sie hier: http://wiki.hsr.ch/Datenbanken/files/pgsql_point_cloud.pdf

Last but not least bin ich über ein Projekt auf Github gestolpert, das sich mit Punktwolken-Manieren in PostgeSQL zu befassen scheint. Leider nicht viele Informationen darüber im Netz. Also die gleiche Frage hier: Hat jemand schon einige Erfahrungen damit gemacht? Ist es für solche Zwecke verwendbar?

Das Projekt finden Sie hier: https://github.com/pramsey/pointcloud

Ich würde mich auch über andere Vorschläge, Ideen oder Erfahrungen freuen, wenn es welche gibt. Aber ich muss zugeben, dass nichtkommerzielle Lösungen bevorzugt werden.

Knutella
quelle
1
Können Sie eine ungefähre Vorstellung davon geben, was Sie unter "riesig" verstehen und welche Informationen aus der Punktwolke benötigen Sie? Dh nur XYZ und Intensität, die zB in blockiertem MultipointZM gespeichert werden könnten oder auch andere Attributdaten, für die Point wahrscheinlich eindeutige Werte für jede einzelne Punktmessung benötigt?
Torsti
1
Ich lagere Lidar in 10x10 Meter Multipunkten nach Klassifizierung. Wir verwenden nur Ground-Z-Werte
simplexio
1
@AndreSilva Ziel ist es, Straßenoberflächenprofile aus den Daten zu generieren. Im Moment haben wir Punkte in DEM-Grids umgewandelt und sie mit PostGIS als Rasterblöcke gespeichert und mit SAGA schließlich die Profile daraus erstellt. Es wird zu Testzwecken ausgeführt, bedeutet jedoch auch einen Genauigkeitsverlust, da die Daten vor dem DB-Import gerastert werden. Auch der Export der durch die angegebenen Profillinien geschnittenen Rasterzellen erfolgt in PostGIS sehr langsam (dank ST_Union). Wäre nett, wenn du Tools für ähnliche Aufgaben empfehlen könntest.
Knutella
1
@ Til_b: Nun, genau das habe ich gesagt ... Gute Entdeckung :)
Knutella
1
Ich stellte mir die gleiche Frage und stellte einige Teile zusammen, um einen funktionierenden Prototyp zu erhalten. Bisher funktioniert es hervorragend , ohne Skalierbarkeitsprobleme von mehreren Millionen bis zu Hunderten Millionen Punkten mit jeweils etwa 20 Attributen. Das Finden von Punkten in einem Gebiet dauert bei so vielen Punkten einige hundert Millis . Das Filtern nach Zeitstempel dauert ungefähr die gleiche Zeit (für mich der genaue Zeitpunkt der Erfassung). Auf den Gesamt der perf sind gleich oder besser als in „LiDAR Data Management Pipeline, von Spatial - Datenbank Bevölkerung zu Web-Anwendung Visualisierung“ Die Daten werden in DB komprimieren (etwa 1: 2

Antworten:

5

In Ihrer Frage steckt viel. Die kurze Antwort lautet: Ja, es ist durchaus möglich, riesige Punktwolkendaten in PostGIS zu speichern und für die Verarbeitung zu verwenden. Wir haben ein so vollständiges System aufgebaut, das dies ermöglicht.

Dieses Video ist mit seinen Zahlen etwas veraltet, aber wir hatten TBs von mobilen / terrestrischen und Luftdaten in Postgis, die über Python für die Verarbeitung im Back-End zugänglich waren, und ein Web-Front-End, das das 3D-Anzeigen und Herunterladen der Daten ermöglichte. https://vimeo.com/39053196

Es kommt wirklich darauf an, wie Sie die Daten in PostGIS speichern und wie Sie darauf zugreifen. Eine gute Lösung für Luftbilddaten könnte darin bestehen, die Daten in irgendeiner Weise zu gittern und aus Effizienzgründen Multipunkte zu verwenden. Wenn Sie jedoch mit mobilen oder terrestrischen Daten arbeiten, bei denen die Punktdichte zwischen 500 und 30000 Punkten pro Quadratmeter liegen kann, funktioniert dieser Ansatz nicht. Dann kommt es darauf an, Ihre Hardware und die Anzahl der gleichzeitig angemeldeten Benutzer zu überprüfen. Details dazu finden Sie in einigen unserer Veröffentlichungen unter http://www.mendeley.com/profiles/conor-mc-elhinney/

Conor
quelle
Hallo, vielen Dank für die vielen detaillierten Informationen. Die in Ihren Papieren angebotenen Ides / Tests scheinen wirklich nützlich zu sein! Ich werde einige Zeit brauchen, um alles durchzuarbeiten, aber wie ich beim ersten Lesen gesehen habe, bieten sie bereits vollständige Problemumgehungen. Vielen Dank für das Hinzufügen! Auch das Video und Ihr Browser-basierter PC-Viewer sind sehr interessant und scheinen sehr gut und flüssig zu funktionieren! Leider habe ich kurzfristig andere Sachen in die Hände bekommen. Ich hoffe, dass ich in Kürze mit PC-Daten weitermachen kann.
Knutella
Das Glimpse-Projekt hat hier eine wirklich coole Demo: ncg.nuim.ie/glimpse/auth/login.php
Kozuch
7

(Die Antwort basiert auf den obigen Kommentaren von mir und anderen. Ich habe sie nicht wirklich getestet.)

Speichern Sie die Punkte als MultiPointZM. Die beste Rastergröße hängt wahrscheinlich von den Zugriffsmustern ab, und Sie müssen diesbezüglich einige Tests durchführen. Ein reguläres Raster mit einem räumlichen Index sollte Abfragen ziemlich schnell machen. Wenn 3D-Zugriff wichtig ist, kann MultiPointZM 3D-blockbasiert (1) anstelle eines 2D-Ebenenrasters sein. Wenn Sie PostGIS> = 2.0 haben, können Sie &&& für schnelle 3D-Abfragen verwenden.

Sie können das Rastermuster auch in einer separaten Tabelle speichern. Dies kann nützlich sein, wenn Sie z. B. die Daten aktualisieren und überprüfen möchten, ob die MultiPointZM-Blöcke nach der Bearbeitung innerhalb ihrer Grenzen bleiben.

Das Speichern von Zeitstempeln oder anderen Daten ist jeweils nur für einen Block möglich. Einige Binär- / Kategoriedaten können jedoch gespeichert werden, indem jeder Block nach Attributen disaggregiert wird, wenn nicht zu viele Kategorien und / oder Attribute vorhanden sind.

Wenn Sie die Daten am Ende als separates PointZM speichern müssen, würde ein Fremdschlüssel in der Rastertabelle + B-Tree-Index das Laden nur der spezifischen Punkte (wahrscheinlich) erheblich beschleunigen, als nur die Tabelle direkt abzufragen, selbst mit einem räumlichen Wert Index.

(1) Wenn der Bereich der Z-Werte klein ist (es ist immerhin eine Straße), ist dies wahrscheinlich nicht sinnvoll.

Torsti
quelle
Ich denke, Ihre "Zusammenfassung" passt ziemlich gut zu den zuvor diskutierten Vorschlägen. Wie Sie sagten, muss der richtige Weg, solche Daten zu laden, im Rahmen der Anforderungen und der vorgeschlagenen Lösungen herausgefunden werden. Es stellte sich heraus, dass es dank so vieler Ideen nicht unmöglich war. Es hat mich sehr inspiriert, mich weiter mit diesem Thema zu beschäftigen. Danke vielmals!
Knutella