Comment utiliser la base de données Natural Earth SQLite avec QGIS?

9

Je viens de télécharger les données de Natural Earth au format SQLite sur http://www.naturalearthdata.com/downloads/ . J'avais supposé que ce serait une base de données SpatiaLite, mais il semble que non! QGIS ne le reconnaît pas comme une base de données spatiale. OGR est censé prendre en charge la lecture des géométries même lorsqu'il est stocké dans une base de données SQLite ordinaire, mais peut-être que QGIS n'utilise pas OGR pour SpatiaLite?

La base de données SQLite possède des tables geometry_columns et spatial_ref_sys. Existe-t-il un moyen de le convertir en une base de données SpatiaLite complète?

Lee Hachadoorian
la source

Réponses:

9

Le fichier sqlite de NE est au format FDO-OGR, pas la géométrie native de spatialite. Si vous êtes prêt à effectuer un travail manuel, voici un moyen de convertir en un db spatialite:

Créez d'abord une nouvelle base de données spatialite vide (je l'appelle "nev.sqlite"), puis dans une session de terminal séparée, ouvrez l'original natural_earth_vector.sqlite avec spatialite. (J'ai utilisé la nouvelle version 4.1. Je ne sais pas si cela fonctionnera avec les anciennes versions). Utilisez la attachfonction sqlite pour vous connecter à votre nouvelle table nev.sqlite et créez des copies des tables souhaitées dans la nouvelle base de données.

Donc:

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 ***

Toutes les lignes "créé VirtualFDO ..." indiquent que Spatialite a reconnu les données comme formatées FDO, et créé des tables virtuelles pour chacune avec la GÉOMÉTRIE convertie au format spatialite. J'accède attachà ma nouvelle base de données "nev" et crée de nouvelles tables pour chaque couche qui m'intéresse avec les CREATE TABLE ... AS SELECT * FROM ...instructions.

Maintenant, je reviens sur la nouvelle base de données spatialite. Et exécutez RecoverGeometryColumn()sur chaque table pour obtenir une base de données spatialite appropriée, avec toutes les métadonnées, etc. le même. J'utilise CastToMulti()partout où c'est nécessaire, comme ça:

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
.....

Les géométries sont mélangées, alors définissez tout MULTI, puis faites RecoverGeometryColumn ():

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

Et ainsi de suite pour chaque table dont vous avez besoin. Maintenant, les tables sont disponibles dans QGIS.

Micha
la source
Merci pour la réponse complète. Savez-vous pourquoi seules certaines tables sont "importées" avec FDO? Je compte 30 des 128 tables qui reçoivent le traitement FDO. PRAGMA sur les versions d'origine et fdo est le même, donc je suppose que la seule différence est dans la géométrie elle-même. Mais geometry_columns pense que toutes les géométries sont WKB.
Lee Hachadoorian
Micha, j'ai choisi cela comme la meilleure réponse. En regardant plus loin les tables, je trouve étrange que la base de données soit packagée avec seulement certaines des tables utilisables via VirtualFDO, et les autres avec des géométries mais pas compatibles SpatiaLite. Plutôt que d'essayer de convertir de cette façon, je pense que je voudrais télécharger les fichiers de formes et les importer dans SpatiaLite (ce que j'ai déjà fait pour PostGIS). Mais c'était toujours une réponse très informative, merci pour le temps que vous avez pris à le créer.
Lee Hachadoorian
Si vous voulez juste une base de données spatialite, et que vous avez GDAL / OGR avec support spatialite compilé dans: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db devrait fonctionner.
3

Vous pouvez ajouter les données de la base de données avec Add vector layer ...dans QGIS 2.0.1.

Mais soyez patient, c'est beaucoup de données.

Le plugin Qspatialite n'est malheureusement pas en mesure de traiter les données, ni la boîte de dialogue Ajouter une couche Spatialite.

AndreJ
la source
Andre, ce sont des informations vraiment utiles. Je ne savais pas que QGIS pouvait utiliser OGR pour ajouter des données à partir de bases de données SQLite-pas-SpatiaLite.
Lee Hachadoorian
Je ne comprends pas non plus pourquoi il y a deux façons d'ajouter les couches, et une seule fonctionne ;-)
AndreJ