[Gfoss] intersezione

Non entro nel merito della tua necessita',
ma la differenza della quantita' dei risultati e' giusta .

nel caso false, viene selezionato ogni elemento che non si interseca con almeno un altro elemento (non con tutti quanti) .

Nel caso true, viene selezionato ogni elemento che si interseca con almeno 1 elemento.

Da qui la differenza del risultato.

Tieni presente che il confronto avviene sempre tra singoli elementi .

Prendi ad esempio l'archivio dei confini comunali della tua regione.

Per fare un caso emblematico: immagina di intersecarlo  con un altro archivio che sia la copia identica del primo archivio, ovvero
una altra copia dei confini comunali, evidentemente ogni comune si intersecherebbe sempre e con un unico elemento dell'altro archivio ovvero quello che rappresenta il medesimo comune.

Pero' se chiedi al sistema di restituirti i records che 
verificano 
st_intersects(comuneA,comuneB) = false
per il primo comune dell'archivio A ti ritornera' tutti i records dall'altro archivio salvo quello corrispondente al medesimo comune.

per tutti te li ritorna tutti meno 1.
e questo succedera' per tutti i records dell'archivio.

per cui te ne ritorna molti.

se invece gli chiedi di darti quelli che si intersecano (con risultato true) allora ne trova 1 solo per ogni singolo confronto.

Da qui la differenza dei tempi e l'out-of-memory.

Ciao,

>Db postgres, devo selezionare due attributi degli elementi di un livello che
>non si intersecano con gli elementi di un altro; eseguo quindi la seguente

>query
>SELECT A.CAMPO1, A.CAMPO2
>FROM TAB1 A, TAB2 B
>WHERE ST_INTERSECTS(A.GEOM, B.GEOM) = FALSE
>
>dopo più di mezz'ora che gira la query mi viene restituito l'errore "out of

>memory...".
>Per prova invece di FALSE ho messo TRUE ed in due minuti ho avuto il
>risultato.
>Gli elementi che non si intersecano da un esame a vista sono pochi.
>In entrambe le tabelle ho creato l'indice sulle geometrie (vedi altro post).

>E' forse sbagliato il metodo che ho utilizzato?

Andrea Peri
. . . . . . . . .
qwerty àèìòù

Scusa,
Tra la prima e la seconda query che indichi non cedo differenze significative.

Premesso che e' non sono sicuro che considerare due edifici uguali se si intersecano sia una strategia valida per considerare due edifici uguali.

Anche perche' nessuno vieta che un edificio si intersechi con due o piu' edifici, a causa di imprecisioni, tolleranze e chissa' che altro.
Specie se operi su dati catastali, temo che avrai problemi di questo tipo.
E quindi alla fine i risultati potrebbero non essere confacenti alle tue attese,

Detto questo, la query che volevi impostare secondo me dovresti provare a farla tramite una subquery,
tipo quella che segue:

ipotizzando che ID sia il campo che identifica univocamente il singolo record (la chiave primaria)

SELECT
    A.FOGLIO,
    A.MAPPALE
FROM
    F1 A,
    ( SELECT M.ID from F1 M, F2 N WHERE ST_INTERSECTS(M.GEOM, N.GEOM)= TRUE ) AS B
WHERE
( A.ID <> B.ID)

La subquery seleziona gli edifici che si intersecano (e che te vuoi considerare uguali),
poi nella query principale escludi dal risultato gli identificativi di tali edifici.

Ciao,

Andrea.

ACQUATI CLAUDIO ha scritto:

Andrea ho capito perfettamente il tuo ragionamento, ho però l'impressione
che nel mio caso la situazione sia un pò diversa provo a spiegarti la mia
esigenza:
ho due livelli della cartografia catastale rappresentanti i fabbricati
relativi ad epoche diverse (chiamiamoli per comodità F1 e F2) voglio avere
foglio e mappale degli edifici che ci sono in F1 ma non ci sono più in F2 .
Quindi con la seguente query pensavo appunto di trovare foglio e mappale da
F1 dove le geometrie non si intersecano

SELECT A.FOGLIO, A.MAPPALE
FROM F1 A, F2 B
WHERE ST_INTERSECTS(A.GEOM, B.GEOM)= FALSE

Penso che sarebbe successo quello che tu dici se avessi fatto una cosa tipo

SELECT *
FROM F1 A, F2 B
WHERE ST_INTERSECTS(A.GEOM, B.GEOM)= FALSE

Che ne dici?

Il giorno 28 gennaio 2010 01.18, Andrea Peri <aperi2007@gmail.com> ha
scritto:

Non entro nel merito della tua necessita',
ma la differenza della quantita' dei risultati e' giusta .

nel caso false, viene selezionato ogni elemento che non si interseca con almeno un altro elemento (non con tutti quanti) .

Nel caso true, viene selezionato ogni elemento che si interseca con almeno 1 elemento.

Da qui la differenza del risultato.

Tieni presente che il confronto avviene sempre tra singoli elementi .

Prendi ad esempio l'archivio dei confini comunali della tua regione.

Per fare un caso emblematico: immagina di intersecarlo con un altro archivio che sia la copia identica del primo archivio, ovvero
una altra copia dei confini comunali, evidentemente ogni comune si intersecherebbe sempre e con un unico elemento dell'altro archivio ovvero quello che rappresenta il medesimo comune.

Pero' se chiedi al sistema di restituirti i records che
verificano
st_intersects(comuneA,comuneB) = false
per il primo comune dell'archivio A ti ritornera' tutti i records dall'altro archivio salvo quello corrispondente al medesimo comune.

per tutti te li ritorna tutti meno 1.
e questo succedera' per tutti i records dell'archivio.

per cui te ne ritorna molti.

se invece gli chiedi di darti quelli che si intersecano (con risultato true) allora ne trova 1 solo per ogni singolo confronto.

Da qui la differenza dei tempi e l'out-of-memory.

Ciao,

Db postgres, devo selezionare due attributi degli elementi di un livello che
non si intersecano con gli elementi di un altro; eseguo quindi la seguente
      query
SELECT A.CAMPO1, A.CAMPO2
      

>FROM TAB1 A, TAB2 B
    

WHERE ST_INTERSECTS(A.GEOM, B.GEOM) = FALSE

dopo più di mezz'ora che gira la query mi viene restituito l'errore "out of
      memory...".
Per prova invece di FALSE ho messo TRUE ed in due minuti ho avuto il
risultato.
Gli elementi che non si intersecano da un esame a vista sono pochi.
In entrambe le tabelle ho creato l'indice sulle geometrie (vedi altro post).
      E' forse sbagliato il metodo che ho utilizzato?
      
--
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------

_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.