Birden fazla GPX dosyasının toplu yüklemesini PostGIS'e otomatikleştiriyor musunuz?


9

Ben bir PostGIS veritabanına "toplu yükleme" istiyorum 50 + GPX dosyaları var. Tüm track_points verileri bir "track_points" tablosuna (lat, uzun, yükseklik, zaman vb.Gibi tipik GPS alanları ile) yüklenecek ve parkur verileri benzer, uygun şekilde tasarlanmış bir "track" çizgi geometri tablosuna yüklenecektir.

Bu işlemi otomatikleştirmeyi tercih ederim, böylece sonraki 50 yaşımı aldığımda, veriyi veritabanına girmem gerekmeyecek. Ben şahsen bu tür süreçleri kodlamak için Python kullanmayı tercih ediyorum, ama herhangi bir öneri bekliyoruz.

Genel düşünce sürecim:

  1. İşlenecek GPX dosyalarının bir listesini alın (standart Python araçlarıyla yeterince kolay)
  2. Her GPX dosyasında dolaşın ve gerekli verileri PostGIS formatına çıkarın / dönüştürün
  3. Psycopg Python kütüphanesini kullanarak GPS verilerini PostGIS'e ekleyin

Ben adım 1 ve 3 yönetebilirsiniz düşünüyorum, ama veri (parça ve parça_ noktaları) PostGIS biçimine dönüştürmek nispeten basit bir yöntem / kütüphane, ya da sadece ben zaten oluşturulan tabloya ekleyebilir sekmeli formu olup olmadığını merak ediyorum .

Zaten " İyi bir GPS parça analiz kütüphanesi var mı? ", " GPS günlükleri coğrafi bir veritabanı nasıl oluşturulur? " Ve " Python ile .gpx verileri nasıl ayıklanır " okudum ve GDAL / OGR baktım ve FWTools Python bağlamaları, ancak tekerleği yeniden icat etmek istemeyen birinin zaten bunun için iyi bir yöntemi var.

Yanıtlar:


10

Saf Python için GDAL'ın OGR modülünü kullanın:

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')

Çözüm için teşekkürler! OGR PostgreSQL sürücüsünü almak için GDAL Python bağlarını almak için mücadele ettim , ancak Windows 7'de GDAL ve GDAL Python Bağlamalarını Kurmak için bu talimatları izledikten sonra nihayet çalıştım.
RyanKDalton

Şu anda sahip olduğum 2 sorun: 1) "GPM" dosyalarının aynı dosyaya eklenmesini sağlayan bir "append" seçeneği var (şu anda, ilk yüklenen gibi görünüyor) ve 2) bir yol var yeni tabloları kaydetmek için şema tanımlamak için?
RyanKDalton

Hedef katman adı (tablo adı), içindeki ikinci parametredir CopyLayer. GPX dosyasındaki adı önek olarak ekledim, bu nedenle tablolar giriş dosyası adları kadar benzersiz olmalıdır. Ogr2ogr "append" seçeneği şu anda nasıl yapılacağından emin olmadığım zor bir seçenek.
Mike T

5

Ek araştırmalardan sonra, GPX özelliklerini mevcut tablolara ekleme işlemini otomatikleştiren kendi gpx2postgis.py Python betiğimi yazdım . Komut dosyası, yukarıdaki @Mike T tarafından sağlanan çalışmanın bazı bölümlerini ve diğerlerini kullanır. İndirmek veya katkıda bulunmak istiyorsanız GitHub'a ekledim. Giriş GPX alt katmanlarına dayalı olarak yeni tablo şemaları oluşturur (gerektiğinde) ve bu tablolara özellikler ekler.

Bir Python çözümü olmasa da , StackOverflow'da , tüm GPX dosyalarım arasında döngü yapabileceğimi ve GPX özellik türlerini kullanarak bunları işlemek için ogr2ogr komut satırını çağırabileceğimi fark ettim .

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

Hızlı ve kirli dönüşümler için GPSBable'a yerleştim. Daha sonra daha büyük işler için R'ye taşındı. Python çözümünü de görmek için sabırsızlanıyoruz!
radek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.