[Gfoss] Corretta creazione di una view spatialite

Salve a tutti,
chiedo un parere di tipo concettuale su una view spatialite.

Se ho una tabella di tipo punto alla quale corrispondo tramite pkid e fkid
dei record in una tabella alfanumerica.

Quindi per 1 punto N record alfanumerici.

Ho creato una view a partire dalla tabella alfanumerica e tramite gli id
gli collego il campo geometrico.

Mi aspetto di avere una tabella con tutti i record alfanumerici con
collegati i punti che in un visualizzatore appaiono 3 punti e la tabella ne
rispecchi la struttura.

Con Qgis ottengo invece questo risultato di visualizzazione

https://www.dropbox.com/sh/00podqheenurjh1/AAAxWmia3kpFgf07jz1clskxa?dl=
0&preview=bug_view.PNG

Qui c'è il DB che ho creato:
https://www.dropbox.com/sh/00podqheenurjh1/AAAxWmia3kpFgf07jz1clskxa?dl=0

Prima di segnalare il bug vorrei avere un parere lato spatialite.

Grazie
Luca

On Mon, 7 Nov 2016 21:31:02 +0100, Luca Mandolesi wrote:

Salve a tutti,
chiedo un parere di tipo concettuale su una view spatialite.

Se ho una tabella di tipo punto alla quale corrispondo tramite pkid e fkid
dei record in una tabella alfanumerica.

Quindi per 1 punto N record alfanumerici.

Ho creato una view a partire dalla tabella alfanumerica e tramite gli id
gli collego il campo geometrico.

Mi aspetto di avere una tabella con tutti i record alfanumerici con
collegati i punti che in un visualizzatore appaiono 3 punti e la tabella ne
rispecchi la struttura.

Con Qgis ottengo invece questo risultato di visualizzazione

https://www.dropbox.com/sh/00podqheenurjh1/AAAxWmia3kpFgf07jz1clskxa?dl=
0&preview=bug_view.PNG

Qui c'è il DB che ho creato:

https://www.dropbox.com/sh/00podqheenurjh1/AAAxWmia3kpFgf07jz1clskxa?dl=0

Prima di segnalare il bug vorrei avere un parere lato spatialite.

Luca,

mi pare che la tua Spatial View sia concettualmente errata:
questo e' il codice SQL che stai usando:

CREATE VIEW edifici_materiali_view AS
SELECT a.ROWID AS ROWID, a. pkuid AS pkuid,
     a.tipo_edificio AS tipo_edificio, a.grado_rischio AS grado_rischio,
     a.geom AS geom, b.ROWID AS ROWID_1,
     b.id_mat_pk AS id_mat_pk, b.tipo_materiale AS tipo_materiale,
     b.id_ed_fk AS id_ed_fk
FROM edifici AS a
JOIN materiali AS b ON (a.pkuid = b.id_ed_fk);

da cui risulta chiarissimo che ROWID corrisponde alla PK di
"edifici", mentre ROWID_1 corrisponde alla PK di "materiali".

giusto un commento: entrambe le tavole hanno una PK
debitamente dichiarata, cioe' rispettivamente
edifici.pkuid e materiali.id_mat_pk, e sono ambedue
di tipo INTEGER.
che bisogno hai di tirarti dietro _anche_ i ROWID di
queste due tavole ?
per SQLite quando esiste una PK di tipo INTEGER e'
implicito che quel valore diventa anche automaticamente
il valore del ROWID; in sostanza, ti stai tirando dietro
due doppioni ridondanti e quindi del tutto inutili.

comunque, il problema non e' qua.
il problema nasce quando sei andato a registrare quella
view dentro alla meta-tavola "view_geometry_columns".
qua tu hai assegnato alla colonna "view_rowid" il
valore "rowid_1".
ma come abbiamo visto prima rowid_1 corrisponde alla PK
della tavola "materiali" che e' una tavola non-spatial,
e da li si scatena tutto il pasticcio.

