PostGISへの複数のGPXファイルのバッチロードを自動化しますか?


9

PostGISデータベースに「バッチロード」したい50以上のGPXファイルがあります。すべてのtrack_pointsデータは「track_points」テーブルに読み込まれ(緯度、経度、標高、時刻などの一般的なGPSフィールドを使用)、トラックデータは同様に適切に設計された「トラック」ラインジオメトリテーブルに読み込まれます。

このプロセスを自動化して、次の50以上を取得したときに、データベースにデータを手動で入力する必要がないようにします。私は個人的にこれらの種類のプロセスをスクリプト化するためにPythonを使用することを好みますが、提案は大歓迎です。

私の一般的な思考プロセスは次のとおりです。

  1. 処理するGPXファイルのリストを取得します(標準のPythonツールで十分簡単です)
  2. 各GPXファイルをループして、必要なデータを抽出/ PostGIS形式に変換します
  3. psycopg Pythonライブラリを使用してGPSデータをPostGISに挿入する

ステップ1と3を管理できると思いますが、データ(tracksとtrack_points)をPostGIS形式に変換する比較的単純なメソッド/ライブラリがあるのか​​、またはすでに作成されているテーブルに挿入できる表形式のフォームがあるのか​​と思っています。 。

私は「もう読んだ?良いGPSトラック解析ライブラリがあります」、「?GPSログの地理データベースを構築する方法」、および「パイソンと.GPXデータを抽出する方法」、およびGDAL / OGRに見てきましたFWTools Pythonバインディングですが、ホイールを再発明したくないのは、誰かがすでにこれに適した方法を持っているからです。

回答:


10

純粋なPythonの場合は、GDALのOGRモジュールを使用します。

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ドライバーを取得するのに苦労しましたが、これらの手順に従ってWindows 7GDALおよびGDAL Pythonバインディングインストールした後、ようやく動作しました。
RyanKDalton 2013

私が今持っている2つの問題:1)すべてのGPXファイルが同じファイルに追加されるように「追加」オプションがあります(現在、それはロードされた最初のファイルのように見えます)、2)方法があります新しいテーブルを保存するスキーマを定義するには?
RyanKDalton 2013

宛先レイヤー名(テーブル名)は、の2番目のパラメーターですCopyLayer。GPXファイルの名前をプレフィックスとして追加したので、テーブルは入力ファイル名と同じように一意にする必要があります。ogr2ogrの「追加」オプションは、現時点ではどうすればよいかわからないトリッキーなオプションです。
マイクT

5

追加の調査の後、GPX機能を既存のテーブルに追加するプロセスを自動化する独自のgpx2postgis.py Pythonスクリプトを作成しました。このスクリプトは、上記の@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のソリューションも楽しみにしています!
ラデク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.