[Gfoss] elaborazione grafo Postgis

Forse è una banalità ma non riesco a risolvere un problema di elaborazione con
postgis (o con altro se qualcuno mi suggerisce un mezzo migliore)
Ho necessità di creare un grafico di spostamenti pendolari in cui linee rette
colleghino il centroide di alcuni comuni con gli i centroidi di altri comuni
(i centroidi li ho come tabella a se di postgres) ed in cui associare a tali
linee dei valori di una tabella.
Il problema principale è come posso generare le linee? E come posso portarmi
dietro i codici che identificano i centroidi unendoli (ovvero in modo che ogni
linea abbia il codice di entrambi i centroidi che unisce)?

Spero di non essere stato troppo caotico nella domanda e grazie in anticipo.

Buona giornata a tutti.
Iacopo Zetti

P.S. avevo inviato lo stesso messaggio stamani, ma mi par di capire non sia
arrivato (sicuramente ho fatto io qualche errore), se arriva 2 volte mi scuso
in anticipo

iacopo ha scritto:

Forse è una banalità ma non riesco a risolvere un problema di elaborazione con
postgis (o con altro se qualcuno mi suggerisce un mezzo migliore)
Ho necessità di creare un grafico di spostamenti pendolari in cui linee rette
colleghino il centroide di alcuni comuni con gli i centroidi di altri comuni
(i centroidi li ho come tabella a se di postgres) ed in cui associare a tali
linee dei valori di una tabella.
Il problema principale è come posso generare le linee? E come posso portarmi
dietro i codici che identificano i centroidi unendoli (ovvero in modo che ogni
linea abbia il codice di entrambi i centroidi che unisce)?

Le linee congiungenti i centroidi le potresti generare con una
triangolazione di Delaunay. Il secondo problema consiste nella
costruzione di una topologia di rete, dove le tue linee sono gli "archi"
e i centroidi i "nodi". A mio avviso, e' consigliabile utilizzare un
client desktop per realizzare tali operazioni. Per restare
all'attualita', volendoti consigliare un'applicazione, farei un
"ballottaggio" tra GRASS e gvSIG+Sextante. :slight_smile:

Saluti

--
Antonio Falciano
http://www.linkedin.com/in/antoniofalciano

Antonio Falciano ha scritto:

iacopo ha scritto:

Forse è una banalità ma non riesco a risolvere un problema di elaborazione con
postgis (o con altro se qualcuno mi suggerisce un mezzo migliore)
Ho necessità di creare un grafico di spostamenti pendolari in cui linee rette
colleghino il centroide di alcuni comuni con gli i centroidi di altri comuni
(i centroidi li ho come tabella a se di postgres) ed in cui associare a tali
linee dei valori di una tabella.
Il problema principale è come posso generare le linee? E come posso portarmi
dietro i codici che identificano i centroidi unendoli (ovvero in modo che ogni
linea abbia il codice di entrambi i centroidi che unisce)?

Le linee congiungenti i centroidi le potresti generare con una
triangolazione di Delaunay. Il secondo problema consiste nella
costruzione di una topologia di rete, dove le tue linee sono gli "archi"
e i centroidi i "nodi". A mio avviso, e' consigliabile utilizzare un
client desktop per realizzare tali operazioni. Per restare
all'attualita', volendoti consigliare un'applicazione, farei un
"ballottaggio" tra GRASS e gvSIG+Sextante. :slight_smile:

Qualcuno mi faceva notare che la Delaunay triangulation e' presente
anche nell'ottima fTools in Qgis. Insomma, hai un ampio ventaglio di
opzioni (la tornata elettorale non e' ancora conclusa...): tocca a te
scegliere l'applicazione che ti e' piu' congeniale!

ciao

--
Antonio Falciano
http://www.linkedin.com/in/antoniofalciano

Per quello che ne so la triangolazione non va bene dato che a me serve una
linea che colleghi ogni centroide con tutti gli altri centroidi, cosa che
ovviamente la triangolazione non fa (e non credo di poter controllare il
funzionamento della delaunay).
Spero di sbagliarmi però!

iacopo

On Tuesday 09 June 2009 10:43:39 Antonio Falciano wrote:

iacopo ha scritto:
> Forse è una banalità ma non riesco a risolvere un problema di
> elaborazione con postgis (o con altro se qualcuno mi suggerisce un mezzo
> migliore) Ho necessità di creare un grafico di spostamenti pendolari in
> cui linee rette colleghino il centroide di alcuni comuni con gli i
> centroidi di altri comuni (i centroidi li ho come tabella a se di
> postgres) ed in cui associare a tali linee dei valori di una tabella.
> Il problema principale è come posso generare le linee? E come posso
> portarmi dietro i codici che identificano i centroidi unendoli (ovvero in
> modo che ogni linea abbia il codice di entrambi i centroidi che unisce)?

Le linee congiungenti i centroidi le potresti generare con una
triangolazione di Delaunay. Il secondo problema consiste nella
costruzione di una topologia di rete, dove le tue linee sono gli "archi"
e i centroidi i "nodi". A mio avviso, e' consigliabile utilizzare un
client desktop per realizzare tali operazioni. Per restare
all'attualita', volendoti consigliare un'applicazione, farei un
"ballottaggio" tra GRASS e gvSIG+Sextante. :slight_smile:

Saluti

iacopo ha scritto:

ovviamente la triangolazione non fa (e non credo di poter controllare il
funzionamento della delaunay).

Perche' no?
--
Paolo Cavallini: http://www.faunalia.it/pc

iacopo ha scritto:

Per quello che ne so la triangolazione non va bene dato che a me serve una
linea che colleghi ogni centroide con tutti gli altri centroidi, cosa che
ovviamente la triangolazione non fa (e non credo di poter controllare il
funzionamento della delaunay).
Spero di sbagliarmi però!

Ok, non avevo ben compreso il problema. La Delaunay ti unirebbe solo i
punti vicini... quindi ti serve un qualcosa del tipo Distance Matrix che
ti disegni gli archi. Si tratterebbe di modificare leggermente
l'estensione... e risolveresti anche il problema degli ID dei nodi.

--
Antonio Falciano
http://www.linkedin.com/in/antoniofalciano

Ti conviene scrivere un programmino in plpgsql.
Prima preparati una tabella linee con due campi interi per accogliere le id dei nodi e un campo geometria LINESTRING.

SELECT * FROM nodi;
LOOP sui record selezionati
        SELECT * FROM nodi WHERE nodi.id != nodo_corrente.id
        LOOP sui record selezionati
        INSERT INTO linee (nodo_id_1,nodo_id_2,geometria) VALUES
        (
                nodo_corrente_loop_padre.id,
                nodo_corrente_loop_figlio.id,
                funzione_postgis_per_ricavare_geometria_linea
                (
                        nodo_corrente_loop_padre.geometria,
                        nodo_corrente_loop_figlio.geometria
                )
        );
        FINE LOOP;
FINE LOOP;

Se ti vuoi divertire a scrivere tu la funzione, NON leggere le righe sottostanti!

Saluti
....................pg

Pietro Giannini
Bytewise srl - Area GIS
41°50'38.58"N 12°29'13.39"E

----------------------------------------------------------------
CREATE OR REPLACE FUNCTION test_linee() RETURNS void AS
$BODY$
DECLARE
r_res RECORD;
r_subres RECORD;
i_gid INT;

BEGIN
        i_gid := 0;
        FOR r_res IN SELECT * FROM punti LOOP
                FOR r_subres IN SELECT * FROM punti WHERE id != r_res.id LOOP
                        RAISE NOTICE 'linea tra punto % e punto % ', r_res.id, r_subres.id;
                        INSERT INTO linee(gid,p1,p2,the_geom) VALUES
                                (i_gid,r_res.id, r_subres.id,linefromtext(
                                        'LINESTRING(' || x(r_res.the_geom) || ' ' || y(r_res.the_geom) || ',' ||
                                        x(r_subres.the_geom) || ' ' || y(r_subres.the_geom) || ')'
                                ));
                        i_gid := i_gid+1;
                END LOOP;
        END LOOP;
END;
$BODY$
LANGUAGE plpgsql;

SELECT test_linee();
----------------------------------------------------------------

-----Messaggio originale-----
Da: gfoss-bounces@faunalia.it [mailto:gfoss-bounces@faunalia.it] Per conto di iacopo
Inviato: martedì 9 giugno 2009 11.19
A: Gfoss@faunalia.it
Oggetto: Re: [Gfoss] elaborazione grafo Postgis

Per quello che ne so la triangolazione non va bene dato che a me serve una
linea che colleghi ogni centroide con tutti gli altri centroidi, cosa che
ovviamente la triangolazione non fa (e non credo di poter controllare il
funzionamento della delaunay).
Spero di sbagliarmi però!

iacopo

On Tuesday 09 June 2009 10:43:39 Antonio Falciano wrote:

iacopo ha scritto:
> Forse è una banalità ma non riesco a risolvere un problema di
> elaborazione con postgis (o con altro se qualcuno mi suggerisce un mezzo
> migliore) Ho necessità di creare un grafico di spostamenti pendolari in
> cui linee rette colleghino il centroide di alcuni comuni con gli i
> centroidi di altri comuni (i centroidi li ho come tabella a se di
> postgres) ed in cui associare a tali linee dei valori di una tabella.
> Il problema principale è come posso generare le linee? E come posso
> portarmi dietro i codici che identificano i centroidi unendoli (ovvero in
> modo che ogni linea abbia il codice di entrambi i centroidi che unisce)?

Le linee congiungenti i centroidi le potresti generare con una
triangolazione di Delaunay. Il secondo problema consiste nella
costruzione di una topologia di rete, dove le tue linee sono gli "archi"
e i centroidi i "nodi". A mio avviso, e' consigliabile utilizzare un
client desktop per realizzare tali operazioni. Per restare
all'attualita', volendoti consigliare un'applicazione, farei un
"ballottaggio" tra GRASS e gvSIG+Sextante. :slight_smile:

Saluti

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

Grazie a tutti per i consigli.
Alla fine ho usato questa soluzione da riga di comando di postgres (ci sono
arrivato dai suggerimenti sulla matrice distanze).

CREATE TABLE centroidi_bis AS SELECT nome, codcom, the_geom FROM centroidi;
CREATE TABLE centroidi2linee AS
SELECT ST_MakeLine (a.the_geom, b.the_geom) AS the_geom, a.nome, a.codcom ||
b.codcom AS codice
FROM centroidi a, centroidi_bis b;
ALTER TABLE centroidi2linee ADD COLUMN count SERIAL PRIMARY KEY;
DROP TABLE centroidi_bis;

Il campo codcom è il codice istat dei comuni che a me fa comodo concatenare
per avere un codice univoco per ogni linea che poi collego proprio ad una
tabella di dati ISTAT da censimento.
La soluzione passa per una duplicazione della tabella che poi viene
cancellata. Il suo pregio è che lanciata da riga di comando è rapidissima
(fatta con i 287 comuni della Toscana).

Iacopo