Jak używać Natural Earth SQLite DB z QGIS?

9

Właśnie pobrałem dane Natural Earth w formacie SQLite ze strony http://www.naturalearthdata.com/downloads/ . Zakładałem, że będzie to baza danych SpatiaLite, ale wydaje się, że nie! QGIS nie rozpoznaje go jako przestrzennej bazy danych. OGR podobno obsługuje odczytywanie geometrii, nawet gdy jest przechowywany w zwykłej bazie danych SQLite, ale może QGIS nie używa OGR dla SpatiaLite?

Baza danych SQLite ma tabele geometry_columns i spatial_ref_sys. Czy istnieje sposób na przekonwertowanie go na pełną bazę danych SpatiaLite?

Lee Hachadoorian
źródło

Odpowiedzi:

9

Plik sqlite z NE ma format FDO-OGR, a nie natywną geometrię przestrzenną. Jeśli chcesz wykonać pracę fizyczną, oto sposób na konwersję do bazy danych przestrzennych:

Najpierw utwórz nową, pustą bazę danych przestrzennych (nazywam ją „nev.sqlite”), a następnie w osobnej sesji terminalu otwórz oryginalną natural_earth_vector.sqlite za pomocą spatialite. (Użyłem nowszej wersji 4.1. Nie jestem pewien, czy to zadziała ze starszymi wersjami). Użyj attachfunkcji sqlite, aby połączyć się z nową tabelą nev.sqlite i utworzyć kopie tabel, które chcesz w nowej bazie danych.

Więc:

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

Wszystkie wiersze „utworzono VirtualFDO ...” wskazują, że Spatialite rozpoznał dane w formacie FDO i utworzył wirtualne tabele dla każdej z GEOMETRIĄ przekonwertowaną na format przestrzenny. Ja attachdo mojego nowego „Nev” bazy danych i tworzyć nowe tabele dla każdej warstwy Jestem zainteresowany ze CREATE TABLE ... AS SELECT * FROM ...stwierdzeniami.

Teraz przełączam się z powrotem na nową bazę danych przestrzennych. I uruchom RecoverGeometryColumn()na każdej tabeli, aby uzyskać odpowiednią bazę danych przestrzennych ze wszystkimi metadanymi itp. Zauważ, że format FDO pozwala na mieszanie typów geometrii WIELU i POJEDYNCZYCH, więc najpierw sprawdzam, które typy geometrii zawiera każda tabela, i upewniam się, że wszystkie funkcje są to samo. Używam CastToMulti()wszędzie tam, gdzie to konieczne, jak:

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

Geometria jest mieszana, więc ustaw wszystko MULTI, a następnie wykonaj RecoverGeometryColumn ():

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

I tak dalej dla każdego stołu, którego potrzebujesz. Teraz tabele są dostępne w QGIS.

Micha
źródło
Dziękuję za dokładną odpowiedź. Czy wiesz, dlaczego tylko niektóre tabele są „importowane” za pomocą FDO? Naliczam 30 ze 128 tabel, które otrzymują leczenie FDO. PRAGMA w wersjach oryginalnej i fdo jest taka sama, więc zakładam, że jedyną różnicą jest sama geometria. Ale geometry_columns uważa, że ​​wszystkie geometrie to WKB.
Lee Hachadoorian
Micha, wybrałem to jako najlepszą odpowiedź. Patrząc dalej na tabele, wydaje mi się dziwne, że baza danych jest zapakowana tylko z niektórymi tabelami używanymi przez VirtualFDO, a inne z geometriami, ale niezgodnymi ze SpatiaLite. Zamiast próbować konwertować w ten sposób, myślę, że pobrałbym pliki shapefile i zaimportowałem je do SpatiaLite (co już zrobiłem dla PostGIS). Ale wciąż była to bardzo pouczająca odpowiedź, dziękuję za czas poświęcony na jej utworzenie.
Lee Hachadoorian
Jeśli potrzebujesz tylko bazy danych przestrzennych, a masz GDAL / OGR z obsługą funkcji przestrzennych skompilowanych w: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db powinien działać.
3

Możesz dodać dane z bazy danych za pomocą Add vector layer ...w QGIS 2.0.1.

Ale bądź cierpliwy, to dużo danych.

Wtyczka Qspatialite niestety nie jest w stanie poradzić sobie z danymi ani dialogiem Add Spatialite layer.

AndreJ
źródło
Andre, to naprawdę przydatna informacja. Nie wiedziałem, że QGIS może używać OGR do dodawania danych z baz danych SQLite-not-SpatiaLite.
Lee Hachadoorian
Nie rozumiem też, dlaczego istnieją dwa sposoby dodawania warstw, a tylko jeden działa ;-)
AndreJ