[Gfoss] Intersezione layer multipli - spatialite

a.furieri a lqt.it a.furieri a lqt.it
Mer 18 Giu 2014 12:11:07 CEST


On Wed, 18 Jun 2014 11:45:28 +0200, Giuseppe Patti wrote:
> Ciao a tutti.
>
> Ho creato un db spatialite contenente diversi layer di tipo polygon,
> tutti nello stesso sistema di riferimento.
> Vorrei chiedervi se ritenete sia possibile creare una query in grado
> di eseguire l'intersezione tra un elemento specifico di un layer
> (selezionato con where) e tutti gli altri layer senza dover 
> richiamare
> ciascuna coppia, ovvero se ho i layer A,B,C,D e scelgo un elemento di
> A, vorrei evitare di chiamare le intersezioni A,B e A,C e A,D e poi
> eseguire l'unione...in sostanza vorrei fare un "carotaggio" di tutti 
> i
> livelli.
>

SQL e' un linguaggio standard con precisi requisiti sontattici:
uno di questi e' sicuramente che l'elenco completo delle
tavole da interrogare quando si effettua una qualsiasi query
deve sempre essere specificato in modo assolutamente esplcito.

ergo: non e' sicuramente possibile sperare di potere avere qualche
strumento "automagico" in grado di capire che una tavola deve essere
confrontata con tutte le altre.
si lavora sempre necessariamente coppia per coppia, specificandole
una alla volta

un possibile hint utile per semplificare.
nulla vieta di usare una inner sub-query per aggregare piu' di una
tavola in un singolo resultset; dopo di che si puo' usare quel
resultset provvisorio all'interno di un'ulteriore query (outer query).

qualcosa tipo questo (uso i dataset CC-BY del censimento ISTAT):

SELECT 'com' AS object, nome, geom
FROM comuni
UNION ALL
SELECT 'pro' AS object, nome, geom
FROM province
UNION ALL
SELECT 'reg' AS object, nome, geom
FROM regioni;

questa prima query ti crea un elenco "piatto" con tutte le
regioni, province e comuni (MultiPolygon).
ora resta solo da inserire questo frammento come inner-query
dentro ad una query piu' complessa.
come "tavola guida" usero' gli Aeroporti (Point, sempre su
base ISTAT CC-BY)

SELECT a.sigla, a.nome, x.object, x.nome
FROM aeroporti AS a
JOIN (SELECT 'com' AS object, nome, geom
       FROM comuni
       UNION ALL
       SELECT 'pro' AS object, nome, geom
       FROM province
       UNION ALL
       SELECT 'reg' AS object, nome, geom
       FROM regioni) AS x ON (ST_Intersects(a.geom, x.geom) = 1)
WHERE a.sigla = 'PMO';
----------------------------------
Falcone e Borsellino	com	Cinisi
Falcone e Borsellino	pro	Palermo
Falcone e Borsellino	reg	Sicilia

ecco qua: in un sol colpo scopriamo che l'aeroporto
PMO "Falcone e Borsellino" si trova nel comune di
Cinisi, provincia di Palermo, regione Sicilia.

ciao Sandro


Maggiori informazioni sulla lista Gfoss