Як я можу використовувати SQLite Natural Earth SQLite з QGIS?


9

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

У базі даних SQLite є таблиці геометрії-стовпці та просторові_реф_сиси. Чи є якийсь спосіб перетворити його в повну базу даних SpatiaLite?

Відповіді:


9

Файл sqlite з NE знаходиться у форматі FDO-OGR, а не в геометриї просторового простору. Якщо ви готові виконати ручну працю, ось спосіб перетворення в просторовий db:

Спочатку створіть нову порожню базу даних просторового простору (я називаю це "nev.sqlite"), потім в окремому сеансі терміналу відкрийте оригінальний natural_earth_vector.sqlite з просторітом. (Я використовував новішу версію 4.1. Не впевнений, чи буде це працювати з більш старими версіями). Використовуйте функцію sqlite attachдля підключення до нової таблиці 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 ***

Усі рядки "створено VirtualFDO ..." вказують на те, що Spatialite розпізнавав дані як форматовані FDO, і створював віртуальні таблиці для кожної з конвертованих у просторовий формат GEOMETRY. Я attachв свою нову базу даних "nev" і створюю нові таблиці для кожного шару, який мене цікавить із CREATE TABLE ... AS SELECT * FROM ...заявами.

Тепер я переключаюсь на нову базу даних просторових даних. І запускайте RecoverGeometryColumn()кожну таблицю, щоб отримати належну базу даних простору, з усіма метаданими тощо. Зверніть увагу, що формат FDO дозволяє змішувати МУЛЬТИ і СІНГЕЛЬНІ типи геометрії, тому я спочатку перевіряю, які типи геометрії містить кожна таблиця, і переконайтеся, що всі функції так само. Я використовую, 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_column вважає, що всі геометрії є WKB.
Лі Хачадоріан

Міха, я вибрав це як найкращу відповідь. Далі дивлячись на таблиці, мені здається дивним, що база даних постачається лише деякими таблицями, які можна використовувати через VirtualFDO, а інші - з геометріями, але не сумісними з SpatiaLite. Замість того, щоб намагатися конвертувати таким чином, я думаю, я б завантажував файли форм і імпортував їх у SpatiaLite (що я вже робив для PostGIS). Але це була все ще дуже інформативна відповідь, дякую за витрачений час на її створення.
Лі Хачадоріан

Якщо ви просто хочете просторову базу даних, і у вас є GDAL / OGR з підтримкою просторіту, зібраний у: ogr2ogr -f sqlite -dsco просторіта = так splite.db nat_earth.db повинен працювати.

3

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

Але будьте терплячі, це багато даних.

На жаль, плагін Qspatialite, на жаль, не в змозі впоратися з даними, а також діалогом шару Додати просторовий елемент.


Андре, це дійсно корисна інформація. Я не розумів, що QGIS може використовувати OGR для додавання даних із баз даних SQLite-не-SpatiaLite.
Лі Хачадоріан

Я також не розумію, чому є два способи додавання шарів, і працює лише один ;-)
AndreJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.