Sto riscontrando difficoltà con una query. Ho una rete di linestring, ognuno con un valore nella colonna n_type. Questa può essere una delle poche opzioni. Vorrei generare una nuova tabella che raggruppa tutte le stringhe dello stesso tipo e che formano una linea continua.
Prima:
Dopo:
Ecco cosa ho finora. Restituisce risultati ma non hanno alcun senso: i tipi non corrispondono e restituisce troppe funzionalità.
Si noti inoltre che ho definito "continuo" come qualsiasi linea entro 5 piedi dal suo vicino e che si incontrano con un angolo inferiore a 30 gradi.
WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
SELECT 1 AS i,
pk_uid,
n_type,
geom
FROM network
WHERE n_type != 'none'
UNION ALL
SELECT a.i + 1,
b.pk_uid,
b.n_type,
b.geom
FROM network b, all_links a
WHERE b.n_type = a.n_type
AND b.geom <#> a.geom <= 5 --lines are continuous if within 5 feet of neighbor
AND ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 ) --only take links within 30 degrees of the same angle
SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type
Ho assunto che una query ricorsiva sia la strada da percorrere, ma sono felice di essermi smentito. I ricorsivi sono un po 'difficili da stimolare.
Modifica: dovrei anche aggiungere che ho già provato ad aggregare usando ST_Union e ST_Linemerge e quindi a scaricare il risultato. Questo tipo di funzionamento funziona, ma non tiene conto di incroci> 30 gradi e inoltre non può rispettare la tolleranza di cinque piedi per la connettività.
a.pk_uid != b.pk_uid