Как использовать базу данных Natural Earth SQLite с QGIS?

9

Я только что загрузил данные Natural Earth в формате SQLite с http://www.naturalearthdata.com/downloads/ . Я предполагал, что это будет база данных SpatiaLite, но, похоже, это не так! QGIS не может распознать его как пространственную базу данных. Предполагается, что OGR поддерживает чтение геометрии, даже если она хранится в простой базе данных SQLite, но, возможно, QGIS не использует OGR для SpatiaLite?

База данных SQLite имеет таблицы geometry_columns и пространственные_реф_сайты. Есть ли способ преобразовать его в полную базу данных SpatiaLite?

Ли Хачадурян
источник

Ответы:

9

Файл sqlite из NE имеет формат FDO-OGR, а не собственную геометрию пространственного объекта. Если вы готовы заняться физическим трудом, вот способ преобразования в пространственную базу данных:

Сначала создайте новую пустую базу данных пространственного объекта (я называю это «nev.sqlite»), затем в отдельном сеансе терминала откройте исходный файл natural_earth_vector.sqlite с пространственным объектом. (Я использовал более новую версию 4.1. Не уверен, что это будет работать с более старыми версиями). Используйте attachфункцию sqlite для подключения к новой таблице nev.sqlite и создания копий таблиц, которые вы хотите, в новую базу данных.

Так:

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

Все строки «create VirtualFDO ...» указывают на то, что Spatialite распознал данные как отформатированные в FDO, и создал виртуальные таблицы для каждой с GEOMETRY, преобразованным в формат пространственного объекта. Я attachперехожу к своей новой базе данных "nev" и создаю новые таблицы для каждого слоя, который меня интересует, с помощью CREATE TABLE ... AS SELECT * FROM ...операторов.

Теперь я снова переключаюсь на новую пространственную базу данных. И запустить RecoverGeometryColumn()на каждой таблице, чтобы получить правильную пространственную базу данных со всеми метаданными и т. Д. Обратите внимание, что формат FDO допускает смешанные типы геометрии MULTI и SINGLE, поэтому я сначала проверяю, какие типы геометрии содержится в каждой таблице, и убедитесь, что все объекты то же. Я использую CastToMulti()везде, где это необходимо, вот так:

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

Геометрия смешана, поэтому установите все MULTI, затем выполните RecoverGeometryColumn ():

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

И так для каждой таблицы вам нужно. Теперь таблицы доступны в QGIS.

Миха
источник
Спасибо за подробный ответ. Знаете ли вы, почему только некоторые таблицы «импортируются» с помощью FDO? Я считаю 30 из 128 таблиц, которые проходят лечение FDO. PRAGMA в оригинальной и fdo-версиях одинакова, поэтому я предполагаю, что единственная разница заключается в самой геометрии. Но geometry_columns думает, что все геометрии WKB.
Ли Хачадурян
Миха, я выбрал это как лучший ответ. Глядя дальше на таблицы, я нахожу странным, что база данных упакована только с некоторыми таблицами, которые можно использовать через VirtualFDO, а другие - с геометриями, но не совместимыми с SpatiaLite. Вместо того, чтобы пытаться конвертировать таким образом, я думаю, что я бы скачал шейп-файлы и импортировал их в SpatiaLite (что я уже сделал для PostGIS). Но это был все еще очень информативный ответ, спасибо за то время, которое вы потратили на его создание.
Ли Хачадурян
Если вам просто нужна база данных пространственных данных, и у вас есть GDAL / OGR с поддержкой пространственных объектов, скомпилированные в: ogr2ogr -f sqlite -dscoatialite = yes splite.db nat_earth.db должно работать.
3

Вы можете добавить данные из базы данных Add vector layer ...в QGIS 2.0.1.

Но наберитесь терпения, данных много.

К сожалению, плагин Qspatialite не может работать ни с данными, ни с диалогом добавления слоя Spatialite.

Andrej
источник
Андре, это действительно полезная информация. Я не понимал, что QGIS может использовать OGR для добавления данных из баз данных SQLite-not-SpatiaLite.
Ли Хачадурян
Я также не понимаю, почему есть два способа добавления слоев, и работает только один ;-)
AndreJ