PostGIS에 여러 GPX 파일의 일괄로드를 자동화 하시겠습니까?


9

PostGIS 데이터베이스에 "일괄로드"하고 싶은 50 개 이상의 GPX 파일이 있습니다. 모든 track_points 데이터는 "lat_points"테이블 (lat, long, 고도, 시간 등과 같은 일반적인 GPS 필드 포함)에로드되고 트랙 데이터는 유사하고 적절하게 디자인 된 "트랙"라인 지오메트리 테이블에로드됩니다.

다음 50+를 얻을 때 데이터베이스에 데이터를 직접 입력 할 필요가 없도록이 프로세스를 자동화하고 싶습니다. 개인적으로 파이썬을 사용하여 이러한 종류의 프로세스를 스크립팅하는 것을 선호하지만 어떤 제안이라도 환영합니다.

나의 일반적인 사고 과정은 :

  1. 처리 할 GPX 파일 목록 가져 오기 (표준 Python 도구를 통해 충분히 쉽게)
  2. 각 GPX 파일을 반복하고 필요한 데이터를 추출하여 PostGIS 형식으로 변환
  3. psycopg Python 라이브러리를 사용하여 GPS 데이터를 PostGIS에 삽입

1 단계와 3 단계를 관리 할 수 ​​있다고 생각하지만 데이터 (트랙 및 track_points)를 PostGIS 형식으로 변환하거나 이미 작성된 테이블에 삽입 할 수있는 테이블 형식 인 비교적 간단한 방법 / 라이브러리가 있는지 궁금합니다. .

이미 " 좋은 GPS 트랙 분석 라이브러리가 있습니까? ", " GPS 로그의 지리 데이터베이스를 작성 하는 방법 "및 " python으로 .gpx 데이터를 추출하는 방법 " 을 읽었 으며 GDAL / OGR을 살펴 보았습니다. 그리고 FWTools 파이썬 바인딩이지만 바퀴를 재발 명하고 싶지 않은 사람은 이미 좋은 방법입니다.

답변:


10

순수한 파이썬의 경우 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')

솔루션 주셔서 감사합니다! OD PostgreSQL 드라이버를 선택하기 위해 GDAL Python 바인딩 을 얻는 데 어려움을 겪었 지만 Windows 7에 GDAL & GDAL Python 바인딩 설치에 대한 지침을 따른 후에 마침내 작동했습니다.
RyanKDalton

내가 지금 가지고있는 두 가지 문제 : 1) 모든 GPX 파일이 동일한 파일에 추가되도록 "추가"옵션이 있습니까 (현재로드 된 첫 번째 파일 인 것처럼 보입니다) 2) 방법이 있습니다 새 테이블을 저장할 스키마를 정의하려면?
RyanKDalton

대상 레이어 이름 (테이블 이름)은의 두 번째 매개 변수입니다 CopyLayer. GPX 파일의 이름을 접두사로 추가 했으므로 테이블은 입력 파일 이름만큼 고유해야합니다. ogr2ogr의 "append"옵션은이 시점에서 어떻게해야할지 잘 모르는 까다로운 옵션입니다.
Mike 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로 옮겼습니다. 파이썬 솔루션도 기대됩니다!
radek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.