[Gfoss] spatialite difference

Volevo chiedere come utilizzire la funzione Difference in spatialite,
per capire se è utile al mio problema. Ho una tabella che contiene
l'uso del suolo di una provincia che ha il brutto difetto di finire
anche all'interno di un'altra provincia. Vorrei rimuovere le parti in
eccesso utilizzando la funzione sopra citata e la geometria della
provincia in cui ricadono le geometrie di troppo. Ho provato così

create table test_diff as select a.CODICE_NUM,
Difference(a.Geometry,b.Geometry) from uso_suolo as a, provincia as b

ma mi ha restituito una tabella con solo il codice e senza geometria.
Ho cercato sul web ma non trovato nulla (magari ho cercato male io) al
di fuori del SQL functions reference list ma nessun esempio

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Thu, 28 Apr 2011 11:31:55 +0200, Luca Delucchi wrote

Volevo chiedere come utilizzire la funzione Difference in spatialite,
per capire se è utile al mio problema. Ho una tabella che contiene
l'uso del suolo di una provincia che ha il brutto difetto di finire
anche all'interno di un'altra provincia. Vorrei rimuovere le parti in
eccesso utilizzando la funzione sopra citata e la geometria della
provincia in cui ricadono le geometrie di troppo.

la ST_Difference() non sembra la funzione più indicata
per fare quello che intendi tu.
ST_Difference(g1, g2) valuta le due geometrie e genera
una terza geometria che rappresenta la "differenza"
tra le due precedenti (g1-g2).
Quindi, se un uso_suolo è completamente compreso
entro la tua provincia ... ritornerà un bel NULL :frowning:
e non credo proprio che sia quello che tu cerchi.

direi che a te serve la ST_Intersection(), che invece
valuta due geometrie e ritorna la porzione comune ad
entrambe; quindi nel tuo caso 'taglia via' le porzioni
di uso_suolo fuori provincia.

Ho provato così

create table test_diff as select a.CODICE_NUM,
Difference(a.Geometry,b.Geometry) from uso_suolo as a, provincia as b

ma mi ha restituito una tabella con solo il codice e senza geometria.

non credo proprio: ti avrà restituito piuttosto una tabella
con il codice correttamente valorizzato, e con le geometrie
tutte impostate a NULL (vedi sopra).

N.B. se usi brutalmente CREATE TABLE .. AS SELECT ..
troverai inizialmente dei generici BLOB: per ottenere
delle 'vere' geometrie dovrai poi eseguire:
SELECT RecoverGeometryColumn()
e la colonna geom avrà un nome orribile :frowning:

molto meglio se prima ti crei a modo la tavola
target con la sua geometria, e poi esegui:
INSERT INTO ... (...)
SELECT .... FROM ...;

Ho cercato sul web ma non trovato nulla (magari ho cercato male io)
al di fuori del SQL functions reference list ma nessun esempio

http://www.gaia-gis.it/spatialite/spatialite-tutorial-2.3.1.html#t4.3

BTW tutte queste funzioni (Difference, Union, Intersection etc)
sono esattamente identiche a quelle di PostGIS :slight_smile:

ciao Sandro

Il 28 aprile 2011 13:07, <a.furieri@lqt.it> ha scritto:

direi che a te serve la ST_Intersection(), che invece
valuta due geometrie e ritorna la porzione comune ad
entrambe; quindi nel tuo caso 'taglia via' le porzioni
di uso_suolo fuori provincia.

ok, ma avendo solo la geometria corretta della provincia a fianco mi
sono creato la geometria inversa.... speravo che differenze fosse la
soluzione adatta

N.B. se usi brutalmente CREATE TABLE .. AS SELECT ..
troverai inizialmente dei generici BLOB: per ottenere
delle 'vere' geometrie dovrai poi eseguire:
SELECT RecoverGeometryColumn()
e la colonna geom avrà un nome orribile :frowning:

molto meglio se prima ti crei a modo la tavola
target con la sua geometria, e poi esegui:
INSERT INTO ... (...)
SELECT .... FROM ...;

ok
Risolto il problema precedente ho provato allora a fare un
merge/patch/union delle due tabelle ma ho ricevuto uno strano errore,
non so però se la query è corretta

