9 votos

La automatización de los lotes de carga de varios archivos GPX en PostGIS

Tengo 50+ archivos GPX que me gustaría "lote" de la carga en una base de datos PostGIS. Todos los track_points datos pueden ser cargados en un "track_points" de la tabla (con la típica GPS campos como la lat, long, altura, tiempo, etc) y las pistas de datos pueden ser cargados en un similar, diseñado de manera adecuada "pistas" de la línea de la geometría de la tabla.

Prefiero a automatizar este proceso para que cuando llegue mi próximo 50+, no tengo a mano el introducir los datos en la base de datos. Yo personalmente prefiero usar secuencia de comandos de Python para este tipo de procesos, pero cualquier sugerencia es bienvenida.

Mi general, el proceso de pensamiento es:

  1. Obtener una lista de los archivos GPX para el proceso (bastante fácil a través de estándar de Python herramientas)
  2. El bucle a través de cada archivo GPX y extraer/convertir los datos necesarios para PostGIS formato
  3. Insertar el GPS de datos en PostGIS el uso de la psycopg biblioteca de Python

Creo que puedo manejar los pasos 1 y 3, pero me pregunto si hay un método relativamente simple/biblioteca que convertir los datos (pistas y track_points) en PostGIS formato, o simplemente la forma tabular que se podía insertar en la ya creada la tabla.

Ya he leído "Es un buen track para el GPS biblioteca de análisis?", "Cómo construir una base de datos geográfica de los registros de GPS?", y "Cómo extraer .gpx de datos con python", y han mirado en el GDAL/OGR y FWTools enlaces Python, pero no quiero reinventar la rueda es alguien que ya tiene un buen método para ello.

10voto

hernan43 Puntos 566

Para Python puro, el uso de GDAL del OGR módulo:

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')

5voto

aditya Puntos 111

Aunque no es una solución Python, me hizo venir a través de esta pregunta similar en StackOverflow que me hizo darme cuenta de que yo sólo podía bucle a través de todos mis archivos GPX y llamar a la ogr2ogr línea de comandos para procesar el uso de la GPX tipos de entidad.

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X