国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺析ArcSDE C API入庫方法和原理

2010-11-13 07:44張卓然
湖南科技學(xué)院學(xué)報 2010年4期
關(guān)鍵詞:空間數(shù)據(jù)數(shù)據(jù)流對象

張卓然

(湖南拓維軟件工程公司,湖南 長沙 410082)

ArcSDE提供了空間數(shù)據(jù)在商用關(guān)系數(shù)據(jù)庫管理系統(tǒng)中進(jìn)行存儲、訪問、編輯的通道。ArcSDE的面向?qū)ο蟮臄?shù)據(jù)存儲模型使得開發(fā)人員將更多的精力應(yīng)用在空間數(shù)據(jù)的應(yīng)用層,而數(shù)據(jù)的存儲、表達(dá)等比較底層的應(yīng)用由ArcSDE所定義的規(guī)則去完成。

圖3.4ArcSDE空間數(shù)據(jù)訪問流

根據(jù)不同用戶的需求,ArcSDE除支持多種服務(wù)器系統(tǒng)平臺、多種數(shù)據(jù)庫系統(tǒng)以外,在客戶端,用戶同樣可以根據(jù)自己的需求來選擇客戶端應(yīng)用軟件。ArcSDE C API是提供給開發(fā)人員定制客戶端定端軟件的應(yīng)用程序開發(fā)接口,ArcSDE通過提供空間約束對標(biāo)準(zhǔn)SQL進(jìn)行了擴(kuò)展,從而實現(xiàn)了帶有空間約束條件的空間數(shù)據(jù)庫的查詢工作。其主要工作 流程如圖3.4所示,通過查詢(屬性、空間)以后獲取的結(jié)果存放在一個數(shù)據(jù)集中,用戶可以順序訪問數(shù)據(jù)集中的數(shù)據(jù)。數(shù)據(jù)的類型可以是字符型、也可以是shape幾何類型的數(shù)據(jù)。通過ArcSDE訪問幾何數(shù)據(jù),一般要通過以下幾個步驟:

1)空間數(shù)據(jù)庫連接

不管是從ArcSDE中讀取數(shù)據(jù)還是存儲數(shù)據(jù),都必須先建立與ArcSDE 服務(wù)器的連接。連接ArcSDE服務(wù)器的實質(zhì)就是建立一個正確的 ArcSDE連接句柄,可以通過函數(shù)SE_connection_create來創(chuàng)建。其函數(shù)原型如下所示:

LONG SE_connection_create(const CHAR *server,const CHAR *instance,

const CHAR *database,const CHAR *username,const CHAR *password,

SE_ERROR *error,SE_CONNECTION *connection);

SE_CONNECTION Connection;

SE_ERROR Connect_error;

LONG rc;

CHAR*server, *instance, *database, *user, *passwd;

//創(chuàng)建數(shù)據(jù)庫連接

rc = SE_connection_create(server, instance, database, user,

passwd,Connect_error,&Connection);

//進(jìn)行錯誤檢驗,查看創(chuàng)建數(shù)據(jù)庫連接是否成功

check_error (Connection, NULL, rc,"SE_connection_create");//進(jìn)行數(shù)據(jù)庫操作……//數(shù)據(jù)庫連接釋放,這個是空間數(shù)據(jù)庫操作的最后一步,后文會描述

SE_connection_free(Connection);

2)數(shù)據(jù)流對象的創(chuàng)建

要實現(xiàn)數(shù)據(jù)庫查詢,首先要創(chuàng)建一個數(shù)據(jù)庫流(SE_STREAM)對象,數(shù)據(jù)流對象用于實現(xiàn)客戶端和服務(wù)器端的數(shù)據(jù)的訪問、傳輸。類似于DBMS的游標(biāo)對象,數(shù)據(jù)流對象使得用戶可以循環(huán)的訪問數(shù)據(jù)集對象,SE_stream_create()可以用來創(chuàng)建一個數(shù)據(jù)流對象,其函數(shù)原型:

LONG SE_stream_create (SE_CONNECTION Connection,SE_STREAM *Stream);

