[Gfoss] ST_Azimuth() su sequenza di punti, in postgresql 8.3

Saluti a tutti

Ho una tabella con dentro delle posizioni gps sequenziali e devo per ognuna calcolare l’azimut rispetto alla posizione precedente, questo mi serve per disegnare una freccia di ogni posizione orientata rispetto al senso di marcia(in OpenLayers), una implementazione che pensavo fosse molto diffusa ed invece ho trovato solo questa query in rete:

SELECT round( degrees(ST_Azimuth(pos, LEAD(pos) OVER (PARTITION BY trackid ORDER BY id)))::numeric) AS azimut
FROM gps
ORDER BY id ASC

dove pos è un campo geometry di tipo point con le coordinate di una posizione gps, id è un identificativo incrementato ad ogni nuova posizione inserita e trackid è un identificativo di una sequenza di posizioni contigue(sequenze di posizioni molto vicine hanno lo stesso trackid)
La sudetta query funziona abbastanza bene in postgresql 8.4 con postgis 1.5, ma il problema è che fa uso di PARTITION BY che da quanto
ho visto è una funzionalità(le partizioni) di postgresql che è stata inserita proprio dalla versione 8.4.
Qualcuno ha una idea di come posso modificare la query ed ottenere lo stesso risultato senza utilizzare PARTITION BY? in modo che posso utilizzarla anche in postgresql 8.3 con postgis 1.3, volevo evitare di dover compilare una nuova versione di postgresql sul mio server debian lenny!

Grazie Mille
Stefano

Ciao Stefano,

dovresti joinare ogni riga con la precedente:

select gps_cur.trackid, gps_cur.id, azimut(gps_prev.pos, gps_cur.pos)
from gps as gps_cur inner join gps as gps_prev
on gps_cur.trackid = gps_prev.trackid and gps_cur.id = gps_prev.id + 1

Prova e facci sapere

Sig

Il giorno gio, 30/06/2011 alle 16.48 +0200, Stefano ha scritto:

Saluti a tutti

Ho una tabella con dentro delle posizioni gps sequenziali e devo per
ognuna calcolare l'azimut rispetto alla posizione precedente, questo
mi serve per disegnare una freccia di ogni posizione orientata
rispetto al senso di marcia(in OpenLayers), una implementazione che
pensavo fosse molto diffusa ed invece ho trovato solo questa query in
rete:

SELECT round( degrees(ST_Azimuth(pos, LEAD(pos) OVER (PARTITION BY
trackid ORDER BY id)))::numeric) AS azimut
FROM gps
ORDER BY id ASC

dove pos è un campo geometry di tipo point con le coordinate di una
posizione gps, id è un identificativo incrementato ad ogni nuova
posizione inserita e trackid è un identificativo di una sequenza di
posizioni contigue(sequenze di posizioni molto vicine hanno lo stesso
trackid)
La sudetta query funziona abbastanza bene in postgresql 8.4 con
postgis 1.5, ma il problema è che fa uso di PARTITION BY che da quanto
ho visto è una funzionalità(le partizioni) di postgresql che è stata
inserita proprio dalla versione 8.4.
Qualcuno ha una idea di come posso modificare la query ed ottenere lo
stesso risultato senza utilizzare PARTITION BY? in modo che posso
utilizzarla anche in postgresql 8.3 con postgis 1.3, volevo evitare di
dover compilare una nuova versione di postgresql sul mio server debian
lenny!

Grazie Mille
Stefano

_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
Non inviate messaggi commerciali.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.
518 iscritti al 3.6.2011