ฉันจะใช้ฐานข้อมูล SQLite ของ Earth ธรรมชาติกับ QGIS ได้อย่างไร


9

ฉันเพียงแค่ดาวน์โหลดข้อมูลโลกธรรมชาติในรูปแบบ SQLite จากhttp://www.naturalearthdata.com/downloads/ ฉันสันนิษฐานว่านี่จะเป็นฐานข้อมูล SpatiaLite แต่ดูเหมือนจะไม่เป็นเช่นนั้น! QGIS ไม่สามารถจดจำได้ว่าเป็นฐานข้อมูลเชิงพื้นที่ OGR สนับสนุนการอ่านรูปทรงเรขาคณิตแม้ว่าจะเก็บไว้ในฐานข้อมูล SQLite ธรรมดา แต่บางที QGIS ไม่ใช้ OGR สำหรับ SpatiaLite?

ฐานข้อมูล SQLite มี geometry_columns และตาราง spatial_ref_sys มีวิธีการแปลงเป็นฐานข้อมูล SpatiaLite เต็มหรือไม่

คำตอบ:


9

ไฟล์ sqlite จาก NE อยู่ในรูปแบบ FDO-OGR ไม่ใช่รูปทรงเรขาคณิตเชิงพื้นที่ดั้งเดิม หากคุณยินดีที่จะทำงานด้วยตนเองบางส่วนต่อไปนี้เป็นวิธีแปลงเป็นฐานข้อมูลเชิงพื้นที่:

ขั้นแรกสร้างฐานข้อมูล spatialite ใหม่ที่ว่างเปล่า (ฉันเรียกมันว่า "nev.sqlite") จากนั้นในเทอร์มินัลเซสชันแยกต่างหากเปิดต้นฉบับ natural_earth_vector.sqlite ด้วย spatialite (ฉันใช้เวอร์ชันที่ใหม่กว่า 4.1 ไม่แน่ใจว่าสิ่งนี้จะใช้ได้กับเวอร์ชันที่เก่ากว่า) ใช้attachฟังก์ชันsqlite เพื่อเชื่อมต่อกับตาราง 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 formated และสร้างตารางเสมือนสำหรับแต่ละรายการด้วย 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 ฉันนับ 30 จาก 128 ตารางที่ได้รับการรักษาจาก FDO PRAGMA ในรุ่นดั้งเดิมและรุ่น fdo เหมือนกันดังนั้นฉันคิดว่าความแตกต่างเพียงอย่างเดียวคือในรูปทรงเรขาคณิตเอง แต่ geometry_columns คิดว่ารูปทรงทั้งหมดเป็น WKB
Lee Hachadoorian

Micha ฉันเลือกคำนี้เป็นคำตอบที่ดีที่สุด ดูเพิ่มเติมที่ตารางฉันพบว่าแปลกที่ฐานข้อมูลบรรจุด้วยตารางบางส่วนเท่านั้นที่สามารถใช้งานได้ผ่าน VirtualFDO และอื่น ๆ ที่มีรูปทรงเรขาคณิต แต่ไม่รองรับ SpatiaLite แทนที่จะลองแปลงด้วยวิธีนี้ฉันคิดว่าฉันจะดาวน์โหลดรูปร่างและนำเข้าสิ่งเหล่านั้นไปที่ SpatiaLite (ซึ่งฉันทำไปแล้วสำหรับ PostGIS) แต่นี่ก็ยังเป็นคำตอบที่ให้ข้อมูลมากขอบคุณสำหรับเวลาที่คุณสร้างมันขึ้นมา
Lee Hachadoorian

หากคุณต้องการฐานข้อมูล spatialite และคุณมี GDAL / OGR ที่สนับสนุน spatialite ที่คอมไพล์ใน: ogr2ogr -f sqlite -dsco spatialite = ใช่ splite.db nat_earth.db ควรทำงาน

3

คุณสามารถเพิ่มข้อมูลจากฐานข้อมูลด้วยAdd vector layer ...ใน QGIS 2.0.1

แต่ต้องอดทนมันเป็นข้อมูลจำนวนมาก

น่าเสียดายที่ปลั๊กอิน Qspatialite ไม่สามารถจัดการกับข้อมูลหรือไดอะล็อกเพิ่มเลเยอร์ Spatialite


อังเดรนั่นเป็นข้อมูลที่เป็นประโยชน์จริงๆ ฉันไม่ทราบว่า QGIS สามารถใช้ OGR เพื่อเพิ่มข้อมูลจากฐานข้อมูล SQLite-not-SpatiaLite
Lee Hachadoorian

ฉันยังไม่เข้าใจว่าทำไมมีสองวิธีในการเพิ่มเลเยอร์และมีเพียงงานเดียวเท่านั้น ;-)
AndreJ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.