創(chuàng)建了一個數(shù)據(jù)流對象以后,當(dāng)不需要這個對象時,就需要調(diào)用函數(shù) SE_stream_free()將其釋放,函數(shù)原型如下,參數(shù)含義同上:

LONG SE_stream_free (SE_STREAMstream);

創(chuàng)建數(shù)據(jù)流對象代碼如下:

LONG rc;

SE_STREAMStream;//創(chuàng)建數(shù)據(jù)流對象

rc = SE_stream_create (Connection, &Stream);

//進(jìn)行錯誤檢驗,查看創(chuàng)建數(shù)據(jù)流對象是否成功checke_error (Connection, NULL, rc,

"SE_stream_create");

//進(jìn)行數(shù)據(jù)訪問操作,訪問的結(jié)果存放在SE_STREAM對象中

……

//釋放數(shù)據(jù)流對象

rc = SE_stream_free (Stream);

3)空間數(shù)據(jù)查詢

ArcSDE對標(biāo)準(zhǔn)SQL進(jìn)行了空間擴(kuò)展,使得其可以進(jìn)行空間數(shù)據(jù)查詢,而這樣的擴(kuò)展是通過SE_SQL_CONSTRUCT數(shù)據(jù)結(jié)構(gòu)來完成的。

typedef struct {

LONGnum_tables;//表的數(shù)目CHAR**tables;//表名數(shù)組

CHAR*where;//SQL查詢條件語句

} SE_SQL_CONSTRUCT;

在使用SE_SQL_CONSTRUCT對象之前,首先要調(diào)用SE_sql_construct_alloc來為其分配內(nèi)存空間,參數(shù)意義同上。

LONG SE_sql_construct_alloc(LONG num_tables,

SE_SQL_CONSTRUCT

**constructor);

空間數(shù)據(jù)的查詢包括屬性條件查詢和空間幾何限制條件查詢兩個部分。屬性條件查詢條件通過SE_SQL_CONSTRUCT的where條件語句進(jìn)行設(shè)置。而空間幾何條件查詢的條件通過SE_FILTER結(jié)構(gòu)對象進(jìn)行設(shè)置,主要用到了兩個方法:SE_stream_query和

SE_stream_set_spatial_constraints,函數(shù)原型如下:

LONG SE_stream_query(SE_STREAM stream,SHORT

num_columns,

const CHAR **columns,const SE_SQL_CONSTRUCT*construct);

函數(shù)功能:設(shè)置空間數(shù)據(jù)查詢的屬性條件,參數(shù)意義如下:

construct屬性查詢數(shù)據(jù)結(jié)構(gòu)

LONG SE_stream_set_spatial_constraints(SE_STREAM stream,SHORT search_order,

BOOL calc_masks,SHORT num_filters,const SE_FILTER*filters);

函數(shù)功能:設(shè)置空間數(shù)據(jù)查詢的幾何限制條件,各參數(shù)意義如下:

具體使用方法如下:

SE_FILTERfilter;

SE_SQL_CONSTRUCT*SQL=NULL;//屬性查詢條件的設(shè)置

rc = SE_sql_construct_alloc(1, &SQL);

SQL->where = (char*)malloc(20);

SQL->num_tables = 1;

strcpy(SQL->tables[0], strlyrName);

strcpy(SQL->where,"ObjectID>=1");

//設(shè)置屬性查詢條件

attrs1[0] = "Shape";//檢索用圖形字段

attrs1[1] = "ObjectID"; //檢索用屬性字段

//屬性結(jié)果就是返回所有的記錄數(shù)據(jù)

rc = SE_stream_query(stream, 2, (const char **)attrs1,SQL);

//設(shè)置空間過濾關(guān)系

strcpy(filter.table,strlyrName);

strcpy(filter.column, "Shape");

filter.filter_type = SE_SHAPE_FILTER;

filter.filter.shape = clipShp;

filter.truth = TRUE;

//SM_SC表示待查找的幾何目標(biāo)包含在結(jié)構(gòu)體的shape幾何對象中

filter.method = SM_SC ;

/

/設(shè)置空間幾何過濾條件

