Wie verwende ich die Natural Earth SQLite DB mit QGIS?

9

Ich habe gerade die Natural Earth-Daten im SQLite-Format von http://www.naturalearthdata.com/downloads/ heruntergeladen . Ich hatte angenommen, dass dies eine SpatiaLite-Datenbank sein würde, aber es scheint nicht so zu sein! QGIS erkennt es nicht als räumliche Datenbank. OGR unterstützt angeblich das Lesen von Geometrien, auch wenn es in einer einfachen SQLite-Datenbank gespeichert ist, aber möglicherweise verwendet QGIS OGR nicht für SpatiaLite?

Die SQLite-Datenbank verfügt über die Tabellen geometr_columns und Spatial_ref_sys. Gibt es eine Möglichkeit, es in eine vollständige SpatiaLite-Datenbank zu konvertieren?

Lee Hachadoorian
quelle

Antworten:

9

Die SQLite-Datei von NE hat das FDO-OGR-Format und nicht die native Spatialite-Geometrie. Wenn Sie bereit sind, Handarbeit zu leisten, können Sie wie folgt in eine Spatialite-Datenbank konvertieren:

Erstellen Sie zuerst eine neue, leere Spatialite-Datenbank (ich nenne sie "nev.sqlite") und öffnen Sie dann in einer separaten Terminalsitzung die ursprüngliche natural_earth_vector.sqlite mit Spatialite. (Ich habe die neuere Version 4.1 verwendet. Ich bin mir nicht sicher, ob dies mit den älteren Versionen funktioniert.) Verwenden Sie die SQLite- attachFunktion, um eine Verbindung zu Ihrer neuen nev.sqlite-Tabelle herzustellen und Kopien der gewünschten Tabellen in der neuen Datenbank zu erstellen.

So:

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

Alle Zeilen "VirtualFDO erstellt ..." geben an, dass Spatialite die Daten als FDO-formatiert erkannt und virtuelle Tabellen für jede Tabelle erstellt hat, wobei GEOMETRY in das Spatialite-Format konvertiert wurde. Ich attachgehe zu meiner neuen "nev" -Datenbank und erstelle neue Tabellen für jede Ebene, die mich mit den CREATE TABLE ... AS SELECT * FROM ...Anweisungen interessiert .

Jetzt schalte ich die neue Spatialite-Datenbank wieder um. Führen Sie RecoverGeometryColumn()jede Tabelle aus, um eine ordnungsgemäße Spatialite-Datenbank mit allen Metadaten usw. zu erhalten. Beachten Sie, dass das FDO-Format gemischte MULTI- und SINGLE-Geometrietypen zulässt. Überprüfen Sie daher zunächst, welche Geometrietypen in jeder Tabelle enthalten sind, und stellen Sie sicher, dass alle Features vorhanden sind das Gleiche. Ich benutze CastToMulti()wo immer nötig, wie folgt:

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

Geometrien werden gemischt, also setzen Sie alles auf MULTI und führen Sie dann RecoverGeometryColumn () aus:

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

Und so weiter für jeden Tisch, den Sie brauchen. Jetzt sind die Tabellen in QGIS verfügbar.

Micha
quelle
Vielen Dank für die gründliche Antwort. Wissen Sie, warum nur einige der Tabellen mit FDO "importiert" werden? Ich zähle 30 von 128 Tabellen, die die FDO-Behandlung erhalten. PRAGMA ist bei der Original- und der fdo-Version gleich, daher gehe ich davon aus, dass der einzige Unterschied in der Geometrie selbst liegt. Geometry_columns glaubt jedoch, dass alle Geometrien WKB sind.
Lee Hachadoorian
Micha, ich habe das als beste Antwort ausgewählt. Wenn ich mir die Tabellen genauer anschaue, finde ich es seltsam, dass die Datenbank nur mit einigen Tabellen gepackt ist, die über VirtualFDO verwendet werden können, und die anderen mit Geometrien, die jedoch nicht mit SpatiaLite kompatibel sind. Anstatt zu versuchen, auf diese Weise zu konvertieren, würde ich die Shapefiles herunterladen und in SpatiaLite importieren (was ich bereits für PostGIS getan habe). Dies war jedoch immer noch eine sehr informative Antwort. Vielen Dank für die Zeit, die Sie für die Erstellung benötigt haben.
Lee Hachadoorian
Wenn Sie nur eine Spatialite-Datenbank möchten und GDAL / OGR mit Spatialite-Unterstützung kompiliert haben in: ogr2ogr -f sqlite -dsco Spatialite = yes splite.db nat_earth.db sollte funktionieren.
3

Sie können die Daten aus der Datenbank mit Add vector layer ...in QGIS 2.0.1 hinzufügen .

Aber sei geduldig, es sind viele Daten.

Das Qspatialite-Plugin kann leider weder mit den Daten noch mit dem Dialogfeld "Spatialite-Ebene hinzufügen" umgehen.

AndreJ
quelle
Andre, das sind wirklich nützliche Informationen. Ich wusste nicht, dass QGIS OGR verwenden kann, um Daten aus SQLite-not-SpatiaLite-Datenbanken hinzuzufügen.
Lee Hachadoorian
Ich verstehe auch nicht, warum es zwei Möglichkeiten gibt, die Ebenen hinzuzufügen, und nur eine funktioniert ;-)
AndreJ