Come uso il DB SQLite di Natural Earth con QGIS?


9

Ho appena scaricato i dati di Natural Earth in formato SQLite da http://www.naturalearthdata.com/downloads/ . Avevo supposto che questo sarebbe un database SpatiaLite, ma sembra non esserlo! QGIS non riesce a riconoscerlo come database spaziale. Presumibilmente OGR supporta la lettura delle geometrie anche se memorizzato in un semplice database SQLite, ma forse QGIS non utilizza OGR per SpatiaLite?

Il database SQLite ha tabelle geometry_columns e spatial_ref_sys. C'è un modo per convertirlo in un database SpatiaLite completo?

Risposte:


9

Il file sqlite da NE è in formato FDO-OGR, non la geometria spaziale nativa. Se sei disposto a fare un po 'di lavoro manuale, ecco un modo per convertire in un db spatialite:

Prima crea un nuovo database spaziale vuoto (lo chiamo "nev.sqlite"), quindi in una sessione terminale separata apri l'originale natural_earth_vector.sqlite con spatialite. (Ho usato la versione 4.1 più recente. Non sono sicuro che funzionerà con le versioni precedenti). Utilizzare la attachfunzione sqlite per connettersi alla nuova tabella nev.sqlite e creare copie delle tabelle desiderate nel nuovo database.

Così:

micha@Wheezy:~$ spatialite natural_earth_vector.sqlite 
SpatiaLite version ..: 3.0.0-beta   Supported Extensions:
    - 'VirtualShape'    [direct Shapefile access]
    - 'VirtualDbf'      [direct DBF access]
    - 'VirtualXL'       [direct XLS access]
    - 'VirtualText'     [direct CSV/TXT access]
    - 'VirtualNetwork'  [Dijkstra shortest path]
    - 'RTree'       [Spatial Index - R*Tree]
    - 'MbrCache'        [Spatial Index - MBR cache]
    - 'VirtualSpatialIndex' [R*Tree metahandler]
    - 'VirtualFDO'      [FDO-OGR interoperability]
    - 'SpatiaLite'      [Spatial SQL - OGC]
PROJ.4 version ......: Rel. 4.7.1, 23 September 2009
GEOS version ........: 3.3.3-CAPI-1.7.4
SQLite version ......: 3.7.13

================ FDO-OGR Spatial Metadata detected ===============
.....
    created VirtualFDO table 'fdo_ne_110m_geography_regions_points'
    created VirtualFDO table 'fdo_ne_110m_geography_regions_polys'
    created VirtualFDO table 'fdo_ne_110m_glaciated_areas'
    created VirtualFDO table 'fdo_ne_110m_lakes'
    created VirtualFDO table 'fdo_ne_110m_land'
    created VirtualFDO table 'fdo_ne_110m_ocean'
    created VirtualFDO table 'fdo_ne_110m_rivers_lake_centerlines'
Accessing these fdo_XX tables you can take full advantage of
FDO-OGR auto-wrapping facility
This allows you to access any specific FDO-OGR Geometry as if it
where native SpatiaLite ones in a completely transparent way
==================================================================

Enter ".help" for instructions
spatialite> attach "nev.sqlite" AS nev;
spatialite> 
spatialite> CREATE TABLE nev.countries AS SELECT * from fdo_ne_10m_admin_0_countries;
spatialite> CREATE TABLE nev.populated_places AS SELECT * FROM fdo_ne_10m_populated_places;
spatialite> CREATE TABLE nev.railroads AS SELECT * FROM fdo_ne_10m_railroads;
spatialite> .q

*** FDO-OGR auto-wrapping shutdown done ***

Tutte le righe "create VirtualFDO ..." indicano che Spatialite ha riconosciuto i dati come formattati FDO e ha creato tabelle virtuali per ciascuno con GEOMETRY convertito in formato spazialite. Io attachnel mio nuovo database "nev" e creo nuove tabelle per ogni livello che mi interessa con le CREATE TABLE ... AS SELECT * FROM ...dichiarazioni.