rc=SE_stream_set_spatial_constraints(stream,

SE_SPATIAL_FIRST, FALSE, 1,&filter);

//執(zhí)行查詢,查詢結(jié)果存儲在stream對象里面

rc = SE_stream_execute(stream);

//處理獲取的數(shù)據(jù)

……

//關(guān)閉、釋放數(shù)據(jù)流對象

rc = SE_stream_close(stream,TRUE);

rc = SE_stream_free(stream);

//釋放屬性查詢條件結(jié)構(gòu)對象

free(SQL->where);

SE_sql_construct_free(SQL);

4)數(shù)據(jù)對象的訪問

通過擴(kuò)展的空間SQL訪問數(shù)據(jù)庫中的數(shù)據(jù),得到的結(jié)果被存儲在空間數(shù)據(jù)流對象(Stream)中,下面主要介紹對該數(shù)據(jù)流中的對象進(jìn)行瀏覽、編輯、存儲的方法。數(shù)據(jù)的查詢返回的結(jié)果SE_STREAM,初始值是指向結(jié)果的第一個元素對象,SE_stream_fetch()函數(shù)主要用于數(shù)據(jù)集對象中數(shù)據(jù)的循環(huán)訪問,每次返回游標(biāo)所指向的一條數(shù)據(jù)記錄,如果訪問成功返回SE_SUCCESS,如果到達(dá)數(shù)據(jù)集的末尾,則返回SE_FINISHED,函數(shù)原型為:

LONG SE_stream_fetch (SE_STREAM stream);

數(shù)據(jù)集的訪問偽代碼如下:

while (RC == SE_SUCCESS)

{

//獲取查詢結(jié)果,循環(huán)逐一獲取

RC = SE_stream_fetch(stream);

If (RC != SE_SUCCESS)

//錯誤處理

else

{

rc=SE_stream_get_integer(stream,2,&nObjectID);

if (rc !=SE_SUCCESS)

//錯誤處理

}

}

5)處理對象數(shù)據(jù)的釋放

在C++中要求分配的內(nèi)存空間在程序結(jié)束的時候要解釋釋放,同樣ArcSDE C API要求開發(fā)人員在程序模塊結(jié)束,將不再使用的數(shù)據(jù)對象所占據(jù)的內(nèi)存空間進(jìn)行手工的釋放,在以上的事例代碼中,大家已經(jīng)看到了,空間數(shù)據(jù)據(jù)庫連接對象在結(jié)束時通過SE_connection_free()釋放了,而數(shù)據(jù)流對象也在訪問之后被關(guān)閉,同時內(nèi)存空間也得到了釋放。

通過以上五個步驟,我們實現(xiàn)了空間數(shù)據(jù)庫的訪問,同樣的道理,我們可以通過流程進(jìn)行數(shù)據(jù)記錄對象增加、修改和刪除工作。

[3]劉恩林,石軍南,羅鵬,雷平.Geodatabase 模型的版本控制原理及應(yīng)用[J]. 西安文理學(xué)院學(xué)報:自然科學(xué)版. 2007,(1).

[4]宋楊,萬幼川.一種新型空間數(shù)據(jù)模型Geodatabase[J] .測繪通報,2004,(11).

猜你喜歡
空間數(shù)據(jù)數(shù)據(jù)流對象
涉稅刑事訴訟中的舉證責(zé)任——以納稅人舉證責(zé)任為考察對象
汽車維修數(shù)據(jù)流基礎(chǔ)(上)
汽車維修數(shù)據(jù)流基礎(chǔ)(下)
攻略對象的心思好難猜
基于熵的快速掃描法的FNEA初始對象的生成方法
元數(shù)據(jù)驅(qū)動的多中心空間數(shù)據(jù)同步方法研究
區(qū)間對象族的可鎮(zhèn)定性分析
基于數(shù)據(jù)流聚類的多目標(biāo)跟蹤算法
北醫(yī)三院 數(shù)據(jù)流疏通就診量
基于文件系統(tǒng)的分布式海量空間數(shù)據(jù)高效存儲與組織研究