Como uso o banco de dados SQLite do Natural Earth com QGIS?

9

Acabei de baixar os dados do Natural Earth no formato SQLite em http://www.naturalearthdata.com/downloads/ . Eu tinha assumido que este seria um banco de dados SpatiaLite, mas parece não ser! O QGIS está falhando em reconhecê-lo como um banco de dados espacial. O OGR supostamente suporta geometrias de leitura, mesmo quando armazenadas em um banco de dados SQLite simples, mas talvez o QGIS não use OGR para SpatiaLite?

O banco de dados SQLite possui tabelas geometry_columns e spatial_ref_sys. Existe alguma maneira de convertê-lo em um banco de dados completo do SpatiaLite?

Lee Hachadoorian
fonte

Respostas:

9

O arquivo sqlite do NE está no formato FDO-OGR, não na geometria espacial espacial nativa. Se você estiver disposto a fazer algum trabalho manual, aqui está uma maneira de converter para um espaço espacial db:

Primeiro crie um novo banco de dados espacial vazio, (eu chamo de "nev.sqlite") e, em uma sessão terminal separada, abra o original natural_earth_vector.sqlite com espacial. (Usei a versão mais recente 4.1. Não tenho certeza se isso funcionará com as versões mais antigas). Use a attachfunção sqlite para conectar-se à sua nova tabela nev.sqlite e crie cópias das tabelas desejadas no novo banco de dados.

Então:

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 as linhas "criadas VirtualFDO ..." indicam que o Spatialite reconheceu os dados como formados pelo FDO e criaram tabelas virtuais para cada uma delas com a GEOMETRIA convertida para o formato de espacialidade. Vou attachpara o meu novo banco de dados "nev" e crio novas tabelas para cada camada que me interessa com as CREATE TABLE ... AS SELECT * FROM ...instruções.

Agora eu volto para o novo banco de dados espacial. E execute RecoverGeometryColumn()em cada tabela para obter um banco de dados espacial apropriado, com todos os metadados, etc. Observe que o formato FDO permite tipos de geometria MULTI e ÚNICOS misturados, por isso, verifiquei primeiro quais tipos de geometria cada tabela contém e verifique se todos os recursos estão o mesmo. Eu uso CastToMulti()sempre que necessário, assim:

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

As geometrias são misturadas, então defina tudo MULTI e faça RecoverGeometryColumn ():

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

E assim por diante para cada mesa que você precisa. Agora as tabelas estão disponíveis no QGIS.

Micha
fonte
Obrigado pela resposta completa. Você sabe por que apenas algumas das tabelas são "importadas" com o FDO? Conto 30 das 128 tabelas que recebem o tratamento FDO. O PRAGMA nas versões original e fdo é o mesmo, então presumo que a única diferença esteja na própria geometria. Mas geometry_columns acha que todas as geometrias são WKB.
Lee Hachadoorian
Micha, eu escolhi essa como a melhor resposta. Olhando mais para as tabelas, acho estranho que o banco de dados seja empacotado com apenas algumas das tabelas utilizáveis ​​via VirtualFDO e outras com geometrias, mas não compatíveis com SpatiaLite. Em vez de tentar converter dessa maneira, acho que baixaria os shapefiles e os importaria para o SpatiaLite (o que já fiz para o PostGIS). Mas essa ainda era uma resposta muito informativa, obrigado pelo tempo que levou para criá-la.
Lee Hachadoorian
Se você deseja apenas um banco de dados espacial, e você tem o GDAL / OGR com suporte a espacial compilado em: ogr2ogr -f sqlite -dsco spatialite = sim splite.db nat_earth.db deve funcionar.
3

Você pode adicionar os dados do banco de dados Add vector layer ...no QGIS 2.0.1.

Mas seja paciente, são muitos dados.

Infelizmente, o plug-in Qspatialite não pode lidar com os dados, nem o diálogo da camada Add Spatialite.

AndreJ
fonte
Andre, essa é uma informação realmente útil. Eu não sabia que o QGIS poderia usar o OGR para adicionar dados de bancos de dados SQLite-não-SpatiaLite.
Lee Hachadoorian
Eu também não entendo por que existem duas maneiras de adicionar as camadas, e apenas um funciona ;-)
Andrej