如何在QGIS中使用Natural Earth SQLite数据库?


9

我刚刚从http://www.naturalearthdata.com/downloads/下载了SQLite格式的Natural Earth数据。我以为这将是一个SpatiaLite数据库,但事实并非如此!QGIS无法将其识别为空间数据库。OGR应该支持读取几何形状,即使存储在纯SQLite数据库中也是如此,但是QGIS不会对SpatiaLite使用OGR吗?

SQLite数据库确实具有geometry_columns和spatial_ref_sys表。有什么方法可以将其转换为完整的SpatiaLite数据库?

Answers:


9

来自NE的sqlite文件采用FDO-OGR格式,而不是本机空间几何。如果您愿意做一些体力劳动,这是一种转换为spatialite数据库的方法:

首先创建一个新的空的spacealite数据库(我称其为“ nev.sqlite”),然后在一个单独的终端会话中,打开带有spacealite的原始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转换为spaceiteite格式。我attach进入新的“ nev”数据库,并为该CREATE TABLE ... AS SELECT * FROM ...语句感兴趣的每一层创建新表。

现在,我重新切换到新的 spacespaceite数据库。并RecoverGeometryColumn()在每个表上运行以获取具有所有元数据等的正确的spacealite数据库。请注意,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仅“导入”一些表吗?我在获得FDO处理的128张桌子中算出30张。原始版本和fdo版本上的PRAGMA是相同的,因此我认为唯一的区别是几何形状本身。但是geometry_columns认为所有几何都是WKB。
Lee Hachadoorian

Micha,我选择了这个作为最佳答案。进一步查看表,我发现奇怪的是,数据库只打包了一些可通过VirtualFDO使用的表,而其他表却具有几何形状但与SpatiaLite不兼容。与其尝试转换这种方式,不如我将下载shapefile并将其导入到SpatiaLite(我已经为PostGIS完成了)。但这仍然是一个非常有用的答案,谢谢您花时间创建它。
Lee Hachadoorian

如果您只想要一个spacespaceite数据库,并且在以下位置编译了具有spacealite支持的GDAL / OGR:ogr2ogr -f sqlite -dsco spacespace = yes splite.db nat_earth.db应该可以工作。

3

您可以使用Add vector layer ...QGIS 2.0.1中的数据库添加数据。

但是请耐心等待,这是很多数据。

不幸的是,Qspatialite插件无法处理数据,也无法处理“添加Spatialite”层对话框。


安德烈,那真的是有用的信息。我没有意识到QGIS可以使用OGR从SQLite-not-SpatiaLite数据库添加数据。
Lee Hachadoorian

我也不明白为什么有两种添加图层的方法,而只有一种工作;-)
AndreJ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.