spatialite> create table uso_suolo_union(
       ...> pk INTEGER PRIMARY KEY AUTOINCREMENT,
       ...> codice_baldo TEXT NOT NULL);
spatialite> select
addgeometrycolumn('uso_suolo_union','geometry',32632,'POLYGON','XY',1)
       ...> ;
addgeometrycolumn('uso_suolo_union','geometry',32632,'POLYGON','XY',1)
1

insert into uso_suolo_union(codice_baldo,geometry) select
a.codice_baldo, GUnion(a.Geometry,b.Geometry) from
uso_suolo_verona2007 as a, uso_suolo_trentino2008 as b union all
select b.codice_baldo, GUnion(a.Geometry,b.Geometry) from
uso_suolo_trentino2008 as b, uso_suolo_verona2007 as a;

ciao Sandro

--
ciao e grazie
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Thu, 28 Apr 2011 17:17:59 +0200, Luca Delucchi wrote

Risolto il problema precedente ho provato allora a fare un
merge/patch/union delle due tabelle ma ho ricevuto uno strano errore,
non so però se la query è corretta

la query sembra pulita: ho provato a farne
girare una strettamente analoga e funziona
senza problemi.

ma a te quale errore darebbe ?
non mi pare di vederlo riportato nel tuo post :slight_smile:

ciao Sandro

Il 28 aprile 2011 17:44, <a.furieri@lqt.it> ha scritto:

la query sembra pulita: ho provato a farne
girare una strettamente analoga e funziona
senza problemi.

bene questo mi fa piacere

ma a te quale errore darebbe ?

SQL error: disk I/O error

per informazione sono tabelle abbastanza pesanti (due usi del suolo provinciali)

non mi pare di vederlo riportato nel tuo post :slight_smile:

scusa l'ho perso nel copia e incolla

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Thu, 28 Apr 2011 17:48:54 +0200, Luca Delucchi wrote

SQL error: disk I/O error

LOL :smiley:
mai visto prima ...

SQLITE_IOERR
This value is returned if the operating system informs
SQLite that it is unable to perform some disk I/O
operation. This could mean that there is no more space
left on the disk.

Molto probabilmente hai "allagato" il disco :slight_smile:
... magari è il caso di aggiungere qualche
clausola WHERE alle tue SELECT per evitare che
ti esploda *tutto* il prodotto cartesiano delle
due tavole in JOIN

ciao Sandro

2011/4/28 <a.furieri@lqt.it>:

LOL :smiley:
mai visto prima ...

SQLITE_IOERR
This value is returned if the operating system informs
SQLite that it is unable to perform some disk I/O
operation. This could mean that there is no more space
left on the disk.

Molto probabilmente hai "allagato" il disco :slight_smile:

no no

df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/md2 861G 268G 549G 33% /home

-rwxr-xr-x 1 lucadelu luca 568M 2011-04-29 08:45 montebaldo.sqlite

... magari è il caso di aggiungere qualche
clausola WHERE alle tue SELECT per evitare che
ti esploda *tutto* il prodotto cartesiano delle
due tavole in JOIN

eh ma a me servono entrambe....che faccio riprovo?

ciao Sandro

--
ciao
Luca

http://gis.cri.fmach.it/delucchi/
www.lucadelu.org

On Fri, 29 Apr 2011 11:13:33 +0200, Luca Delucchi wrote

> Molto probabilmente hai "allagato" il disco :slight_smile:

no no

df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/md2 861G 268G 549G 33% /home

-rwxr-xr-x 1 lucadelu luca 568M 2011-04-29 08:45 montebaldo.sqlite

un errore di I/O potrebbe anche dipendere da un
malfunzionamento HW :frowning:

> ... magari è il caso di aggiungere qualche
> clausola WHERE alle tue SELECT per evitare che
> ti esploda *tutto* il prodotto cartesiano delle
> due tavole in JOIN
>

eh ma a me servono entrambe....che faccio riprovo?

magari puoi verificare prima la sola SELECT (senza
insert) per stimare che razza di output genera: oppure
puoi provare con un dataset limitato per verificare
se lavora veramente come ti aspetti

ciao Sandro