Intersezione layer multipli - spatialite

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Intersezione layer multipli - spatialite

Giuseppe Patti
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.

Grazie in anticipo
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666+40 iscritti al 5.6.2014
Reply | Threaded
Open this post in threaded view
|

Re: Intersezione layer multipli - spatialite

a.furieri
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
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666+40 iscritti al 5.6.2014
Reply | Threaded
Open this post in threaded view
|

Re: Intersezione layer multipli - spatialite

Giuseppe Patti
Lungi da me voler trasgredire la grammatica di SQL!

Con UNION ALL, la query che avevo in mente si semplifica notevolmente.

Grazie per la dritta, e complimenti ancora per l'ottimo lavoro fatto con
Spatialite



Il 18/06/2014 12.11, [hidden email] ha scritto:

> 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
>
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
666+40 iscritti al 5.6.2014