自动将多个GPX文件批量加载到PostGIS中?


9

我有50多个GPX文件,我想“批量加载”到PostGIS数据库中。所有track_points数据都将被加载到“ track_points”表中(具有典型的GPS字段(例如经度,纬度,海拔,时间等),并且轨道数据将被加载到类似的,适当设计的“ tracks”线几何表中。

我希望自动执行此过程,这样当我获得下一个50岁以上时,就不必手动将数据输入数据库了。我个人更喜欢使用Python编写此类过程的脚本,但是欢迎提出任何建议。

我的总体思路是:

  1. 获取要处理的GPX文件列表(通过标准的Python工具非常容易)
  2. 遍历每个GPX文件,并将必要的数据提取/转换为PostGIS格式
  3. 使用psycopg Python库将GPS数据插入PostGIS

我想我可以管理步骤1和3,但是我想知道是否有一个相对简单的方法/库可以将数据(tracks和track_points)转换为PostGIS格式,或者只是可以插入已创建表格的表格形式。

我已经阅读了“ 是否有一个好的GPS轨迹分析库? ”,“ 如何建立GPS日志的地理数据库? ”和“ 如何使用python提取.gpx数据 ”,并且已经研究了GDAL / OGR和FWTools Python绑定,但不想重蹈覆辙,因为有人已经对此有了很好的方法。

Answers:


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 7上安装GDAL和GDAL Python绑定之后,我终于使它工作了。
RyanKDalton

我现在遇到2个问题:1)是否有一个“ append”选项,以便所有GPX文件都附加到同一个文件中(当前,它似乎只是第一个被加载),以及2)有一种方法定义将新表保存到的架构?
RyanKDalton

目标图层名称(表名称)是中的第二个参数CopyLayer。我已经将GPX文件中的名称添加为前缀,因此表应该与输入文件名一样唯一。ogr2ogr的“ append”选项是一个棘手的选项,目前我不确定该怎么做。
Mike T

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.