Mengotomatiskan pemuatan banyak file GPX ke PostGIS?

9

Saya memiliki 50+ file GPX yang ingin saya "muat batch" ke dalam database PostGIS. Semua data track_points akan dimuat ke dalam tabel "track_points" (dengan bidang GPS khas seperti lat, panjang, elevasi, waktu, dll) dan data trek akan dimuat ke dalam tabel geometri garis "trek" yang mirip dan dirancang dengan tepat.

Saya lebih suka mengotomatiskan proses ini sehingga ketika saya mendapatkan 50+ berikutnya, saya tidak perlu memasukkan data ke dalam database. Saya pribadi lebih suka menggunakan Python untuk skrip proses semacam ini, tetapi saran dipersilahkan.

Proses pemikiran umum saya adalah:

  1. Dapatkan daftar file GPX untuk diproses (cukup mudah melalui alat Python standar)
  2. Ulangi setiap file GPX dan ekstrak / konversikan data yang diperlukan ke format PostGIS
  3. Masukkan data GPS ke PostGIS menggunakan pustaka psycopg Python

Saya pikir saya dapat mengelola langkah 1 & 3, tetapi saya bertanya-tanya apakah ada metode / pustaka yang relatif sederhana yang akan mengubah data (trek dan track_points) ke dalam format PostGIS, atau hanya bentuk tabel yang dapat saya masukkan ke dalam tabel yang sudah dibuat .

Saya sudah membaca " Apakah ada perpustakaan analisis trek GPS yang baik? ", " Bagaimana membangun basis data geografis log GPS? ", Dan " Bagaimana cara mengekstrak data .gpx dengan python ", dan telah melihat ke dalam GDAL / OGR dan binding FWTools Python, tetapi tidak ingin menemukan kembali roda adalah seseorang sudah memiliki metode yang baik untuk ini.

RyanKDalton
sumber

Jawaban:

10

Untuk Python murni, gunakan modul OGR 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
sumber
Terima kasih atas solusinya! Saya kesulitan mendapatkan GDAL Python bindings untuk mengambil driver OGR PostgreSQL , tetapi setelah mengikuti instruksi ini untuk Menginstal GDAL & GDAL Python Bindings pada Windows 7 , saya akhirnya berhasil.
RyanKDalton
2 masalah yang sekarang saya alami: 1) apakah ada opsi "append" sehingga semua file GPX ditambahkan ke file yang sama (saat ini, seolah-olah hanya yang pertama kali dimuat) dan 2) apakah ada cara untuk menentukan skema untuk menyimpan tabel baru ke dalam?
RyanKDalton
Nama layer tujuan (nama tabel) adalah parameter kedua di CopyLayer. Saya telah menambahkan nama dari file GPX sebagai awalan, sehingga tabel harus seunik nama file input. Opsi "append" dari ogr2ogr adalah pilihan yang sulit yang saya tidak yakin bagaimana melakukannya saat ini.
Mike T
5

Setelah penelitian tambahan, saya menulis skrip Python gpx2postgis.py saya sendiri yang mengotomatiskan proses menambahkan fitur GPX ke tabel yang ada. Script menggunakan bagian dari pekerjaan yang disediakan oleh @ Mike T di atas, dan lainnya. Saya telah menambahkannya ke GitHub jika Anda ingin mengunduh atau berkontribusi. Ini membuat skema tabel baru (sesuai kebutuhan) berdasarkan sublayers GPX input, dan menambahkan fitur ke tabel tersebut.

Meskipun bukan solusi Python, saya menemukan pertanyaan serupa tentang StackOverflow yang membuat saya sadar bahwa saya bisa mengulang semua file GPX saya dan memanggil baris perintah ogr2ogr untuk memprosesnya menggunakan tipe fitur GPX .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx
RyanKDalton
sumber
Saya memilih GPSBable untuk transformasi cepat & kotor. Dan kemudian pindah ke R untuk pekerjaan yang lebih besar. Jadi menantikan untuk melihat solusi Python juga!
radek