[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