在剛剛結(jié)束的2013Esri開發(fā)者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數(shù)據(jù)。 大家都知道ArcGIS支持傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(oracle、SQL Server、IBM DB2、In
在剛剛結(jié)束的2013Esri開發(fā)者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數(shù)據(jù)。
大家都知道ArcGIS支持傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(oracle、SQL Server、IBM DB2、Informix、PostgreSQL),還支持現(xiàn)在比較火的云數(shù)據(jù)庫(SQL Azure),而且還有一些輕量級的數(shù)據(jù)庫比如這次講到的SQlite,而且還支持數(shù)據(jù)倉庫(IBM Netszza、TeraData Database)。
首先看看SQLite數(shù)據(jù)庫,這個數(shù)據(jù)庫一般應(yīng)用在手機開發(fā)中。
SQLite,是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計目標是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。 至今已經(jīng)有12個年頭,SQLite也迎來了一個版本 SQLite 3已經(jīng)發(fā)布。
下載軟件點擊
ArcGIS10.2可以支持將數(shù)據(jù)存儲在SQLite上,ArcGIS提供了相關(guān)的GP工具(ArcPy,支持在SQLite上創(chuàng)建空間數(shù)據(jù)存儲)
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后綴名
創(chuàng)建完畢之后,系統(tǒng)會默認創(chuàng)建四個表
sqlite> .tables st_aux_spatial_reference_systems st_spatial_reference_systems st_geometry_columns st_vtspindex_interface
通過控制 SQLite 數(shù)據(jù)庫的存儲位置的文件夾上的權(quán)限來控制對 SQLite 數(shù)據(jù)庫的訪問。與其他數(shù)據(jù)庫不同的是您沒有創(chuàng)建該數(shù)據(jù)庫,通過進行身份驗證的用戶和你不要向其他用戶授予對特定的數(shù)據(jù)集的權(quán)限。
SQLite 可以讀取由多個用戶,但您應(yīng)不進行任何更新到數(shù)據(jù)庫而另一個用戶正在更新。例如,不要將數(shù)據(jù)追加到現(xiàn)有的表或另一個用戶正在將數(shù)據(jù)追加到現(xiàn)有的表或數(shù)據(jù)庫中創(chuàng)建表時在數(shù)據(jù)庫中創(chuàng)建表。
上面的ext4.sqlite里面有三個要素類:
dd是一個空要素類(Unknown)
ff是一個有數(shù)據(jù)的要素類(Unknown)
gg是一個空要素類(Xian_1980_3_Degree_GK_CM_120E)
將要素類導(dǎo)入之后就很好奇,這些數(shù)據(jù)是怎么存儲到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數(shù)據(jù)源 - ArcGIS技術(shù)研究 - 博客頻道 - CSDN.NET
我們可以看看這些表里面的相關(guān)信息
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數(shù)據(jù)的St_geometry_columns,這個st_aux_spatial_reference_systems類似于st_spatial_reference。
查看一下ff數(shù)據(jù)的信息
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
同樣,我們可以看看相關(guān)表的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。
這里面也有相關(guān)的字段類型可以參考如下
SQLite 也是不同于其他的數(shù)據(jù)庫中字段未分配特定的數(shù)據(jù)類型和數(shù)據(jù)類型定義沒有得到嚴格執(zhí)行。相反,SQLite 使用要素類可以在其中存儲不同的數(shù)據(jù)類型的值。
然而,ArcGIS 可以只與一個每個字段的數(shù)據(jù)類型和不會嚴格執(zhí)行數(shù)據(jù)類型。在 ArcGIS 中查看 SQLite 數(shù)據(jù)時,您應(yīng)該意識到這一差異的數(shù)據(jù)類型強制執(zhí)行。
同樣,我們也可以直接使用SQL語句創(chuàng)建表,創(chuàng)建坐標,使用ArcMap提供的Add XY坐標來顯示,基本上ArcGIS10.1之前的版本,Android開發(fā)都是使用這種方式
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
同樣,我們也可以使用數(shù)據(jù)庫管理工具來對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不僅僅能夠創(chuàng)建空間字段為ST_Geometry類型的(Esri支持),也提供SQLite原生提供的Spatialite類型的
>>> arcpy.gp.CreateSQLiteDatabase(r'C:\c.sqlite',"SPATIALITE") u'C:\\c.sqlite'
那么,我在已經(jīng)創(chuàng)建好的SQLite的原生Statialite存儲也同樣創(chuàng)建了相關(guān)系統(tǒng)表
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
大數(shù)據(jù)量導(dǎo)入測試:
我將一個面狀要素類(3000000)記錄的數(shù)據(jù)導(dǎo)入到SQLite里面,系統(tǒng)會自動創(chuàng)建索引,在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有直接讀取數(shù)據(jù)庫里面的Shape字段也就是讀取成圖形信息,這個應(yīng)用也很廣泛吧。
未完待續(xù):
還有一個問題沒有弄清楚,ArcGIS10.2桌面也提供了關(guān)于SQLite的Dll,這個現(xiàn)在還不太清楚干什么用
1:有可能使用桌面操作SQLite就是調(diào)用這個dll
2:使用SQL可以直接操作SQLite類似SQL 操作Oracle數(shù)據(jù)庫編輯空間數(shù)據(jù)。
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com