[Gfoss] ST_Union e PostGIS
a.furieri a lqt.it
a.furieri a lqt.it
Mer 13 Dic 2017 14:56:19 CET
On Wed, 13 Dec 2017 13:56:20 +0100, Massimiliano Moraca wrote:
> Come ho detto a Marco ogc_fid รจ chiave primaria. Avevo notato
> un po' di tempo fa che nel creare le VIEW SpatiaLite ti chiede
> comunque un id dalla tabella sorgente, id assegnato poi random.
>
Massimiliano,
stai ben attento perche' qua rischi di combinare un bell'arrosto.
1. "nel creare le VIEW SpatiaLite ti chiede comunque un id dalla
tabella sorgente"
esatto, e' proprio cosi': per la precisione ti chiede di
specificare quale sia il nome della colonna-VIEW che riporta
il ROWID che identifica la riga della tavola-input che
fornisce la geometria presente nella View.
Corollario: una Spatial View di SpatiaLite non puo' mai
fornire una geometria che sia il risultato di una funzione
o il frutto di una aggregazione.
_DEVE_ necessariamente essere una geometria presa tal
quale da una delle tavole di input della View, senza che
intervenga nessuna manipolazione di sorta.
e la colonna "rowid" presente nella Spatial View deve
consentire di tenere coerentemente in synchro le righe
della tavola-madre con il suo eventuale Spatial Index.
2. "id assegnato poi random"
assolutamene _NO_ !!!!
non puo' essere random, _DEVE_ identificare esattamente
la riga della tavola che fornisce la geometria (ergo, o
si tratta di una PK oppure in forma piu' geerica di un
ROWID).
e c'e' un motivo assolutamente stringente per imporre
questo vincolo: altrimenti lo Spatial Index (che e' sempre
basato sulla tavola primaria e non sulla View) impazzisce,
e fornira' risultati padellati di pura fantasia con
risultati folli e potenzialmete devastanti.
in buona sostanza, se nella colonna ROWID della Spatial
View fai in modo che ci finiscano "valori random" stai
facendo tutto il possibile per massacrare la logica di
funzionamento dello Spatial Index.
per inciso, ti ricordo che su SQLite/SpatiaLite lo
Spatial Index R*TRee non e' affatto un "indice", ma e'
semplicemente un'ulteriore tavola, anzi per l'esattezza
e' una VirtualTable.
funziona, e funziona pure in modo molto efficiente, ma
esige lo scrupoloso rispetto di tutta una serie di vincoli
basati sullo scrupoloso rispetto dei JOIN relazionale
basati sul ROWID, altrimenti salta tutto per aria.
hint: ma perche' vuoi usare proprio una Spatial View ?
nel tuo caso, se ho capito bene il problema, sarebbe molto
piu' opportuno materializzare ancora un'altra tavola, p.es.:
CREATE TABLE dipart2 AS
SELECT cd_diparti, dipartimen, ST_Union(geom) AS geometry
FROM dipartimenti
GROUP BY cd_diparti;
SELECT RecoverGeometryColumn('dipart2', 'geometry', ......);
SELECT CreateSpatialIndex('dipart2', 'geometry');
ciao Sandro
Maggiori informazioni sulla lista
Gfoss