• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    當ArcGIS10.2遇到SQLite

    來源:懂視網 責編:小采 時間:2020-11-09 07:21:04
    文檔

    當ArcGIS10.2遇到SQLite

    當ArcGIS10.2遇到SQLite:在剛剛結束的2013Esri開發者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數據。 大家都知道ArcGIS支持傳統的關系型數據庫(oracle、SQL Serve
    推薦度:
    導讀當ArcGIS10.2遇到SQLite:在剛剛結束的2013Esri開發者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數據。 大家都知道ArcGIS支持傳統的關系型數據庫(oracle、SQL Serve

    在剛剛結束的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 可以讀取由多個用戶,但您應不進行任何更新到數據庫而另一個用戶正在更新。例如,不要將數據追加到現有的表或另一個用戶正在將數據追加到現有的表或數據庫中創建表時在數據庫中創建表。


    創建完畢之后,我們就可以使用桌面在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
    我們可以看到不光有同名的dd、ff、gg表,還有一些系統表(我們習慣于稱呼為支持這種數據庫的系統表),這就是為什么GIS數據與其他數據的區別,因為GIS數據有地理的概念,這無疑就需要知道投影的信息,在以前我們研究NoSQL(MongoDB)也看到了有存儲投影的相關表。

    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>
    
    2385就是指向的Xian_1980_3_Degree_GK_CM_120E,這個都是符合OGC標準的,ArcGIS10.1之前還是用內部的SRID,現在好了 只需要知道這個標準的編碼即可(比如WGS84——4326),具體查詢可以參考如下鏈接:
    http://help.arcgis.com/en/arcgisserver/10.0/apis/rest/pcs.html

    可以看到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
    Shape字段是亂碼形式

    同樣,我們可以看看相關表的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;
    從上面可以看出,其實也是建立的Table、Virtual Table、Trigger等。

    而且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

    文檔

    當ArcGIS10.2遇到SQLite

    當ArcGIS10.2遇到SQLite:在剛剛結束的2013Esri開發者大會中,有好多用戶都會咨詢ArcGIS10.2什么時候推出,可以見得大家對ArcGIS新版本的期待,今天就給大家介紹一下一個新特性,使用SQLite來存儲GIS數據。 大家都知道ArcGIS支持傳統的關系型數據庫(oracle、SQL Serve
    推薦度:
    標簽: 結束 剛剛 201
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 日本加勒比久久精品| 亚洲精品视频在线看| 日韩欧美国产精品第一页不卡 | 亚洲人成电影网站国产精品| 91精品成人免费国产| 拍国产乱人伦偷精品视频 | 久久91精品国产91久久小草| 精品熟女少妇a∨免费久久| 四虎影视永久在线精品免费| 国产精品成人一区二区| 国产精品久久久久久久久免费| 少妇人妻偷人精品免费视频| 亚洲а∨天堂久久精品9966| 国产精品亚洲专区无码WEB| 国产午夜精品一区理论片| 亚洲国产另类久久久精品小说| 老湿亚洲永久精品ww47香蕉图片| 国产精品国产欧美综合一区| 四虎成人www国产精品| 精品亚洲永久免费精品| 91精品国产高清久久久久久io| 久久99国产综合精品免费| 亚洲精品乱码久久久久久久久久久久 | 国产精品videossex白浆| 久久91精品国产91久久户| 91国在线啪精品一区| 国产成人精品久久二区二区| 经典国产乱子伦精品视频| 久久亚洲精品人成综合网| 亚洲色精品aⅴ一区区三区 | 国产精品一区在线播放| 国产精品美女久久久m| 欧美精品欧美人与动人物牲交 | 久久久无码精品午夜| 精品久久久久久久久久久久久久久| 秋霞午夜鲁丝片午夜精品久 | 999国内精品永久免费观看| 国产三级久久久精品麻豆三级 | 亚洲AV日韩精品一区二区三区| 无码人妻一区二区三区精品视频| 久久午夜无码鲁丝片午夜精品|