أكثر

المسافة بين النقاط المتسلسلة postgre

المسافة بين النقاط المتسلسلة postgre


طاولتي على النحو التالي

1 ؛ "2015-10-02" ؛ "POINT (خطوط الطول ، خطوط الطول) كشكل هندسي" 2 ؛ "2015-10-03" ؛ "POINT (خطوط الطول ، خطوط الطول) كشكل هندسي" 3 ؛ "2015-10-04" ؛ "POINT (خطوط الطول والعرض) كشكل هندسي"

كيف يمكنني إيجاد المسافة بين نقطتين متتاليتين؟

لذا سيكون لدي id = 1 و id = 2 مسافة بينهما = 99 مترًا (يمكن العثور على المسافات بين [1،2] و [2،3] و [3،4] وهكذا

في وقت لاحق أود تجميعها (إذا كانت المسافة أقل من 100 متر إجمالاً)

لم أذهب بعيدا معها

هذا يعطيني المسافة ولكني لا أعرف كيف أحصل على هندسة الصف التالي

حدد st_distance_sphere (t.latlon ، next.latlon) من الاختبار مثل t حيث id = 1

ثم حاولت قراءة المسافة كعمود إضافي ولكن يمكنني معرفة استعلام صحيح

UPDATE test SET dist = ST_Distance (test.latlon، next.geom) من (حدد لاتلون من الاختبار حيث المعرف = test.id + 1) إلى ب ؛

ستكون النتيجة المرجوة

1 ؛ "2015-10-02" ؛ "POINT (خط الطول ، خط الطول) كشكل هندسي" ؛ المسافة بين 1 و 2 2 ؛ "2015-10-03" ؛ "POINT (خطوط الطول ، خطوط الطول) كشكل هندسي" ؛ المسافة بين 2 و 3 3 ؛ "2015-10-04" ؛ "POINT (خطوط الطول ، خطوط العرض) كشكل هندسي" ؛ المسافة بين 3 و 4

سيعطيك هذا جدولًا به رقمين معرّفين ومسافة بينهما.

حدد b.id ، a.id ، a.wkb_geometry <-> b.wkb_geometry من اختبار JOIN test b ON (a.id = b.id + 1) ؛

<-> يمنحك مسافة bbox ، قد تستخدمها<#>كذلك.


هناك طريقة أكثر عمومية لحل هذه المشكلة (لا تعتمد على وجود معرف تسلسلي بدون نقاط مفقودة) وهي استخدام PostgreSQLبطئوظيفة النوافذ (انظر المستندات).

في هذه الحالة ، الأمر بسيط مثل:

حدد المعرف ، dt ، ST_Distance (geom ، lag (geom ، 1) OVER (ORDER by dt ASC)) من نقاط الاختبار ؛

أيندهو العمود الذي يحتوي على قيم التاريخ والوقت. كيف ، إذن ، لتجميع النقاط؟ طريقة واحدة لاستخداممجموعكدالة نافذة لمعرفة عدد الفواصل التي تمت مواجهتها حتى الآن (أنا أستخدم 0.64 كحد أدنى هنا).

حدد المعرف ، dt ، dist ، SUM (الحالة عند التوزيع> 0.64 ثم 1 بخلاف ذلك 0 النهاية) أكثر من (ORDER BY dt ASC) مثل clustr FROM (SELECT id، dt، ST_Distance (geom، lag (geom، 1) over (ORDER BY dt ASC)) حسب التوزيع من نقاط الاختبار) متر مربع ؛

بالنسبة لنقاط الاختبار الخاصة بي ، تبدو النتيجة الآن كما يلي:

معرف | dt | توزيع | clustr ---- + ------------------------------- + ------------ ------- + -------- 1 | 2015-11-11 08: 15: 37.996556-05 | | 0 2 | 2015-11-11 08: 15: 39.237025-05 | 0.411143570472674 | 0 3 | 2015-11-11 08: 15: 39.760647-05 | 0.18676903202556 | 0 4 | 2015-11-11 08: 15: 40.123549-05 | 0.53587461849279 | 0 5 | 2015-11-11 08: 15: 40.429877-05 | 0.699859353108215 | 1 6 | 2015-11-11 08: 15: 40.729668-05 | 0.363468389297844 | 1 7 | 2015-11-11 08: 15: 41.028922-05 | 0.649386937777059 | 2 8 | 2015-11-11 08: 15: 41.32032-05 | 0.675600276096486 | 3

الآن ، إذا كنت أرغب في تجميعها ، يمكنني الاختيار من بين ما سبقحدد ST_Collect (geom) من الاستعلام_أعلى المجموعة حسب المجموعة، او ربماST_MakeLine (ترتيب geom حسب dt ASC) تجميع حسب المجموعة.


شاهد الفيديو: Топ ошибок со стороны разработки при работе с PostgreSQL. Алексей Лесовский Data Egret