Automatyzujesz ładowanie wsadowe wielu plików GPX do PostGIS?

9

Mam ponad 50 plików GPX, które chciałbym „wsadowo załadować” do bazy danych PostGIS. Wszystkie dane track_points zostałyby załadowane do tabeli „track_points” (z typowymi polami GPS, takimi jak lat, long, elewacja, czas itp.), A dane tracków zostałyby załadowane do podobnej, odpowiednio zaprojektowanej tabeli geometrii linii „track”.

Wolę zautomatyzować ten proces, aby po otrzymaniu następnych 50+ nie musiałem ręcznie wprowadzać danych do bazy danych. Osobiście wolę używać Pythona do pisania skryptów tego rodzaju procesów, ale wszelkie sugestie są mile widziane.

Mój ogólny proces myślowy polega na:

  1. Uzyskaj listę plików GPX do przetworzenia (dość łatwe dzięki standardowym narzędziom Python)
  2. Pętlę przez każdy plik GPX i wyodrębnić / przekonwertować niezbędne dane do formatu PostGIS
  3. Wstaw dane GPS do PostGIS za pomocą biblioteki psycopg Python

Myślę, że mogę zarządzać krokami 1 i 3, ale zastanawiam się, czy istnieje względnie prosta metoda / biblioteka, która przekształciłaby dane (ścieżki i punkty_scieżki) w format PostGIS, czy po prostu tabelaryczny formularz, który mógłbym wstawić do już utworzonej tabeli .

Przeczytałem już „ Czy istnieje dobra biblioteka analizy śladów GPS? ”, „ Jak zbudować geograficzną bazę danych dzienników GPS?OrazJak wyodrębnić dane .gpx za pomocą pytona ” i zajrzałem do GDAL / OGR i wiązania FWTools w Pythonie, ale nie chcę wymyślać koła na nowo, jeśli ktoś ma już na to dobrą metodę.

RyanKDalton
źródło

Odpowiedzi:

10

Dla czystego Pythona użyj modułu 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.
źródło
Dzięki za rozwiązanie! Walczyłem o uzyskanie powiązań GDAL Python do pobrania sterownika OGR PostgreSQL , ale po wykonaniu tych instrukcji w celu zainstalowania GDAL i GDAL Python Bindings na Windows 7 , w końcu udało mi się go uruchomić.
RyanKDalton,
2 problemy, które teraz mam: 1) czy istnieje opcja „dołącz”, aby wszystkie pliki GPX były dołączane do tego samego pliku (obecnie wygląda na to, że jest to tylko pierwszy załadowany) i 2) czy jest jakiś sposób zdefiniować schemat, w którym będą zapisywane nowe tabele?
RyanKDalton,
Nazwa warstwy docelowej (nazwa tabeli) jest drugim parametrem w CopyLayer. Dodałem nazwę z pliku GPX jako prefiks, więc tabele powinny być tak unikalne, jak nazwy plików wejściowych. Opcja „append” z ogr2ogr jest trudna, ale nie jestem pewien, jak to zrobić w tej chwili.
Mike T
5

Po dodatkowych badaniach napisałem własny skrypt Pythona gpx2postgis.py, który automatyzuje proces dodawania funkcji GPX do istniejących tabel. Skrypt wykorzystuje części pracy dostarczone przez @Mike T powyżej i inne. Dodałem go do GitHub, jeśli chcesz pobrać lub wnieść wkład. Tworzy nowe schematy tabel (w razie potrzeby) w oparciu o wejściowe podwarstwy GPX i dołącza funkcje do tych tabel.

Nie będąc rozwiązaniem Pythona, natrafiłem na podobne pytanie na StackOverflow, które uświadomiło mi, że mogę po prostu zapętlić wszystkie moje pliki GPX i wywołać linię poleceń ogr2ogr, aby przetworzyć je przy użyciu typów funkcji GPX .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx
RyanKDalton
źródło
Zdecydowałem się na GPSBable do szybkich i brudnych transformacji. A później przeniósł się do R dla większych zadań. Z niecierpliwością czekam na rozwiązanie Python!
radek