Bagaimana cara saya menggunakan DB Earthite SQLite dengan QGIS?

9

Saya baru saja mengunduh data Natural Earth dalam format SQLite dari http://www.naturalearthdata.com/downloads/ . Saya berasumsi bahwa ini akan menjadi basis data SpatiaLite, tetapi tampaknya tidak! QGIS gagal mengenalinya sebagai basis data spasial. OGR seharusnya mendukung pembacaan geometri bahkan ketika disimpan dalam database SQLite biasa, tetapi mungkin QGIS tidak menggunakan OGR untuk SpatiaLite?

Basis data SQLite memang memiliki tabel geometry_columns dan spatial_ref_sys. Apakah ada cara untuk mengubahnya menjadi database SpatiaLite lengkap?

Lee Hachadoorian
sumber

Jawaban:

9

File sqlite dari NE adalah dalam format FDO-OGR, bukan geometri spasial asli. Jika Anda bersedia melakukan kerja kasar, berikut ini cara untuk mengonversi ke spatialite db:

Pertama buat database spatialite baru yang kosong (saya menyebutnya "nev.sqlite"), kemudian dalam sesi terminal terpisah buka natural_earth_vector.sqlite asli dengan spatialite. (Saya menggunakan versi yang lebih baru 4.1. Tidak yakin apakah ini akan berfungsi dengan versi yang lebih lama). Gunakan attachfungsi sqlite untuk terhubung ke tabel nev.sqlite baru Anda, dan buat salinan tabel yang Anda inginkan ke dalam database baru.

Begitu:

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

Semua baris "dibuat VirtualFDO ..." menunjukkan bahwa Spatialite mengenali data sebagai FDO diformat, dan membuat tabel virtual untuk masing-masing dengan GEOMETRI yang dikonversi ke format spatialite. Saya attachke database "nev" baru saya dan membuat tabel baru untuk setiap layer yang saya minati dengan CREATE TABLE ... AS SELECT * FROM ...pernyataan.

Sekarang saya beralih kembali ke database spasial baru . Dan jalankan RecoverGeometryColumn()di setiap tabel untuk mendapatkan database spasial yang tepat, dengan semua metadata, dll. Perhatikan bahwa format FDO memungkinkan untuk jenis geometri campuran MULTI dan TUNGGAL, jadi saya pertama-tama memeriksa jenis geometri mana yang berisi setiap tabel, dan memastikan bahwa semua fitur sama. Saya menggunakan di CastToMulti()mana pun diperlukan, seperti:

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

Geometri dicampur, jadi atur semuanya MULTI, lalu lakukan RecoverGeometryColumn ():

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

Dan seterusnya untuk setiap meja yang Anda butuhkan. Sekarang tabel tersedia di QGIS.

Micha
sumber
Terima kasih atas jawabannya. Apakah Anda tahu mengapa hanya beberapa tabel yang "diimpor" dengan FDO? Saya menghitung 30 dari 128 tabel yang mendapatkan perawatan FDO. PRAGMA pada versi asli dan versi adalah sama, jadi saya berasumsi satu-satunya perbedaan adalah dalam geometri itu sendiri. Tapi geometry_columns menganggap semua geometri adalah WKB.
Lee Hachadoorian
Micha, aku memilih ini sebagai jawaban terbaik. Melihat lebih jauh pada tabel, saya merasa aneh bahwa database dikemas dengan hanya beberapa tabel yang dapat digunakan melalui VirtualFDO, dan yang lain dengan geometri tetapi tidak kompatibel dengan SpatiaLite. Daripada mencoba mengonversi dengan cara ini, saya pikir saya akan mengunduh shapefile dan mengimpornya ke SpatiaLite (yang sudah saya lakukan untuk PostGIS). Tetapi ini masih merupakan jawaban yang sangat informatif, terima kasih atas waktu Anda membuatnya.
Lee Hachadoorian
Jika Anda hanya ingin database spasial, dan Anda memiliki GDAL / OGR dengan dukungan spasial dikompilasi dalam: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db harus bekerja.
3

Anda dapat menambahkan data dari database dengan Add vector layer ...di QGIS 2.0.1.

Tapi bersabarlah, ini banyak data.

Plugin Qspatialite sayangnya tidak dapat menangani data, maupun dialog layer Add Spatialite.

AndreJ
sumber
Andre, itu informasi yang sangat berguna. Saya tidak menyadari QGIS dapat menggunakan OGR untuk menambahkan data dari database SQLite-not-SpatiaLite.
Lee Hachadoorian
Saya juga tidak mengerti mengapa ada dua cara untuk menambahkan lapisan, dan hanya satu yang bekerja ;-)
AndreJ