PostGIS में GPS पॉजिशन को इंटरपोल कैसे करें


13

मेरे पास हर पांच सेकंड के लिए जीपीएस पोजीशन का एक पोस्टजीआईएस टेबल है:

2011-01-01 00:00:05, POINT(x1,y1)
2011-01-01 00:00:10, POINT(x2,y2)
2011-01-01 00:00:15, POINT(x3,y3)
...

मैं एक ऐसी क्वेरी की तलाश कर रहा हूं जो हर सेकंड के लिए मान (टाइमस्टैम्प और पॉइंट) लौटाएगी। यह मान लेना ठीक है कि अंक एक सीधी रेखा से जुड़े होते हैं।

मैं विशेष रूप से डेटाबेस के अंदर ऐसा करने के लिए एक रास्ता ढूंढ रहा हूं और कुछ बाहरी स्क्रिप्ट लिखकर नहीं।


मुझे लगता है कि आपको इसके लिए पीएल / पायथन फ़ंक्शन लिखना होगा।
पाब्लो


@ पाब्लो: हाँ, सबसे अधिक संभावना है। मैं अपने प्रश्न को समायोजित करूँगा।
UnderDark

जवाबों:


13

अभिनंदन

यदि आपकी मूल तालिका को gps_p कहा जाता है, तो आपके टाइमस्टैम्प फ़ील्ड को ts और अंक को th_geom कहा जाता है:

SELECT (geom).geom,  ts1 + (((geom).path[1]-1) ||' seconds')::interval FROM 
    (SELECT ts1, ST_DumpPoints(ST_Segmentize(geom, ST_Length(geom)/5)) as geom FROM 
        (SELECT ts1, ST_LineFromMultipoint(ST_Union(geom1, geom2)) as geom FROM
            (SELECT p1.ts as ts1, p2.ts as ts2, p1.the_geom as geom1, p2.the_geom as geom2 
                FROM gps_p p1 INNER JOIN gps_p p2 on p1.ts + '00:00:05'::interval = p2.ts
            ) a
        )b
    ) c
WHERE (geom).path[1] <= 5;

यह क्या करता है कि यह बिंदुओं के बीच लाइनें बनाता है और 5 खंडों में रेखा को विभाजित करने के लिए st_selectize का उपयोग करता है।

यदि यह आपके मूल बिंदुओं के बीच ठीक 5 सेकंड नहीं है तो यह काम नहीं करेगा। तो आप बस एक अनुक्रम के साथ एक आईडी फ़ील्ड जोड़ सकते हैं और उपयोग कर सकते हैं कि इसके बजाय id1 + 1 = id2 के साथ तालिका को आत्म-निर्भर करें।

HTH

/ Nicklas


6

यहाँ pl / python के लिए एक कोड ड्राफ्ट है, यह केवल दिए गए दूरी और azimuth द्वारा अंक का अनुवाद करने का मूल विचार है।
Pl / python में postgis फ़ंक्शन को चलाने के लिए एकमात्र समाधान जो मैंने पाया है वह है plpy.prepare और plpy.execute (बहुत उबाऊ) का उपयोग करना।

total_distance=St_distance(P1,P2)
azimuth=st_azimuth(p1,p2)
partial_distance=total_distance / 5

for i in range(4):
  distance = (i+1)*partial_distance
  x_increment=distance*math.cos(math.degrees(azimuth))
  y_increment=distance*math.sin(math.degrees(azimuth))
  ST_translate(P1, x_increment, y_increment)

0

अगर मैं गलत नहीं हूँ ...
आपको कनेक्टिंग लाइन को निर्धारित करने के लिए क्या करना होगा और फिर उस पर एक विभाजन करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.