Làm cách nào để sử dụng DB SQL Earth tự nhiên với QGIS?


9

Tôi vừa tải xuống dữ liệu Trái đất tự nhiên ở định dạng SQLite từ http://www.naturalearthdata.com/doads/ . Tôi đã giả định rằng đây sẽ là một cơ sở dữ liệu SpatiaLite, nhưng có vẻ như không phải vậy! QGIS không công nhận nó là một cơ sở dữ liệu không gian. OGR được cho là hỗ trợ đọc hình học ngay cả khi được lưu trữ trong cơ sở dữ liệu SQLite đơn giản, nhưng có lẽ QGIS không sử dụng OGR cho SpatiaLite?

Cơ sở dữ liệu SQLite có các bảng hình học_column và spatial numf_sys. Có cách nào để chuyển đổi nó thành cơ sở dữ liệu SpatiaLite đầy đủ không?

Câu trả lời:


9

Tệp sqlite từ NE có định dạng FDO-OGR, không phải là hình học không gian nguyên gốc. Nếu bạn sẵn sàng làm một số lao động thủ công, đây là một cách để chuyển đổi sang db không gian:

Đầu tiên tạo một cơ sở dữ liệu không gian trống mới, trống rỗng (tôi gọi nó là "nev.sqlite"), sau đó trong một phiên cuối cùng riêng biệt, mở tệp gốc_earth_vector.sqlite bằng spatialite. (Tôi đã sử dụng phiên bản mới hơn 4.1. Không chắc điều này có hoạt động với các phiên bản cũ hơn không). Sử dụng attachhàm sqlite để kết nối với bảng nev.sqlite mới của bạn và tạo các bản sao của các bảng bạn muốn vào cơ sở dữ liệu mới.

Vì thế:

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ất cả các dòng "được tạo VirtualFDO ..." chỉ ra rằng Spatialite đã nhận ra dữ liệu dưới dạng FDO và tạo các bảng ảo cho mỗi bảng với GEOMETRY được chuyển đổi sang định dạng spatialite. Tôi attachđến cơ sở dữ liệu "nev" mới của mình và tạo các bảng mới cho mỗi lớp mà tôi quan tâm với các CREATE TABLE ... AS SELECT * FROM ...câu lệnh.

Bây giờ tôi chuyển trở lại cơ sở dữ liệu không gian mới . Và chạy RecoverGeometryColumn()trên mỗi bảng để có cơ sở dữ liệu không gian phù hợp, với tất cả siêu dữ liệu, v.v ... Lưu ý rằng định dạng FDO cho phép các loại hình học MULTI và SINGLE hỗn hợp, vì vậy trước tiên tôi kiểm tra loại hình học nào mỗi bảng chứa và đảm bảo rằng tất cả các tính năng đều có giống nhau. Tôi sử dụng CastToMulti()bất cứ khi nào cần thiết, như vậy:

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

Hình học được trộn lẫn, vì vậy hãy đặt mọi thứ MULTI, sau đó thực hiện RecoverGeometryColumn ():

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

Và như vậy cho mỗi bảng bạn cần. Bây giờ các bảng có sẵn trong QGIS.


Cảm ơn bạn đã trả lời thấu đáo. Bạn có biết tại sao chỉ một số bảng được "nhập" với FDO không? Tôi đếm 30 trong số 128 bảng được điều trị FDO. PRAGMA trên phiên bản gốc và fdo là như nhau, vì vậy tôi cho rằng sự khác biệt duy nhất là ở chính hình học. Nhưng hình học_column nghĩ rằng tất cả các hình học là WKB.
Lee Hachadoorian

Micha, tôi đã chọn đây là câu trả lời hay nhất. Nhìn xa hơn vào các bảng, tôi thấy lạ là cơ sở dữ liệu chỉ được đóng gói với một số bảng có thể sử dụng thông qua VirtualFDO và các bảng khác có hình học nhưng không tương thích với SpatiaLite. Thay vì cố gắng chuyển đổi theo cách này, tôi nghĩ rằng tôi sẽ tải xuống các shapefiles và nhập chúng vào SpatiaLite (điều mà tôi đã thực hiện cho PostGIS). Nhưng đây vẫn là một câu trả lời rất nhiều thông tin, cảm ơn bạn vì đã dành thời gian tạo ra nó.
Lee Hachadoorian

Nếu bạn chỉ muốn một cơ sở dữ liệu không gian và bạn có GDAL / OGR với hỗ trợ spatialite được biên dịch trong: ogr2ogr -f sqlite -dsco spatialite = yes splite.db nat_earth.db sẽ hoạt động.

3

Bạn có thể thêm dữ liệu từ cơ sở dữ liệu với Add vector layer ...trong QGIS 2.0.1.

Nhưng hãy kiên nhẫn, nó là rất nhiều dữ liệu.

Rất tiếc, plugin Qspatialite không thể xử lý dữ liệu cũng như đối thoại lớp Thêm Spatialite.


Andre, đó là thông tin thực sự hữu ích. Tôi đã không nhận ra QGIS có thể sử dụng OGR để thêm dữ liệu từ cơ sở dữ liệu SQLite-not-SpatiaLite.
Lee Hachadoorian

Tôi cũng không hiểu tại sao có hai cách để thêm các lớp và chỉ có một cách hoạt động ;-)
AndreJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.