Automatizando o carregamento em lote de vários arquivos GPX no PostGIS?

9

Eu tenho mais de 50 arquivos GPX que gostaria de "carregar em lote" em um banco de dados PostGIS. Todos os dados dos track_points seriam carregados em uma tabela "track_points" (com campos típicos de GPS como lat, long, altitude, hora, etc) e os dados das trilhas seriam carregados em uma tabela de geometria de linha similar, projetada adequadamente.

Eu preferiria automatizar esse processo para que, quando chegar os 50 ou mais próximos, não for necessário inserir os dados no banco de dados. Pessoalmente, prefiro usar o Python para criar scripts para esses tipos de processos, mas qualquer sugestão é bem-vinda.

Meu processo de pensamento geral é:

  1. Obtenha uma lista de arquivos GPX para processar (fácil o suficiente por meio das ferramentas padrão do Python)
  2. Faça um loop em cada arquivo GPX e extraia / converta os dados necessários para o formato PostGIS
  3. Inserir os dados do GPS no PostGIS usando a biblioteca psycopg Python

Acho que posso gerenciar as etapas 1 e 3, mas estou imaginando se existe um método / biblioteca relativamente simples que converta os dados (tracks e track_points) em formato PostGIS, ou simplesmente o formulário tabular que eu poderia inserir na tabela já criada .

Eu já li " Existe uma boa biblioteca de análise de trilhas GPS? ", " Como criar um banco de dados geográfico de registros GPS? " E " Como extrair dados .gpx com python " e examinei o GDAL / OGR e ligações FWTools Python, mas não quero reinventar a roda, se alguém já tiver um bom método para isso.

RyanKDalton
fonte

Respostas:

10

Para Python puro, use o módulo OGR da 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
fonte
Obrigado pela solução! Eu lutei para obter as ligações GDAL Python para pegar o driver OGR PostgreSQL , mas depois de seguir estas instruções em Instalando as ligações GDAL e GDAL Python no Windows 7 , finalmente consegui fazê-lo funcionar.
RyanKDalton
2 problemas que estou tendo agora: 1) existe uma opção "anexar" para que todos os arquivos GPX sejam anexados ao mesmo arquivo (atualmente, parece que é apenas o primeiro a ser carregado) e 2) existe uma maneira definir o esquema para salvar as novas tabelas?
RyanKDalton
O nome da camada de destino (nome da tabela) é o segundo parâmetro em CopyLayer. Como adicionei o nome do arquivo GPX como prefixo, as tabelas devem ser tão exclusivas quanto os nomes dos arquivos de entrada. A opção "anexar" do ogr2ogr é uma opção complicada que não tenho certeza de como fazer no momento.
Mike T
5

Após pesquisas adicionais, escrevi meu próprio script Python gpx2postgis.py que automatiza o processo de anexar recursos de GPX a tabelas existentes. O script usa partes do trabalho fornecido pelo @ Mike T acima e outros. Adicionei ao GitHub se você deseja fazer o download ou fazer contribuições. Ele cria novos esquemas de tabela (conforme necessário) com base nas subcamadas GPX de entrada e anexa recursos a essas tabelas.

Embora não seja uma solução Python, me deparei com essa pergunta semelhante no StackOverflow que me fez perceber que eu poderia apenas percorrer todos os meus arquivos GPX e chamar a linha de comando ogr2ogr para processá-los usando os tipos de recursos GPX .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx
RyanKDalton
fonte
Optei pelo GPSBable para transformações rápidas e sujas. E depois mudou-se para R para trabalhos maiores. Então, ansioso para ver a solução Python também!
Radek