Ora torno indietro sul nuovo database spazialite. Ed esegui RecoverGeometryColumn()su ogni tabella per ottenere un database spazialite adeguato, con tutti i metadati, ecc. Nota che il formato FDO consente tipi di geometria MULTI e SINGLE misti, quindi prima controllo quali tipi di geometria contiene ogni tabella e mi assicuro che tutte le funzionalità siano lo stesso. Uso CastToMulti()dove necessario, in questo modo:

micha@Wheezy:~/GIS/World/naturalearthdata.com$ spatialite nev.sqlite
SpatiaLite version ..: 4.1.1    Supported Extensions:
    - 'VirtualShape'    [direct Shapefile access]
    - 'VirtualDbf'      [direct DBF access]
    - 'VirtualXL'       [direct XLS access]
    - 'VirtualText'     [direct CSV/TXT access]
    - 'VirtualNetwork'  [Dijkstra shortest path]
    - 'RTree'       [Spatial Index - R*Tree]
    - 'MbrCache'        [Spatial Index - MBR cache]
    - 'VirtualSpatialIndex' [R*Tree metahandler]
    - 'VirtualFDO'      [FDO-OGR interoperability]
    - 'SpatiaLite'      [Spatial SQL - OGC]
PROJ.4 version ......: Rel. 4.7.1, 23 September 2009
GEOS version ........: 3.3.3-CAPI-1.7.4
SQLite version ......: 3.7.13
Enter ".help" for instructions
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
spatialite> .tables
SpatialIndex            geometry_columns_auth   spatialite_history    
countries               populated_places        sql_statements_log    
geom_cols_ref_sys       railroads               views_geometry_columns
geometry_columns        spatial_ref_sys         virts_geometry_columns
spatialite> 
spatialite> SELECT GeometryType(GEOMETRY) FROM countries;
POLYGON
POLYGON
MULTIPOLYGON
MULTIPOLYGON
POLYGON
MULTIPOLYGON
POLYGON
MULTIPOLYGON
MULTIPOLYGON
.....

Le geometrie sono mescolate, quindi imposta tutto MULTI, quindi esegui RecoverGeometryColumn ():

spatialite> UPDATE countries SET GEOMETRY=CastToMulti(GEOMETRY);
spatialite> SELECT RecoverGeometryColumn('countries','GEOMETRY',4326,'MULTIPOLYGON',2);
1
spatialite> 

E così via per ogni tavolo di cui hai bisogno. Ora le tabelle sono disponibili in QGIS.


Grazie per la risposta esaustiva. Sai perché solo alcune delle tabelle vengono "importate" con FDO? Conto 30 dei 128 tavoli che ricevono il trattamento FDO. PRAGMA sulle versioni originale e fdo è la stessa, quindi suppongo che l'unica differenza sia nella geometria stessa. Geometry_columns pensa che tutte le geometrie siano WKB.
Lee Hachadoorian,

Micha, ho scelto questa come la migliore risposta. Osservando ulteriormente le tabelle, trovo strano che il database sia impacchettato con solo alcune delle tabelle utilizzabili tramite VirtualFDO e le altre con geometrie ma non compatibili con SpatiaLite. Invece di provare a convertire in questo modo, penso che scaricare i file di forma e importarli in SpatiaLite (cosa che ho già fatto per PostGIS). Ma questa era ancora una risposta molto istruttiva, grazie per il tempo impiegato a crearla.
Lee Hachadoorian,

Se vuoi solo un database spazialite e hai GDAL / OGR con supporto spazialite compilato in: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db dovrebbe funzionare.

3

È possibile aggiungere i dati dal database con Add vector layer ...in QGIS 2.0.1.

Ma sii paziente, sono molti dati.

Sfortunatamente, il plug-in Qspatialite non è in grado di gestire i dati, né la finestra di dialogo Aggiungi layer Spatialite.


Andre, sono informazioni davvero utili. Non pensavo che QGIS potesse usare OGR per aggiungere dati da database SQLite-non-SpatiaLite.
Lee Hachadoorian,

Inoltre non capisco perché ci sono due modi per aggiungere i livelli e solo uno funziona ;-)
AndreJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.