Automatiser le chargement par lots de plusieurs fichiers GPX dans PostGIS?

9

J'ai plus de 50 fichiers GPX que je voudrais «charger par lots» dans une base de données PostGIS. Toutes les données de track_points seraient chargées dans une table "track_points" (avec des champs GPS typiques comme lat, long, élévation, temps, etc.) et les données de traces seraient chargées dans une table de géométrie de ligne "tracks" similaire, conçue de manière appropriée.

Je préfère automatiser ce processus afin que lorsque j'aurai mes 50+ prochains, je n'aurai pas à saisir les données dans la base de données. Personnellement, je préfère utiliser Python pour écrire ce type de processus, mais toutes les suggestions sont les bienvenues.

Mon processus de réflexion général consiste à:

  1. Obtenez une liste des fichiers GPX à traiter (assez facile grâce aux outils Python standard)
  2. Parcourez chaque fichier GPX et extrayez / convertissez les données nécessaires au format PostGIS
  3. Insérez les données GPS dans PostGIS à l'aide de la bibliothèque Python psycopg

Je pense que je peux gérer les étapes 1 et 3, mais je me demande s'il existe une méthode / bibliothèque relativement simple qui convertirait les données (pistes et track_points) au format PostGIS, ou simplement la forme tabulaire que je pourrais insérer dans la table déjà créée .

J'ai déjà lu « Y a-t-il une bonne bibliothèque d'analyse de trace GPS? », « Comment créer une base de données géographiques de journaux GPS? » Et « Comment extraire des données .gpx avec python », et j'ai examiné le GDAL / OGR et les liaisons FWTools Python, mais je ne veux pas réinventer la roue car quelqu'un a déjà une bonne méthode pour cela.

RyanKDalton
la source

Réponses:

10

Pour Python pur, utilisez le module OGR de 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
la source
Merci pour la solution! J'ai eu du mal à obtenir les liaisons GDAL Python pour récupérer le pilote OGR PostgreSQL , mais après avoir suivi ces instructions pour installer les liaisons GDAL et GDAL Python sur Windows 7 , j'ai finalement réussi à le faire fonctionner.
RyanKDalton
2 problèmes que je rencontre maintenant: 1) y a-t-il une option "ajouter" pour que tous les fichiers GPX soient ajoutés au même fichier (actuellement, il semble que ce soit juste le premier qui soit chargé) et 2) existe-t-il un moyen définir le schéma dans lequel enregistrer les nouvelles tables?
RyanKDalton
Le nom de la couche de destination (nom de la table) est le deuxième paramètre de CopyLayer. J'ai ajouté le nom du fichier GPX en tant que préfixe, donc les tables doivent être aussi uniques que les noms des fichiers d'entrée. L'option "ajouter" de ogr2ogr est une option délicate que je ne sais pas comment faire en ce moment.
Mike T
5

Après des recherches supplémentaires, j'ai écrit mon propre script Python gpx2postgis.py qui automatise le processus d'ajout de fonctionnalités GPX aux tables existantes. Le script utilise des parties du travail fourni par @Mike T ci-dessus et d'autres. Je l'ai ajouté à GitHub si vous souhaitez télécharger ou apporter des contributions. Il crée de nouveaux schémas de table (selon les besoins) en fonction des sous-couches GPX d'entrée et ajoute des fonctionnalités à ces tables.

Bien qu'il ne s'agisse pas d'une solution Python, j'ai rencontré cette question similaire sur StackOverflow qui m'a fait réaliser que je pouvais simplement parcourir tous mes fichiers GPX et appeler la ligne de commande ogr2ogr pour les traiter à l'aide des types d'entités GPX .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx
RyanKDalton
la source
Je me suis contenté de GPSBable pour des transformations rapides et sales. Et plus tard, déplacé vers R pour des emplois plus importants. Alors impatient de voir la solution Python aussi!
radek