su "view_rowid" devi necessariamente registrare la PK
della tavola che fornisce le geometrie: e quindi nel
tuo caso "pkuid" (o come alias "rowid", ma e' sempre
meglio usare il nome vero piuttosto che l'alias).

per inciso: la tua view crea tre righe che pero'
coincidono con un singolo punto; e' proprio quello
che volevi ottenere ?

in genere le view si usano nell'altro modo; per
ciascuna singola geometria si associano ulteriori
attributi contenuti in una seconda tavola; tu
invece stai facendo l'opposto, crei tante righe
diverse ma tutte quante con la medesima geometria).

ciao Sandro

Perfetto, quindi forse nella fretta col query view ho tirato dentro roba
che non serviva. Quindi riprovo e vedo se funziona.

comunque, il problema non e' qua.
il problema nasce quando sei andato a registrare quella
view dentro alla meta-tavola "view_geometry_columns".
qua tu hai assegnato alla colonna "view_rowid" il
valore "rowid_1".
ma come abbiamo visto prima rowid_1 corrisponde alla PK
della tavola "materiali" che e' una tavola non-spatial,
e da li si scatena tutto il pasticcio.

Ottimo, allora è solo un mio errore di selezione dei campi.

su "view_rowid" devi necessariamente registrare la PK
della tavola che fornisce le geometrie: e quindi nel
tuo caso "pkuid" (o come alias "rowid", ma e' sempre
meglio usare il nome vero piuttosto che l'alias).

per inciso: la tua view crea tre righe che pero'
coincidono con un singolo punto; e' proprio quello
che volevi ottenere ?

Esattamente: io ho un punto che rappresenta un edificio e a quell'edificio
corrispondono N materiali...a sua volta a N materiali corrispondono N modi
di restaurarli.

in genere le view si usano nell'altro modo; per
ciascuna singola geometria si associano ulteriori
attributi contenuti in una seconda tavola; tu
invece stai facendo l'opposto, crei tante righe
diverse ma tutte quante con la medesima geometria).

Esatto. Sul fatto di fare l'opposto del di solito, non mi pare un problema,
il problema è se concettualmente questo crea errori.

Modifico la selezione dei campi e vedo se Qgis risponde bene.

ciao Sandro

Ciao e grazie infinite!

Allora, usando il Query view di spatialite_gui e "non selezionando i row
di" si ottiene

CREATE VIEW "materiali_n_1_edifici_view" AS
SELECT "a"."id_mat_pk" AS "id_mat_pk", "a"."tipo_materiale" AS
"tipo_materiale",
    "a"."id_ed_fk" AS "id_ed_fk", "b"."pkuid" AS "pkuid",
    "b"."tipo_edificio" AS "tipo_edificio", "b"."grado_rischio" AS
"grado_rischio",
    "b"."geom" AS "geom"
FROM "materiali" AS "a"
JOIN "edifici" AS "b" ON ("a"."id_ed_fk" = "b"."pkuid")

Tuttavia in view_geometry_columns viene registrato sempre rowid. Una volta
modificato a mano con l'id_ed_fk, anche Qgis riesce a caricare la tabella
della view in maniera corretta.

Ora,
premesso che i layer sono stati creati usato il crea vettore spatialite di
Qgis e il crea tabella del DB Manager di Qgis.... l'inghippo del Row id in
geometry Columns nasce dall'aver creato in Qgis le tabelle oppure da un
comportamento non atteso del Query View...oppure io che sbaglio
qualcos'altro?

Grazie
Luca

On Mon, 7 Nov 2016 23:37:58 +0100, Luca Mandolesi wrote:

premesso che i layer sono stati creati usato il crea vettore spatialite di
Qgis e il crea tabella del DB Manager di Qgis.... l'inghippo del Row id in
geometry Columns nasce dall'aver creato in Qgis le tabelle oppure da un
comportamento non atteso del Query View...oppure io che sbaglio
qualcos'altro?

Luca,

va bene cosi': dal punto di vista SQLite+Spatialite e' indifferente
usare il nome vero della PK oppure l'alias generico ROWID.
ma il data provider di QGIS invece impone obbligatoriamente l'uso
del nome ROWID, per cui non c'e' nulla di anomalo.

l'unica cosa assolutamente rilevante e' che la colonna di nome
ROWID presente nella spatial view coincida con la PK della
tavola che contiene le geometrie.

ciao Sandro