QGIS ile Natural Earth SQLite DB'yi nasıl kullanırım?


9

Http://www.naturalearthdata.com/downloads/ adresinden Natural Earth verilerini SQLite biçiminde yeni indirdim . Bunun bir SpatiaLite veritabanı olacağını varsaymıştım, ama öyle görünmüyor! QGIS bunu mekansal bir veritabanı olarak tanımıyor. OGR, basit bir SQLite veritabanında saklandığında bile okuma geometrilerini destekliyor, ancak belki QGIS SpatiaLite için OGR kullanmıyor?

SQLite veritabanı geometry_columns ve spatial_ref_sys tablolarına sahiptir. Tam bir SpatiaLite veritabanına dönüştürmenin bir yolu var mı?

Yanıtlar:


9

NE'nin sqlite dosyası, doğal uzamsal geometri yerine FDO-OGR biçimindedir. Bazı el emeği yapmak istiyorsanız, burada bir uzamsal db'ye dönüştürmenin bir yolu:

Önce yeni, boş bir spatialite veritabanı yapın ("nev.sqlite" diyorum), sonra ayrı bir terminal oturumunda spatialite ile orijinal natural_earth_vector.sqlite'ı açın. (Daha yeni sürüm 4.1'i kullandım. Bunun eski sürümlerle çalışıp çalışmayacağından emin değilim). attachYeni nev.sqlite tablonuza bağlanmak için sqlite işlevini kullanın ve yeni tabloya istediğiniz tabloların kopyalarını oluşturun.

Yani:

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

Tüm oluşturulan "VirtualFDO ..." satırları, Spatialite'ın verileri FDO biçimli olarak tanıdığını ve GEOMETRY'nin mekansal formata dönüştürüldüğü her biri için sanal tablolar oluşturduğunu gösterir. Ben attachyeni "nev" veritabanına ve CREATE TABLE ... AS SELECT * FROM ...ifadeleri ile ilgileniyorum her katman için yeni tablolar oluşturmak .

Şimdi yeni spatialite veritabanına geri dönüyorum . Ve RecoverGeometryColumn()tüm meta veriler vb. İle uygun bir uzamsal veritabanı elde etmek için her tabloda çalıştırın . FDO formatının karışık MULTI ve SINGLE geometri türlerine izin verdiğini unutmayın, bu yüzden önce her tablonun hangi geometri türlerini içerdiğini kontrol ediyorum ve tüm özelliklerin aynısı. Kullandığım CastToMulti()şöyle, gerekli yerlerde:

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

Geometriler karıştırılır, bu nedenle her şeyi MULTI olarak ayarlayın, ardından RecoverGeometryColumn () işlevini yapın:

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

Ve böylece ihtiyacınız olan her masa için. Şimdi tablolar QGIS'de mevcut.


Kapsamlı cevap için teşekkür ederim. Neden bazı tabloların FDO ile neden "içe aktarıldığını" biliyor musunuz? FDO tedavisini alan 128 tablodan 30'unu sayıyorum. Orijinal ve fdo versiyonlarındaki PRAGMA aynıdır, bu yüzden tek farkın geometrinin kendisinde olduğunu varsayıyorum. Ancak geometry_columns tüm geometrilerin WKB olduğunu düşünür.
Lee Hachadoorian

Micha, bunu en iyi cevap olarak seçtim. Tablolara daha fazla baktığımda, veritabanının VirtualFDO aracılığıyla kullanılabilen bazı tablolarla ve diğerlerinin geometrileriyle ama SpatiaLite uyumlu olmayanlarla paketlenmesini garip buluyorum. Bu şekilde dönüştürmeye çalışmak yerine, şekil dosyalarını indirip bunları SpatiaLite'a (PostGIS için zaten yapmıştım) aktaracağımı düşünüyorum. Ama bu hala çok bilgilendirici bir cevaptı, onu oluşturduğunuz süre için teşekkür ederim.
Lee Hachadoorian

Sadece bir spatialite veritabanı istiyorsanız ve o derlenmiş spatialite destekli GDAL / OGR'niz varsa: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db çalışmalıdır.

3

Add vector layer ...QGIS 2.0.1'de ile veritabanından veri ekleyebilirsiniz .

Ancak sabırlı olun, çok fazla veri var.

Qspatialite eklentisi ne yazık ki ne verilerle ne de Spatialit Katman Ekle diyaloğu ile ilgilenemiyor.


Andre, bu gerçekten faydalı bir bilgi. QGIS'in SQLite-SpatiaLite veritabanlarından veri eklemek için OGR'yi kullanabileceğini fark etmedim.
Lee Hachadoorian

Ayrıca katmanları eklemenin iki yolu olduğunu anlamıyorum ve sadece bir tane çalışıyor ;-)
AndreJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.