Automatizzare il caricamento batch di più file GPX in PostGIS?


9

Ho più di 50 file GPX che vorrei "caricare in batch" in un database PostGIS. Tutti i dati dei track_points verrebbero caricati in una tabella "track_points" (con campi GPS tipici come lat, long, elevazione, tempo, ecc.) E i dati delle tracce verrebbero caricati in una tabella di geometria della linea "track" simile, opportunamente progettata.

Preferirei automatizzare questo processo in modo che quando avrò i miei prossimi 50+, non dovrò inserire manualmente i dati nel database. Personalmente preferisco usare Python per scrivere questo tipo di processi, ma ogni suggerimento è il benvenuto.

Il mio processo di pensiero generale è di:

  1. Ottieni un elenco di file GPX da elaborare (abbastanza facile tramite gli strumenti Python standard)
  2. Scorri attraverso ogni file GPX ed estrai / converti i dati necessari nel formato PostGIS
  3. Inserisci i dati GPS in PostGIS usando la libreria psycopg Python

Penso di poter gestire i passaggi 1 e 3, ma mi chiedo se esiste un metodo / libreria relativamente semplice che converta i dati (tracce e track_points) nel formato PostGIS, o semplicemente il modulo tabulare che potrei inserire nella tabella già creata .

Ho già letto " Esiste una buona libreria di analisi delle tracce GPS? ", " Come creare un database geografico dei registri GPS? " E " Come estrarre i dati .gpx con Python " e ho esaminato GDAL / OGR e i collegamenti Python di FWTools, ma non voglio reinventare la ruota è qualcuno ha già un buon metodo per questo.

Risposte:


10

Per puro Python, usa il modulo OGR di 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')

Grazie per la soluzione! Ho faticato a ottenere i binding GDAL Python per raccogliere il driver OGR PostgreSQL , ma dopo aver seguito queste istruzioni per l' installazione di GDAL e GDAL Python Bindings su Windows 7 , ho finalmente funzionato.
RyanKDalton,

2 problemi che sto riscontrando: 1) c'è un'opzione "append" in modo che tutti i file GPX vengano aggiunti allo stesso file (attualmente, sembra che sia solo il primo che viene caricato) e 2) c'è un modo definire lo schema in cui salvare le nuove tabelle?
RyanKDalton,

Il nome del layer di destinazione (nome tabella) è il secondo parametro in CopyLayer. Ho aggiunto il nome dal file GPX come prefisso, quindi le tabelle dovrebbero essere uniche come i nomi dei file di input. L'opzione "append" di ogr2ogr è complicata e non sono sicuro di come fare in questo momento.
Mike T,

5

Dopo ulteriori ricerche, ho scritto il mio script Python gpx2postgis.py che automatizza il processo di aggiunta delle funzionalità GPX alle tabelle esistenti. Lo script utilizza parti del lavoro fornite da @Mike T sopra e altre. L'ho aggiunto a GitHub se desideri scaricare o inviare contributi. Crea nuovi schemi di tabella (se necessario) in base ai sublayer GPX di input e aggiunge funzionalità a tali tabelle.

Pur non essendo una soluzione Python, mi sono imbattuto in questa domanda simile su StackOverflow che mi ha fatto capire che potevo semplicemente scorrere tutti i miei file GPX e chiamare la riga di comando ogr2ogr per elaborarli utilizzando i tipi di funzionalità GPX .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx

Ho optato per GPSBable per trasformazioni veloci e sporche. E più tardi si trasferì a R per lavori più grandi. Quindi non vedo l'ora di vedere anche la soluzione Python!
Radek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.