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?

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.