Avevo necessità di esportare un DB PostGIS (PostgreSQL con estensione spaziale) in spatialite.
Cercando in rete ho trovato questa pagina: le librerie GDAL/OGR sono in grado di fare la conversione richiesta. In particolare il terzo esempio riportato alla pagina indicata fa proprio al caso nostro.
$ ogr2ogr –config PG_LIST_ALL_TABLES YES –config PG_SKIP_VIEWS NO -f “SQLite” nome_db.sqlite -progress PG:”dbname=’nome_db_postgis’ active_schema=public schemas=public host=’nome_host’ port=’5432′ user=’nome_utente’ password=’pwd_segreta’ ” -lco LAUNDER=yes -dsco SPATIALITE=yes -lco SPATIAL_INDEX=no
Ma provando a caricare il DB in QGIS si ottiene un errore:
“nome del layer” (GEOMETRY non è un layer valido e non può essere caricato)
Ho chiesto il lista gfoss.it e il papà di spatialite, Alessandro Furieri, mi ha gentilmente controllato l’output di ogr2ogr. La sua illuminante risposta e conclusione è riportata qui. Ma provo a riassumere i passaggi che, con le sue indicazioni, ho seguito per ripulire le sporcizie che erano rimaste.
Il database che viene creato presenta alcune incongruenze (alcune dovute ad errori preesistenti del DB Postgis come il settaggio dello SRID che non deve essere uguale a -1 ma deve essere esplicitamente dichiarato). Poi errori di interpretazione delle colonne geometriche nel passaggio da postgis a spatialite.
In sostanza, una volta creato il DB spatialite ho seguito questi passaggi (indicati da Sandro):
$ spatialite nome_db.sqlite
– si presenta il prompt di spatialite: a questo punto impostare alcune semplici configurazioni per l’output dei comandi:
spatialite> .nullvalue NULL
spatialite> .headers on
spatialite> .mode column
In questo modo otteniamo che vengano visualizzati come NULL in valori senza valore (bel gioco di parole :-)), che si vedano gli headers delle tabelle quando si lanciano query di select e che i valori vengano visualizzati secondo una impostazione tabellare.
A questo punto bisogna forzare lo SRID (nel nostro caso si tratta del codice EPSG=3003, Gauss Boaga Fuso Ovest) nella tabella geometry_columns:
spatialite> update geometry_columns SET srid = 3003;
Poi sistemiamo il type geometrico aggiornando alcuni valori sghembi che erano rimasti; in particolare si tratta di alcune tabelle con dati poligonali in cui il tipo geometrico era rimasto con valore GEOMETRY.
spatialite> update geometry_columns SET type=’POLYGON’ WHERE type = ‘GEOMETRY’;
– Infine aggiorniamo correttamente lo SRID su tutte le geometrie creando i trigger necessari al buon funzionamento di spatialite.
spatialite> UPDATE acqua SET GEOMETRY = SetSrid(GEOMETRY, 3003);
Questo va fatto tabella per tabella (nel caso riportato la tabella “acqua”).
A questo punto il caricamento con QGIS va liscio!
Grazie per il post.