[Gfoss] spatialite - vista con linee virtuali da tabella punti

a.furieri a lqt.it a.furieri a lqt.it
Ven 7 Set 2018 14:47:01 CEST


On Fri, 7 Sep 2018 13:26:53 +0200 (CEST), falcerisimone a inwind.it 
wrote:
> Ciao a tutti,
> pongo un quesito:
> Come faccio a visualizzare la geometria virtuale LINEARE generata da
> una tabella POINT con makeline()?
>
> Ho provato così, manca l'ultimo passo:
>
> "create table punti
> (pk integer primary key,
> nome text);
> select addgeometrycolumn('punti','geom',32632,'POINT',2);
>
> create view virtual_lines as
> select
> a.rowid as rowid,
> st_astext(makeline(a.geom, b.geom)) as wkt,
> st_length(makeline(a.geom, b.geom)) as lunghezza,
> makeline(a.geom, b.geom) as geom
> from punti a, punti b;
>
> select * from virtual_lines;
> --fin qui OK finchè è tabellare, ma la geometria in mappa?"
>

Simone,

SpatiaLite non e' PostGIS, e soprattutto SQLite non e' PostgreSQL;
ci sono alcuni punti specifici in cui l'architettura rende
assolutamente impossibili alcune operazioni.

nello specifico, le Spatial Views di SpatiaLite non possono
assolutamente _MAI_ rielaborare in nessun modo le Geometrie,
perche' altrimenti impazzisce letteramente lo Spatial Index
(che su SQLite e' implementato in modo decisamente esotico).

quindi, una View come la tua, che genera "al volo" dei
segmenti a partire da punti tramite la funzione MakeLine()
non potra' mai diventare in nessun modo una Spatial View
visualizzabile su una mappa.


> --problema geometria virtuale da visualizzare
> insert into views_geometry_columns
>  (view_name, view_geometry, view_rowid, f_table_name,
> f_geometry_column, read_only)
>  values ('virtual_lines', 'the_geom', 'rowid', 'QUALE_TABELLA??', 
> 'geom',1);
>
> --con postgis è facile
> (st_makeline(a.geom, b.geom))::geometry(LineString,32632) as geom
>

per l'appunto; c'eri gia' arrivato da solo al punto critico.
QUALE TABELLA ??
nel tuo caso non esiste la tavola di origine, proprio perche'
la geometria viene "prodotta al volo"; e quindi non la puoi
assolutamente registrare su views_geometry_columns.

puoi pero' provare una strategia alternativa; invece di
usare una View puoi usare una Table vera e propria: basta
solo che invece di chiamare:

create view virtual_lines as
select ... blah blah ....

tu chiami al suo posto:

create table virtual_lines as
select ... blah blah ....

poi ovviamente dovrai completare l'operazione chiamando:

SELECT RecoverGeometryColumn()

e magari anche:

SELECT CreateSpatialIndex()

e' sicuramente piu' macchinoso, e probabilmente richiede
di cancellare e ricreare la tavola ad intervalli fissi,
ma alla fine in genere e' una metodologia che produce
risultati abbastanza soddisfacenti.

ciao Sandro



Maggiori informazioni sulla lista Gfoss