QEでNatural Earth SQLite DBを使用するにはどうすればよいですか?


9

SQLite形式のNatural Earthデータをhttp://www.naturalearthdata.com/downloads/からダウンロードしました。これはSpatiaLiteデータベースであると想定していましたが、そうではないようです!QGISはそれを空間データベースとして認識できません。OGRはプレーンSQLiteデータベースに格納されている場合でもジオメトリの読み取りをサポートしていると思われますが、QGISはSpatiaLiteにOGRを使用しないのでしょうか?

SQLiteデータベースには、geometry_columnsテーブルとspatial_ref_sysテーブルがあります。それを完全なSpatiaLiteデータベースに変換する方法はありますか?

回答:


9

NEのsqliteファイルはFDO-OGR形式であり、ネイティブのスペータイトジオメトリではありません。手作業で作業する場合は、spatialite dbに変換する方法を次に示します。

最初に新しい空のspatialiteデータベースを作成し(私は「nev.sqlite」と呼びます)、別のターミナルセッションで、spatialiteを使用して元の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 ***

「created VirtualFDO ...」のすべての行は、SpatialiteがデータをFDO形式として認識し、GEOMETRYがspatialite形式に変換された仮想テーブルをそれぞれ作成したことを示しています。私はattach私の新しい「NEV」データベースにと私はに興味がそれぞれの層のための新しいテーブルの作成CREATE TABLE ... AS SELECT * FROM ...文を。

今度は、新しい Spatialiteデータベースに切り替えます。そして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で一部のテーブルのみが「インポート」される理由を知っていますか?FDOの扱いを受ける128個のテーブルのうち30個を数えます。元のバージョンとfdoバージョンのPRAGMAは同じなので、唯一の違いはジオメトリ自体にあると思います。しかし、geometry_columnsは、すべてのジオメトリがWKBであると見なします。
Lee Hachadoorian 2013年

ミチャ、これをベストアンサーとして選びました。さらにテーブルを見ると、データベースがVirtualFDOを介して使用できるテーブルの一部のみとパッケージ化されており、その他はジオメトリを持つがSpatiaLite互換ではないパッケージにパッケージ化されているのは奇妙なことに気づきました。この方法で変換しようとするのではなく、シェープファイルをダウンロードしてSpatiaLiteにインポートすると思います(これは、PostGISですでに行っています)。しかし、これはまだ非常に有益な回答でした。作成に時間を割いていただきありがとうございます。
Lee Hachadoorian 2013年

spatialiteデータベースだけが必要で、spatialiteサポートが組み込まれたGDAL / OGRがある場合:ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.dbが機能するはずです。

3

Add vector layer ...QGIS 2.0.1では、データベースからデータを追加できます。

しかし、我慢してください、それはたくさんのデータです。

Qspatialiteプラグインは、残念ながらデータを処理することも、[Spatialiteレイヤーを追加]ダイアログを処理することもできません。


アンドレ、それは本当に役立つ情報です。QGISがOGRを使用してSQLite-not-SpatiaLiteデータベースからデータを追加できることを知りませんでした。
Lee Hachadoorian 2013年

レイヤーを追加する方法が2つある理由もわかりません。1つしか機能しません;-)
AndreJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.