পোস্টজিআইএসে জিপিএস পজিশনগুলিকে কীভাবে বিভক্ত করবেন


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)
...

আমি এমন একটি ক্যোয়ারী খুঁজছি যা প্রতি সেকেন্ডের জন্য মান (টাইমস্ট্যাম্প এবং পয়েন্ট) ফেরত দেবে। এটি ধরে নেওয়া ঠিক আছে যে পয়েন্টগুলি একটি সরলরেখার সাথে সংযুক্ত রয়েছে।

আমি বিশেষভাবে কোনও বাহ্যিক স্ক্রিপ্ট না লিখে ডাটাবেসের ভিতরে এটি করার উপায় খুঁজছি।


আমি মনে করি যে এর জন্য আপনাকে একটি পিএল / পাইথন ফাংশন লিখতে হবে।
পাবলো

1
পোস্টগিসের ক্রিয়াকলাপে এখানে একটি স্নিপেট রয়েছে যা সাহায্য করতে পারে: bostongis.com/postgis_translate.snippet
পাবলো

@ পাবলো: হ্যাঁ, সম্ভবত আমি আমার প্রশ্ন সামঞ্জস্য করব।
underdark

উত্তর:


13

আরে

যদি আপনার আসল টেবিলটিকে জিপিএস_পি বলা হয় তবে আপনার টাইমস্ট্যাম্প ক্ষেত্রটিকে টিএস বলা হয় এবং পয়েন্টগুলি 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_segmentize ব্যবহার করে।

এটি যদি আপনার মূল পয়েন্টগুলির মধ্যে ঠিক 5 সেকেন্ড না হয় তবে এটি কাজ করবে না। তারপরে আপনি কেবল একটি সিকোয়েন্স সহ একটি আইডি ফিল্ড যুক্ত করতে পারেন এবং এর পরিবর্তে id1 + 1 = id2 দিয়ে টেবিলটিতে স্বতন্ত্র যোগে এটি ব্যবহার করতে পারেন।

আছে HTH

/ Nicklas


6

এখানে pl / পাইথনের কোড কোড রয়েছে, এটি নির্দিষ্ট দুরত্ব এবং অজিমুথ দ্বারা পয়েন্টগুলি অনুবাদ করার মূল ধারণা।
Plg / python এ পোস্টগ্রিস ফাংশনগুলি চালানোর জন্য আমার পাওয়া একমাত্র সমাধানটি হল 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

যদি আমার ভুল না হয় ...
আপনার যা করা দরকার তা হ'ল সংযোগকারী লাইনটি নির্ধারণ করা এবং তারপরে একটি বিভাজন করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.