在剛剛結束的2013Esri開發者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數據。 大家都知道ArcGIS支持傳統的關系型數據庫(oracle、SQL Server、IBM DB2、In
在剛剛結束的2013Esri開發者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數據。
大家都知道ArcGIS支持傳統的關系型數據庫(oracle、SQL Server、IBM DB2、Informix、PostgreSQL),還支持現在比較火的云數據庫(SQL Azure),而且還有一些輕量級的數據庫比如這次講到的SQlite,而且還支持數據倉庫(IBM Netszza、TeraData Database)。
首先看看SQLite數據庫,這個數據庫一般應用在手機開發中。
SQLite,是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。 至今已經有12個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。
下載軟件點擊
ArcGIS10.2可以支持將數據存儲在SQLite上,ArcGIS提供了相關的GP工具(ArcPy,支持在SQLite上創建空間數據存儲)
import arcpy # Set local variables sqlite_database_path = 'C:\sqlite-3_6_22\ex4.sqlite' # Execute CreateSQLiteDatabase arcpy.gp.CreateSQLiteDatabase(sqlite_database_path, "ST_GEOMETRY") u'C:\\sqlite-3_6_22\\ex4.sqlite'
注意:雖然說SQLite默認的文件后綴名是*.db,但是ArcGIS只支持*.sqlite后綴名
創建完畢之后,系統會默認創建四個表
sqlite> .tables st_aux_spatial_reference_systems st_spatial_reference_systems st_geometry_columns st_vtspindex_interface
通過控制 SQLite 數據庫的存儲位置的文件夾上的權限來控制對 SQLite 數據庫的訪問。與其他數據庫不同的是您沒有創建該數據庫,通過進行身份驗證的用戶和你不要向其他用戶授予對特定的數據集的權限。
SQLite 可以讀取由多個用戶,但您應不進行任何更新到數據庫而另一個用戶正在更新。例如,不要將數據追加到現有的表或另一個用戶正在將數據追加到現有的表或數據庫中創建表時在數據庫中創建表。
上面的ext4.sqlite里面有三個要素類:
dd是一個空要素類(Unknown)
ff是一個有數據的要素類(Unknown)
gg是一個空要素類(Xian_1980_3_Degree_GK_CM_120E)
將要素類導入之后就很好奇,這些數據是怎么存儲到SQLite里面的,先查看一下里面的表
C:\sqlite-3_6_22>sqlite3 ex4.sqlite SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables dd st_spindex__ff_Shape ff st_spindex__ff_Shape_node gg st_spindex__ff_Shape_parent st_aux_spatial_reference_systems st_spindex__ff_Shape_rowid st_geometry_columns st_spindex__gg_SHAPE st_spatial_reference_systems st_spindex__gg_SHAPE_node st_spindex__dd_SHAPE st_spindex__gg_SHAPE_parent st_spindex__dd_SHAPE_node st_spindex__gg_SHAPE_rowid st_spindex__dd_SHAPE_parent st_vtspindex_interface st_spindex__dd_SHAPE_rowid
ArcGIS支持MongoDB數據源 - ArcGIS技術研究 - 博客頻道 - CSDN.NET
我們可以看看這些表里面的相關信息
sqlite> select * from st_geometry_columns; 1|dd|SHAPE|2006|3|300001|RTREEXY 2|ff|Shape|6|2|300002|RTREEXY 3|gg|SHAPE|6|2|2385|RTREEXY sqlite> select * from st_aux_spatial_reference_systems; 300000|ESRI|300000|UNKNOWN|-450359962737.05|-450359962737.05|10000.0|0.0|1.0|0.0|1.0||||1 300001|ESRI|500000|UNKNOWN|-450359962737.05|-450359962737.05|10000.0|0.0|1.0|-100000.0|10000.0|0.001|0.0|0.001|1 300002|EPSG|4326|GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]|e-09|0.001|0.001|1 sqlite>
可以看到St_geometry_columns表是存儲空間字段的投影信息的類似于Oracle數據的St_geometry_columns,這個st_aux_spatial_reference_systems類似于st_spatial_reference。
查看一下ff數據的信息
sqlite> .mode column sqlite> select * from ff; OBJECTID Shape CONTINENT ---------- ---------- ---------- 1 d鈸伐 Asia 2 d鈸? North Amer 3 d鈸-k Europe 4 d鈸 Africa 5 d鈸,- South Amer 6 d鈸 Oceania 7 d鈸? Australia 8 d鈸鞱 Antarctica
同樣,我們可以看看相關表的Schema
sqlite> .schema CREATE TABLE dd ( OBJECTID integer primary key autoincrement not null, SHAPE geometryblob check((typeof(SHAPE) = 'blob' and length(SHAPE) >= 18 and cast(hex(substr(SHAPE,1,1)) as integer) = 64) or typeof(SHAPE) = 'null')); CREATE TABLE ff ( OBJECTID integer primary key autoincrement not null, Shape geometryblob check((typeof(Shape) = 'blob' and length(Shape) >= 18 and cast(hex(substr(Shape,1,1)) as integer) = 64) or typeof(Shape) = 'null'), CONTINENT text(13) check((typeof(CONTINENT) = 'text' or typeof(CONTINENT) = 'null') and not length(CONTINENT) > 13)); CREATE TABLE gg ( OBJECTID integer primary key autoincrement not null, SHAPE geometryblob check((typeof(SHAPE) = 'blob' and length(SHAPE) >= 18 and cast(hex(substr(SHAPE,1,1)) as integer) = 64) or typeof(SHAPE) = 'null')); CREATE TABLE st_aux_spatial_reference_systems ( srid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, auth_name TEXT(256), auth_srid INT32, srtext TEXT(2048), falsex FLOAT64 NOT NULL, falsey FLOAT64 NOT NULL, xyunits FLOAT64 NOT NULL, falsez FLOAT64 DEFAULT 0.0, zunits FLOAT64 DEFAULT 1.0, falsem FLOAT64 DEFAULT 0.0, munits FLOAT64 DEFAULT 1.0, xycluster_tol FLOAT64, zcluster_tol FLOAT64, mcluster_tol FLOAT64, object_flags INT32 DEFAULT 0); CREATE TABLE st_geometry_columns ( gcid INTEGER PRIMARY KEY AUTOINCREMENT, f_table_name CLOB NOT NULL, f_geometry_column CLOB NOT NULL, geometry_type INT32, coord_dimension INT32, srid INTEGER NOT NULL, spatial_index_type CLOB, CONSTRAINT gc_uk UNIQUE (f_table_name,f_geometry_column)); CREATE VIRTUAL TABLE st_spatial_reference_systems USING VSRS(); CREATE VIRTUAL TABLE st_spindex__dd_SHAPE USING RTREE (pkid,minx,maxx,miny,maxy); CREATE TABLE "st_spindex__dd_SHAPE_node"(nodeno INTEGER PRIMARY KEY, data BLOB); CREATE TABLE "st_spindex__dd_SHAPE_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER); CREATE TABLE "st_spindex__dd_SHAPE_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER); CREATE VIRTUAL TABLE st_spindex__ff_Shape USING RTREE (pkid,minx,maxx,miny,maxy); CREATE TABLE "st_spindex__ff_Shape_node"(nodeno INTEGER PRIMARY KEY, data BLOB); CREATE TABLE "st_spindex__ff_Shape_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER); CREATE TABLE "st_spindex__ff_Shape_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER); CREATE VIRTUAL TABLE st_vtspindex_interface USING VTSpindex(); CREATE TRIGGER st_delete_trigger_dd_SHAPE AFTER DELETE ON dd FOR EACH ROW BEGIN DELETE FROM st_spindex__dd_SHAPE WHERE pkid = OLD._ROWID_; END; CREATE TRIGGER st_delete_trigger_ff_Shape AFTER DELETE ON ff FOR EACH ROW BEGIN DELETE FROM st_spindex__ff_Shape WHERE pkid = OLD._ROWID_; END; CREATE TRIGGER st_insert_trigger_dd_SHAPE AFTER INSERT ON dd FOR EACH ROW BEGIN SELECT InsertIndexEntry ('st_spindex__dd_SHAPE',NEW.SHAPE,NEW._ROWID_,2); END; CREATE TRIGGER st_insert_trigger_ff_Shape AFTER INSERT ON ff FOR EACH ROW BEGIN SELECT InsertIndexEntry ('st_spindex__ff_Shape',NEW.Shape,NEW._ROWID_,2); END; CREATE TRIGGER st_update_trigger_dd_SHAPE AFTER UPDATE ON dd FOR EACH ROW BEGIN SELECT UpdateIndexEntry ('st_spindex__dd_SHAPE',NEW.SHAPE,NEW._ROWID_,2); END; CREATE TRIGGER st_update_trigger_ff_Shape AFTER UPDATE ON ff FOR EACH ROW BEGIN SELECT UpdateIndexEntry ('st_spindex__ff_Shape',NEW.Shape,NEW._ROWID_,2); END;
而且Shape字段的類型是geometryblob,核心還是BLOB。
這里面也有相關的字段類型可以參考如下
SQLite 也是不同于其他的數據庫中字段未分配特定的數據類型和數據類型定義沒有得到嚴格執行。相反,SQLite 使用要素類可以在其中存儲不同的數據類型的值。
然而,ArcGIS 可以只與一個每個字段的數據類型和不會嚴格執行數據類型。在 ArcGIS 中查看 SQLite 數據時,您應該意識到這一差異的數據類型強制執行。
同樣,我們也可以直接使用SQL語句創建表,創建坐標,使用ArcMap提供的Add XY坐標來顯示,基本上ArcGIS10.1之前的版本,Android開發都是使用這種方式
C:\sqlite-3_6_22>sqlite3 ex3.sqlite SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table tbl1(x smallint,y smallint); sqlite> insert into tbl1 vaules(10,10); Error: near "vaules": syntax error sqlite> insert into tbl1 values(10,10); sqlite> insert into tbl1 values(10,20); sqlite> insert into tbl1 values(20,20); sqlite> insert into tbl1 values(20,10); sqlite> select * from tbl1; 10|10 10|20 20|20 20|10
同樣,我們也可以使用數據庫管理工具來對SQLite里面的對象進行研究
同樣,我們也可以使用代碼來操作SQLite,以下是C#來操作SQLite,需要引用System.Data.SQLite(可能需要用戶自己下載dll)
public void test() { string connstring = "Data Source=C:\\Documents and Settings\\esrichina\\桌面\\sqlite\\sqlite-3_6_22\\ex4.sqlite"; SQLiteConnection conn = new SQLiteConnection(connstring); conn.Open(); SQLiteCommand cmd = new SQLiteCommand(conn); //查詢ff要素類的表 cmd.CommandText = "select * from ff"; SQLiteDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { //獲得ObjectID值 int a = reader.GetInt32(0); //獲得SHAPE值 var aaa = reader.GetValue(1); //獲得NAME字段值 string aa = reader.GetString(2); } }
同樣,使用ArcGIS Desktop10.2不僅僅能夠創建空間字段為ST_Geometry類型的(Esri支持),也提供SQLite原生提供的Spatialite類型的
>>> arcpy.gp.CreateSQLiteDatabase(r'C:\c.sqlite',"SPATIALITE") u'C:\\c.sqlite'
那么,我在已經創建好的SQLite的原生Statialite存儲也同樣創建了相關系統表
sqlite> .tables SpatialIndex vector_layers_auth geom_cols_ref_sys vector_layers_field_infos geometry_columns vector_layers_statistics geometry_columns_auth views_geometry_columns geometry_columns_field_infos views_geometry_columns_auth geometry_columns_statistics views_geometry_columns_field_infos geometry_columns_time views_geometry_columns_statistics spatial_ref_sys virts_geometry_columns spatialite_history virts_geometry_columns_auth sql_statements_log virts_geometry_columns_field_infos vector_layers virts_geometry_columns_statistics
sqlite> select * from geometry_columns; a|shape|6|2|4326|1 sqlite> .mode column sqlite> select * from a; 1 Asia 2 North Amer 3 Europe 4 Africa 5 South Amer 6 Oceania 7 Australia 8 Antarctica
大數據量導入測試:
我將一個面狀要素類(3000000)記錄的數據導入到SQLite里面,系統會自動創建索引,在1:10000比例尺下瀏覽速度在秒級延遲,可見效果還是不錯的。
Executing: FeatureClassToFeatureClass "C:\New File Geodatabase (3).gdb\a" C:\sqlite-3_6_22\ex4.sqlite aa # "DB2GSE_ST_ "DB2GSE_ST_" true true false 8 Double 0 0 ,First,#,C:\New File Geodatabase (3).gdb\a,DB2GSE_ST_,-1,-1;DB2GSE_SDE "DB2GSE_Sde" true true false 8 Double 0 0 ,First,#,C:\New File Geodatabase (3).gdb\a,DB2GSE_SDE,-1,-1;Shape_Length "Shape_Length" false true true 8 Double 0 0 ,First,#,C:\New File Geodatabase (3).gdb\a,Shape_Length,-1,-1;Shape_Area "Shape_Area" false true true 8 Double 0 0 ,First,#,C:\New File Geodatabase (3).gdb\a,Shape_Area,-1,-1" # Start Time: Thu Jun 13 03:04:35 2013 Succeeded at Thu Jun 13 03:27:29 2013 (Elapsed Time: 22 minutes 54 seconds)
假想:
咨詢過Android工程師,好像Windows生成的SQLite文件(*.sqlite)可以直接拷貝到Android手機上使用,如果ArcGIS10.2推出后,也不排除android的ArcGIS API有直接讀取數據庫里面的Shape字段也就是讀取成圖形信息,這個應用也很廣泛吧。
未完待續:
還有一個問題沒有弄清楚,ArcGIS10.2桌面也提供了關于SQLite的Dll,這個現在還不太清楚干什么用
1:有可能使用桌面操作SQLite就是調用這個dll
2:使用SQL可以直接操作SQLite類似SQL 操作Oracle數據庫編輯空間數據。
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com