Automatisieren Sie das Batch-Laden mehrerer GPX-Dateien in PostGIS?

9

Ich habe mehr als 50 GPX-Dateien, die ich in eine PostGIS-Datenbank "stapelweise laden" möchte. Alle track_points-Daten würden in eine "track_points" -Tabelle (mit typischen GPS-Feldern wie Lat, Long, Elevation, Time usw.) geladen, und die Track-Daten würden in eine ähnliche, entsprechend gestaltete "Tracks" -Liniengeometrietabelle geladen.

Ich würde es vorziehen, diesen Prozess zu automatisieren, damit ich die Daten nicht manuell in die Datenbank eingeben muss, wenn ich meine nächsten 50+ erhalte. Ich persönlich bevorzuge es, Python zu verwenden, um solche Prozesse zu skripten, aber Vorschläge sind willkommen.

Mein allgemeiner Denkprozess ist:

  1. Holen Sie sich eine Liste der zu verarbeitenden GPX-Dateien (einfach genug mit Standard-Python-Tools)
  2. Durchlaufen Sie jede GPX-Datei und extrahieren / konvertieren Sie die erforderlichen Daten in das PostGIS-Format
  3. Fügen Sie die GPS-Daten mithilfe der psycopg Python-Bibliothek in PostGIS ein

Ich denke, ich kann die Schritte 1 und 3 verwalten, frage mich jedoch, ob es eine relativ einfache Methode / Bibliothek gibt, die die Daten (Tracks und Track_Points) in das PostGIS-Format konvertiert, oder einfach die Tabellenform, die ich in die bereits erstellte Tabelle einfügen könnte .

Ich habe bereits " Gibt es eine gute GPS-Track-Analysebibliothek? ", " Wie erstelle ich eine geografische Datenbank mit GPS-Protokollen? " Und " Wie extrahiere ich GPX-Daten mit Python ? " Gelesen und habe mir die GDAL / OGR angesehen und FWTools Python-Bindungen, aber das Rad nicht neu erfinden wollen, hat jemand bereits eine gute Methode dafür.

RyanKDalton
quelle

Antworten:

10

Verwenden Sie für reines Python das OGR-Modul von GDAL:

import os
from osgeo import ogr
from glob import glob

# Establish a connection to a PostGIS database
pg = ogr.GetDriverByName('PostgreSQL')
if pg is None:
    raise RuntimeError('PostgreSQL driver not available')
conn = pg.Open("PG:dbname='postgis' user='postgres'", True)
if conn is None:
    raise RuntimeError('Cannot open dataset connection')

# Loop through each GPX file
for gpx_file in glob('/path/to/*.gpx'):
    ds = ogr.Open(gpx_file)
    if ds is None:
        print('Skipping ' + gpx_file)
    print('Opened ' + gpx_file)
    prefix = os.path.splitext(os.path.basename(gpx_file))[0]
    # Get each layer
    for iLayer in range(ds.GetLayerCount()):
        layer = ds.GetLayer(iLayer)
        layer_name = prefix + '_' + layer.GetName()
        if layer.GetFeatureCount() == 0:
            print(' -> Skipping ' + layer_name + ' since it is empty')
        else:
            print(' -> Copying ' + layer_name)
            pg_layer = conn.CopyLayer(layer, layer_name)
            if pg_layer is None:
                print(' |-> Failed to copy')
Mike T.
quelle
Danke für die Lösung! Ich hatte Mühe, die GDAL-Python-Bindungen dazu zu bringen, den OGR-PostgreSQL-Treiber aufzunehmen , aber nachdem ich diese Anweisungen zum Installieren von GDAL- und GDAL-Python-Bindungen unter Windows 7 befolgt hatte , funktionierte es endlich.
RyanKDalton
2 Probleme, die ich jetzt habe: 1) Gibt es eine "Anhängen" -Option, damit alle GPX-Dateien an dieselbe Datei angehängt werden (derzeit scheint es, als wäre es nur die erste, die geladen wird) und 2) gibt es eine Möglichkeit um das Schema zu definieren, in dem die neuen Tabellen gespeichert werden sollen?
RyanKDalton
Der Name der Zielschicht (Tabellenname) ist der zweite Parameter in CopyLayer. Ich habe den Namen aus der GPX-Datei als Präfix hinzugefügt, daher sollten die Tabellen so eindeutig sein wie die Namen der Eingabedateien. Die Option "Anhängen" von ogr2ogr ist schwierig und ich bin mir nicht sicher, wie ich sie derzeit machen soll.
Mike T
5

Nach weiteren Recherchen habe ich mein eigenes Python-Skript gpx2postgis.py geschrieben, das das Anhängen von GPX-Funktionen an vorhandene Tabellen automatisiert. Das Skript verwendet Teile der von @Mike T oben und anderen bereitgestellten Arbeit. Ich habe es zu GitHub hinzugefügt, wenn Sie herunterladen oder Beiträge leisten möchten. Es erstellt neue Tabellenschemata (nach Bedarf) basierend auf den eingegebenen GPX-Unterschichten und hängt Features an diese Tabellen an.

Obwohl es sich nicht um eine Python-Lösung handelt, stieß ich bei StackOverflow auf diese ähnliche Frage , bei der mir klar wurde, dass ich einfach alle meine GPX-Dateien durchlaufen und die Befehlszeile ogr2ogr aufrufen konnte , um sie mithilfe der GPX-Funktionstypen zu verarbeiten .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx
RyanKDalton
quelle
Ich entschied mich für GPSBable für schnelle und schmutzige Transformationen. Und zog später für größere Jobs nach R. Ich freue mich also auch auf die Python-Lösung!
Radek