[Gfoss] Come riaggregare tratti in contatto tra di loro.

a.furieri a lqt.it a.furieri a lqt.it
Mar 12 Nov 2013 10:39:49 CET


On Tue, 12 Nov 2013 01:37:49 +0100, aperi2007 wrote:
> Ciao Alessandro,
>
> ho provato con una variante del tuo suggerimento:
>
> usando spatialite ho provato a fondere tutto lo shapefile in un unico
> elemento multilinestring.
>
> con questo comando appunto:
>
> create table aggregato_all (pk_uid integer primary key);
> select
> 
> AddGeometryColumn('aggregato_all','geometry',3003,'MULTILINESTRING','XY',1);
> insert into aggregato_all(geometry) select
> ST_Multi(ST_LineMerge(geometry)) from tabella-dei-tratti;
>
> dopodiche' con la elemgeo li ho riscomposti.
> mi aspettavo che ritornasse le linee aggregate sui tratti in contatto
> per touch.
> Invece mi sono rispuntati i tratti originali. :/
>
> Qui forse fraintendo io il significato della LineMerge ?
>

Andrea,

io ho provato queste tre (sempliciotte):

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText(
   'MULTILINESTRING((4 4, 3 3), (2 2, 3 3), (1 1, 2 2))')));
------
LINESTRING(1 1, 2 2, 3 3, 4 4)

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText(
   'MULTILINESTRING((4 4, 3 3), (2 2, 3 3), (1 1, 2 2), (10 10, 20 
20))')));
------
MULTILINESTRING((1 1, 2 2, 3 3, 4 4), (10 10, 20 20))

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText(
   'MULTILINESTRING((4 4, 3 3), (2 2, 3 3), (1 1, 2 2), (2 2, 2 4))')));
------
MULTILINESTRING((1 1, 2 2), (2 2, 3 3, 4 4), (2 2, 2 4))

come vedi, fanno sempre esattamente quel che ci si aspetterebbe.

poi ho pure provato ad importare ed elaborare il tuo test
little_sample_route:

CREATE TABLE sample2 AS
SELECT ST_LineMerge(ST_Collect(geometry))
FROM little_sample_route;
SELECT RecoverGeometryColumn('sample2', 'geom', 0, 'MULTILINESTRING', 
'XY');
.elemgeo

ottengo 9 linestrings, contro i 24 di partenza; quindi anche
in questo caso parrebbe funzionare bene secondo le attese.

poi pero' ho provato con un mio dataset ben piu' massiccio
e complesso (un pezzo di grafo stradale): e questa volta,
proprio come segnali tu, mi sono tornati indietro esattamente
tutti i singoli linestring di origine senza alcuna riaggregazione.

N.B.: e' tutto gestito internamente dalla GEOSLineMerge, splite
passa semplicemente i dati avanti e indietro verso la GEOS.

come ipotesi di interpretazione, parrebbe quindi che sia proprio
la GEOS che quando la situazione e' troppo complicata (= ci sono
troppi case ambigui, tipo biforcazioni e diramazioni, oppure quando
si vengono a creare delle maglie chiuse) evita di operare.
Viceversa opera correttamente quando scopre che e' possibile
riaggregare linee continue "ragionevoli" senza nessuna ambiguita'.

e quindi in ultima analisi si torna al problema della ST_Touches()
per isolare in via preliminare tutti i tratti adiacenti; una specie
di pre-processing.
ma questo non e' un task facile da implementare in puro SQL,
richiederebbe piuttosto un approccio procedurale ricorsivo  ;-)

ciao Sandro


Maggiori informazioni sulla lista Gfoss