PostGIS में कई GPX फ़ाइलों के बैच लोड को स्वचालित करना?


9

मुझे 50+ GPX फाइलें मिली हैं जिन्हें मैं PostGIS डेटाबेस में "बैच लोड" करना चाहता हूं। सभी ट्रैक_ पॉइंट डेटा को एक "ट्रैक_ पॉइंट्स" टेबल (लाट, लॉन्ग, एलीवेशन, टाइम आदि जैसे विशिष्ट जीपीएस फील्ड के साथ) और ट्रैक्स डेटा को एक समान, उचित रूप से डिज़ाइन किए गए "ट्रैक्स" लाइन ज्यामिति तालिका में लोड किया जाएगा।

मैं इस प्रक्रिया को स्वचालित करना पसंद करूंगा ताकि जब मैं अपना अगला 50+ प्राप्त करूं, तो मुझे डेटाबेस में डेटा दर्ज करने की आवश्यकता नहीं होगी। मैं व्यक्तिगत रूप से इस प्रकार की प्रक्रियाओं को स्क्रिप्ट करने के लिए पायथन का उपयोग करना पसंद करता हूं, लेकिन किसी भी सुझाव का स्वागत है।

मेरी सामान्य विचार प्रक्रिया इस प्रकार है:

  1. प्रक्रिया के लिए GPX फ़ाइलों की एक सूची प्राप्त करें (मानक पायथन टूल्स के माध्यम से आसान)
  2. प्रत्येक GPX फ़ाइल के माध्यम से लूप करें और PostGIS प्रारूप में आवश्यक डेटा निकालें / परिवर्तित करें
  3. Psycopg Python लाइब्रेरी का उपयोग करके PostGIS में GPS डेटा डालें

मुझे लगता है कि मैं चरण 1 और 3 को प्रबंधित कर सकता हूं, लेकिन सोच रहा हूं कि क्या कोई अपेक्षाकृत सरल विधि / लाइब्रेरी है जो डेटा (पटरियों और Track_point) को पोस्टगिस प्रारूप में, या बस सारणीबद्ध रूप में परिवर्तित करेगी जिसे मैं पहले से बनाई गई तालिका में सम्मिलित कर सकता हूं। ।

मैंने पहले ही पढ़ा है " क्या कोई अच्छा जीपीएस ट्रैक विश्लेषण पुस्तकालय है? ", " जीपीएस लॉग्स का भौगोलिक डेटाबेस कैसे बनाया जाए? ", और " कैसे निकालें। अजगर के साथ डेटा को पीडीएफ ", और 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')

समाधान के लिए धन्यवाद! मैंने OGR PostgreSQL ड्राइवर को चुनने के लिए GDAL पायथन बाइंडिंग प्राप्त करने के लिए संघर्ष किया , लेकिन विंडोज 7 पर GDAL और GDAL पायथन बाइंडिंग को स्थापित करने के इन निर्देशों का पालन करने के बाद , मुझे अंततः काम करना पड़ा।
रयानKalton

2 समस्याएं जो अब मेरे पास हैं: 1) एक "एपेंड" विकल्प है ताकि सभी GPX फाइलें एक ही फाइल में संलग्न हो जाएं (वर्तमान में, ऐसा प्रतीत होता है जैसे कि यह सिर्फ पहली बार भरी हुई है) और 2) एक तरीका है नए तालिकाओं को बचाने के लिए स्कीमा को परिभाषित करने के लिए?
रयानकेलाटन

गंतव्य परत नाम (तालिका नाम) में दूसरा पैरामीटर है CopyLayer। मैंने GPX फ़ाइल से उपसर्ग के रूप में नाम जोड़ा है, इसलिए तालिकाओं को इनपुट फ़ाइल नामों की तरह अद्वितीय होना चाहिए। Ogr2ogr से "परिशिष्ट" विकल्प एक मुश्किल है कि मुझे यकीन नहीं है कि इस समय कैसे करना है।
माइक टी

5

अतिरिक्त शोध के बाद, मैंने अपनी खुद की gpx2postgis.py Python स्क्रिप्ट लिखी, जो GPX सुविधाओं को मौजूदा तालिकाओं में जोड़ने की प्रक्रिया को स्वचालित करती है। स्क्रिप्ट @Mike T द्वारा दिए गए कार्यों के कुछ हिस्सों और अन्य का उपयोग करती है। मैंने इसे GitHub में जोड़ा है यदि आप डाउनलोड करना चाहते हैं या योगदान करना चाहते हैं। यह इनपुट GPX सबलेयर्स के आधार पर नया टेबल स्कीमा (आवश्यकतानुसार आवश्यकतानुसार) बनाता है, और उन तालिकाओं में सुविधाओं को जोड़ता है।

पायथन समाधान नहीं करते हुए, मैं StackOverflow पर इसी तरह का प्रश्न भर आया था जिससे मुझे एहसास हुआ कि मैं अपनी सभी GPX फ़ाइलों के माध्यम से लूप कर सकता हूं और GPX सुविधा प्रकारों का उपयोग करके उन्हें संसाधित करने के लिए ogr2ogr कमांड लाइन को कॉल कर सकता हूं

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

मैं त्वरित और गंदे परिवर्तनों के लिए GPSBable के लिए बस गया। और बाद में बड़ी नौकरियों के लिए आर में चले गए। तो पायथन समाधान भी देखने के लिए आगे देख!
राडेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.