ST_Azimuth() su sequenza di punti, in postgresql 8.3

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
z4k
Reply | Threaded
Open this post in threaded view
|

ST_Azimuth() su sequenza di punti, in postgresql 8.3

z4k
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
[hidden email]
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
Reply | Threaded
Open this post in threaded view
|

Re: ST_Azimuth() su sequenza di punti, in postgresql 8.3

Luca Sigfrido Percich

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
> [hidden email]
> 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

_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
[hidden email]
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