Автоматизировать пакетную загрузку нескольких файлов GPX в PostGIS?

9

У меня есть более 50 файлов GPX, которые я хотел бы «пакетно загрузить» в базу данных PostGIS. Все данные track_points будут загружены в таблицу «track_points» (с типичными полями GPS, такими как широта, долгота, высота, время и т. Д.), А данные треков будут загружены в аналогичную таблицу геометрии линий «дорожки», разработанную соответствующим образом.

Я бы предпочел автоматизировать этот процесс, чтобы при получении следующих 50+ мне не приходилось вручную вводить данные в базу данных. Я лично предпочитаю использовать Python для написания сценариев такого рода процессов, но любые предложения приветствуются.

Мой общий мыслительный процесс заключается в следующем:

  1. Получить список файлов GPX для обработки (достаточно просто с помощью стандартных инструментов Python)
  2. Проходить по каждому файлу GPX и извлекать / преобразовывать необходимые данные в формат PostGIS
  3. Вставьте данные GPS в PostGIS с помощью библиотеки Python psycopg

Я думаю, что могу справиться с шагами 1 и 3, но мне интересно, есть ли относительно простой метод / библиотека, которая конвертирует данные (track и track_points) в формат PostGIS, или просто табличную форму, которую я мог бы вставить в уже созданную таблицу ,

Я уже прочитал « Есть ли хорошая библиотека анализа GPS-треков? », « Как создать географическую базу данных журналов GPS? » И « Как извлечь данные .gpx с помощью python », и заглянул в GDAL / OGR. и FWTools Python привязки, но не хочу изобретать велосипед, у кого-то уже есть хороший метод для этого.

RyanKDalton
источник

Ответы:

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 в качестве префикса, поэтому таблицы должны быть такими же уникальными, как и имена входных файлов. Опция "append" от ogr2ogr - хитрая задача, которую я не знаю, как сделать в данный момент.
Майк Т
5

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

Хотя это и не было решением Python, я сталкивался с подобным вопросом о StackOverflow, который заставил меня понять, что я могу просто просмотреть все мои файлы GPX и вызвать командную строку ogr2ogr, чтобы обработать их, используя типы объектов GPX .

ogr2ogr -append -f PostgreSQL "PG:dbname=your_db user=xxxx password=yyyy" filename.gpx
RyanKDalton
источник
Я остановился на GPSBable для быстрого и грязного преобразования. А позже перешел на R для более крупных работ. Так что с нетерпением жду возможности увидеть решение Python!
Радек