¿Cómo uso la base de datos SQLite de Natural Earth con QGIS?

9

Acabo de descargar los datos de Natural Earth en formato SQLite de http://www.naturalearthdata.com/downloads/ . Supuse que esta sería una base de datos SpatiaLite, ¡pero parece que no lo es! QGIS no puede reconocerlo como una base de datos espacial. OGR supuestamente admite la lectura de geometrías incluso cuando se almacena en una base de datos SQLite simple, pero ¿tal vez QGIS no usa OGR para SpatiaLite?

La base de datos SQLite tiene tablas geometry_columns y spatial_ref_sys. ¿Hay alguna forma de convertirlo a una base de datos completa de SpatiaLite?

Lee Hachadoorian
fuente

Respuestas:

9

El archivo sqlite de NE está en formato FDO-OGR, no la geometría espacial espacial nativa. Si está dispuesto a hacer algo de trabajo manual, aquí hay una forma de convertirlo a un db espacial:

Primero cree una nueva base de datos espacial vacía (yo la llamo "nev.sqlite"), luego, en una sesión de terminal separada, abra el natural_earth_vector.sqlite original con spaceialite. (Utilicé la versión más nueva 4.1. No estoy seguro si esto funcionará con las versiones anteriores). Use la attachfunción sqlite para conectarse a su nueva tabla nev.sqlite y cree copias de las tablas que desee en la nueva base de datos.

Entonces:

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

Todas las líneas "creado VirtualFDO ..." indican que Spatialite reconoció los datos como formateados con FDO, y creó tablas virtuales para cada uno con la GEOMETRÍA convertida a formato espacial. Ir attacha mi nueva base de datos "nev" y crear nuevas tablas para cada capa que me interesan con las CREATE TABLE ... AS SELECT * FROM ...declaraciones.

Ahora cambio de nuevo a la nueva base de datos espacial. Y ejecute RecoverGeometryColumn()en cada tabla para obtener una base de datos espacial adecuada, con todos los metadatos, etc. Tenga en cuenta que el formato FDO permite tipos de geometría MULTI y SINGLE mixtos, así que primero verifico qué tipos de geometría contiene cada tabla y me aseguro de que todas las características sean lo mismo. Yo uso CastToMulti()donde sea necesario, así:

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

Las geometrías se mezclan, así que configure todo MULTI, luego haga RecoverGeometryColumn ():

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

Y así sucesivamente para cada mesa que necesite. Ahora las tablas están disponibles en QGIS.

Micha
fuente
Gracias por la respuesta completa. ¿Sabe por qué solo algunas de las tablas se "importan" con FDO? Cuento 30 de las 128 mesas que reciben el tratamiento FDO. PRAGMA en las versiones original y fdo es la misma, así que supongo que la única diferencia está en la geometría misma. Pero geometry_columns piensa que todas las geometrías son WKB.
Lee Hachadoorian
Micha, elegí esto como la mejor respuesta. Mirando más a fondo las tablas, me parece extraño que la base de datos esté empaquetada con solo algunas de las tablas que se pueden usar a través de VirtualFDO, y las otras con geometrías pero no compatibles con SpatiaLite. En lugar de tratar de convertir de esta manera, creo que descargaría los archivos de forma e importaría a SpatiaLite (que ya hice para PostGIS). Pero esta sigue siendo una respuesta muy informativa, gracias por el tiempo que tardó en crearla.
Lee Hachadoorian
Si solo desea una base de datos espacial, y tiene GDAL / OGR con soporte espacial compilado en: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db debería funcionar.
3

Puede agregar los datos de la base de datos con Add vector layer ...QGIS 2.0.1.

Pero tenga paciencia, es una gran cantidad de datos.

Desafortunadamente, el complemento Qspatialite no puede manejar los datos, ni el diálogo Agregar capa de Spatialite.

AndreJ
fuente
Andre, esa es información realmente útil. No me di cuenta de que QGIS podría usar OGR para agregar datos de bases de datos SQLite-not-SpatiaLite.
Lee Hachadoorian
Tampoco entiendo por qué hay dos formas de agregar las capas, y solo una funciona ;-)
AndreJ