Daha çox

Postgre ardıcıl nöqtələr arasındakı məsafə


Masam aşağıdakı kimidir

1; "2015-10-02"; "POINT (lat, lon) həndəsə olaraq" 2; "2015-10-03"; "POINT (lat, lon) həndəsə olaraq" 3; "2015-10-04"; "POINT (lat, lon) həndəsə kimi"

İki ardıcıl nöqtə arasındakı məsafəni necə tapa bilərəm?

Buna görə id = 1 və id = 2 aralarında = 99m məsafə olardı (məsafələr [1,2], [2,3], [3,4] və sair arasında tapılardı

Daha sonra onları birləşdirmək istərdim (əgər məsafə <100m məcmu olarsa)

Bununla çox uzağa getmədim

Bu mənə məsafə verir, amma növbəti sıranın həndəsəsini necə əldə edəcəyimi bilmirəm

İd = 1 olduğu halda testdən st_distance_sphere (t.latlon, next.latlon) seçin.

Sonra məsafəni əlavə bir sütun olaraq oxumağa çalışdım, amma düzgün bir sorğu tapa bildim

YENİLƏNİŞ testi SET dist = ST_Distance (test.latlon, next.geom) FROM (SELECT latlon FROM WHERE id = test.id + 1) to b;

İstədiyiniz nəticə olardı

1; "2015-10-02"; "Həndəsə olaraq POINT (lat, lon)"; 1 ilə 2 arasındakı məsafə 2; "2015-10-03"; "Həndəsə olaraq POINT (lat, lon)"; 2 arasındakı məsafə və 3 3; "2015-10-04"; "Həndəsə olaraq POINT (lat, lon)"; 3 ilə 4 arasındakı məsafə

Bu, iki id ilə bir masa verəcək və bu ikisi arasındakı məsafə.

SEÇİN b.id, a.id, a.wkb_geometry <-> b.wkb_geometry FROM a JOIN test b ON (a.id = b.id + 1);

<-> sizə bbox məsafəsi verir, istifadə edə bilərsiniz<#>həmçinin.


Bunu həll etmək üçün daha ümumi bir yol (itkin nöqtələri olmayan ardıcıl idə sahib olmağa əsaslanmır) PostgreSQL -dən istifadə etməkdir.gecikməkpəncərə açma funksiyası (sənədlərə baxın).

Bu vəziyyətdə bu qədər sadədir:

Test nöqtələrindən, id, dt, ST_Distance (geom, lag (geom, 1) OVER (dt ASC SİFARİŞ)) SEÇİN;

haradadttarix-saat dəyərlərinizi tutan sütundur. Bəs nöqtələri necə birləşdirmək olar? Bir yol istifadə etməkdircəmbir pəncərə funksiyası olaraq indiyə qədər neçə fasilə ilə qarşılaşıldığını görmək üçün (0.64 burada bir eşik olaraq istifadə edirəm).

ID, dt, dist, SUM SELECT (VAR> 0.64 SONRASINDA 1 BAŞQA 0 SON) VAR (SİFARİŞ dt ASC) FROM (SELECT id, dt, ST_Distance (geom, lag (geom, 1) OVER (ORDER BY) dt ASC)) AS dist FROM testpoints) sq;

Test nöqtələrim üçün nəticə indi belə görünür:

id | dt | dist | 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

İndi bunları toplamaq istəsəm, yuxarıdakılardan seçə bilərəmSELECT ST_Collect (geom) FROM query_above GROUP BY clustrvə ya bəlkə dəST_MakeLine (geom ORDER BY dt ASC) GROUP BY clustr.


Videoya baxın: Test. skalyar vektor vektorlar (Oktyabr 2021).