Tự động tải hàng loạt các tệp GPX vào PostGIS?


9

Tôi đã có hơn 50 tệp GPX mà tôi muốn "tải hàng loạt" vào cơ sở dữ liệu PostGIS. Tất cả dữ liệu track_point sẽ được tải vào bảng "track_point" (với các trường GPS điển hình như lat, long, elevation, time, v.v.) và dữ liệu theo dõi sẽ được tải vào bảng hình học đường "theo dõi" được thiết kế phù hợp.

Tôi muốn tự động hóa quá trình này để khi tôi nhận được hơn 50 tuổi tiếp theo, tôi sẽ không phải nhập dữ liệu vào cơ sở dữ liệu. Cá nhân tôi thích sử dụng Python để tạo các loại quy trình này, nhưng mọi đề xuất đều được chào đón.

Quá trình suy nghĩ chung của tôi là:

  1. Nhận danh sách các tệp GPX để xử lý (đủ dễ dàng thông qua các công cụ Python tiêu chuẩn)
  2. Lặp lại qua từng tệp GPX và trích xuất / chuyển đổi dữ liệu cần thiết sang định dạng PostGIS
  3. Chèn dữ liệu GPS vào PostGIS bằng thư viện Python psycopg

Tôi nghĩ rằng tôi có thể quản lý các bước 1 & 3, nhưng tôi tự hỏi liệu có một phương thức / thư viện tương đối đơn giản nào có thể chuyển đổi dữ liệu (track và track_point) sang định dạng PostGIS hay đơn giản là dạng bảng mà tôi có thể chèn vào bảng đã tạo .

Tôi đã đọc " Có thư viện phân tích theo dõi GPS tốt không? ", " Cách xây dựng cơ sở dữ liệu địa lý của nhật ký GPS? " Và " Cách trích xuất dữ liệu .gpx bằng python " và đã xem xét GDAL / OGR và FWTools Các ràng buộc Python, nhưng không muốn phát minh lại bánh xe là ai đó đã có một phương pháp tốt cho việc này.

Câu trả lời:


10

Đối với Python thuần, sử dụng mô-đun OGR của 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')

Cảm ơn giải pháp! Tôi đã vật lộn để có được các ràng buộc Python GDAL để chọn trình điều khiển OGR PostgreSQL , nhưng sau khi làm theo các hướng dẫn này để Cài đặt Bindings Python GDAL & GDAL trên Windows 7 , cuối cùng tôi đã làm cho nó hoạt động.
RyanKDalton

2 vấn đề tôi hiện đang gặp phải: 1) có tùy chọn "chắp thêm" để tất cả các tệp GPX được nối vào cùng một tệp (hiện tại, nó chỉ xuất hiện như là lần đầu tiên được tải) và 2) có cách để xác định lược đồ để lưu các bảng mới vào?
RyanKDalton

Tên lớp đích (tên bảng) là tham số thứ hai trong CopyLayer. Tôi đã thêm tên từ tệp GPX làm tiền tố, vì vậy các bảng phải là duy nhất như tên tệp đầu vào. Tùy chọn "chắp thêm" từ ogr2ogr là một mẹo khó mà tôi không biết phải làm thế nào vào lúc này.
Mike T

5

Sau khi nghiên cứu bổ sung, tôi đã viết tập lệnh Python gpx2postgis.py của riêng tôi để tự động hóa quá trình nối các tính năng GPX vào các bảng hiện có. Kịch bản sử dụng các phần của tác phẩm được cung cấp bởi @Mike T ở trên và các phần khác. Tôi đã thêm nó vào GitHub nếu bạn muốn tải xuống hoặc đóng góp. Nó tạo ra các lược đồ bảng mới (nếu cần) dựa trên các lớp con GPX đầu vào và nối thêm các tính năng cho các bảng đó.

Mặc dù không phải là giải pháp Python, tôi đã bắt gặp câu hỏi tương tự này trên StackOverflow khiến tôi nhận ra rằng tôi chỉ có thể lặp qua tất cả các tệp GPX của mình và gọi dòng lệnh ogr2ogr để xử lý chúng bằng các loại tính năng GPX .

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

Tôi giải quyết cho GPSBable cho các biến đổi nhanh và bẩn. Và sau đó chuyển đến R cho các công việc lớn hơn. Vì vậy, mong được thấy giải pháp Python quá!
radek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.