Автоматизовано пакетне завантаження декількох файлів GPX у PostGIS?


9

У мене є 50+ GPX файлів, які я б хотів "завантажувати пакетно" в базу даних PostGIS. Всі дані track_points будуть завантажені в таблицю "track_points" (з типовими полями GPS, такими як lat, long, висота, час тощо), і дані треків будуть завантажені в аналогічну, відповідно розроблену таблицю геометрії рядків "треки".

Я вважаю за краще автоматизувати цей процес так, що коли я отримаю наступні 50+, мені не доведеться вводити дані в базу даних. Я особисто вважаю за краще використовувати Python для скриптування подібних процесів, але будь-які пропозиції вітаються.

Моя загальна думка - це:

  1. Отримайте список файлів GPX для обробки (досить просто за допомогою стандартних інструментів Python)
  2. Проведіть цикл через кожен файл GPX і витягніть / конвертуйте необхідні дані у формат PostGIS
  3. Вставте GPS-дані в PostGIS, використовуючи бібліотеку Python Pychon

Я думаю, що я можу керувати кроками 1 і 3, але мені цікаво, чи існує порівняно простий метод / бібліотека, який би перетворив дані (доріжки та трекові точки) у формат PostGIS, або просто табличну форму, яку я міг би вставити у вже створену таблицю .

Я вже читав " Чи є хороша бібліотека аналізу треків GPS? ", " Як створити географічну базу даних журналів GPS? " Та " Як витягнути .gpx дані з python ", і заглянув у GDAL / OGR і прив’язки FWTools Python, але не хочуть винаходити колесо - хтось уже має хороший метод для цього.

Відповіді:


10

Для чистого Python використовуйте 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')

Дякую за рішення! Я намагався отримати прив’язки GDAL Python до вибору драйвера OGR PostgreSQL , але, дотримуючись цих інструкцій щодо встановлення прив’язок GDAL & GDAL Python в Windows 7 , я нарешті змусив його працювати.
RyanKDalton

2 питання, які у мене зараз є: 1) чи є опція "додати", щоб усі файли GPX додавались до одного файлу (наразі це здається, що це лише перший завантажений), і 2) чи є спосіб визначити схему для збереження нових таблиць у?
RyanKDalton

Ім'я цільового шару (назва таблиці) є другим параметром у CopyLayer. Я додав ім'я з файлу GPX як префікс, тому таблиці повинні бути такими ж унікальними, як імена вхідних файлів. Варіант "додати" від ogr2ogr - складний, що я не впевнений, як це зробити в даний момент.
Майк Т

5

Після додаткових досліджень я написав власний скрипт gpx2postgis.py Python, який автоматизує процес додавання функцій GPX до існуючих таблиць. Сценарій використовує частини роботи, надані @Mike T вище, та інші. Я додав його в GitHub, якщо ви хочете завантажити або зробити внесок. Він створює нові таблиці таблиць (за потребою) на основі вхідних підшарів GPX і додає функції до цих таблиць.

Хоча це не рішення Python, я натрапив на подібне запитання на StackOverflow, яке дало мені зрозуміти, що я можу просто переглядати всі мої файли GPX і викликати командний рядок ogr2ogr, щоб обробити їх, використовуючи типи функцій GPX .

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

Я влаштувався на GPSBable для швидких та брудних перетворень. А пізніше переїхали до R для більших робочих місць. Тож з нетерпінням чекаємо побачити рішення Python!
radek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.