API:http://edndoc.esri.com/arcsde/9.2/api/japi/docs/index.html
介紹
ArcSDE Java API提供了一個(gè)開(kāi)放的、高層次的編程接口,以處理與分析空間信息。它包含了三個(gè)java包:Client包、Geometry包、以及Projection包。
Client包提供了實(shí)現(xiàn)ArcSDE服務(wù)器相關(guān)的功能的類。利用這個(gè)包建立的應(yīng)用程序,能建立一個(gè)到ArcSDE實(shí)例的連接,查詢一個(gè)層,或者與ArcSDE服務(wù)器進(jìn)行通訊。
Geometry包提供了實(shí)現(xiàn)OGC(開(kāi)源GIS)幾何學(xué)功能接口的類。
Projection包提供了定義一個(gè)坐標(biāo)系統(tǒng)與在不同坐標(biāo)系統(tǒng)中轉(zhuǎn)換的功能的類。
下面的主題對(duì)ArcSDE Java API的功能進(jìn)行了大體的介紹。
設(shè)置API
在ArcSDE客戶端安裝的時(shí)候安裝了下列文件:
1. jsde90_sdk.jar- 包含了ArcSDE客戶端, 幾何學(xué)功能以及SG Java API的類文件。
2. jpe90_sdk.jar – 包含了ArcSDE Projection Engine Java API的類文件。
3. concurrent.jar – 這個(gè)文件在使用PeCSTransformationX()時(shí)必須要用到, PeCSTransformationX()的功能是轉(zhuǎn)換坐標(biāo)系統(tǒng)。
4. sdejavautil.dll (Windows平臺(tái)下) - contains the native code portion of the com.esri.sde.sdk.client.SeInstance start function.
5. libsdejavautil.so (Unix platforms only, libsdejavautil.sl on HP-UX) - contains the native code portion of the com.esri.sde.sdk.client.SeInstance start function.
Java Doc(HTML格式的API功能參考文檔)可以在ArcSDE Developer Help中鏈接到,這個(gè)文檔可以在ArcSDE客戶端安裝的CD上以及ESRI的技術(shù)支持網(wǎng)站中找到。
要建立一個(gè)使用ArcSDE java API的應(yīng)用程序,你必須要在系統(tǒng)中安裝Java 2 Standard Edition SDK,1.4.0版本以上。你還必須在你的CLASSPATH環(huán)境變量中加上jsde90_sdk.jar, jpe90_sdk.jar and concurrent.jar的文件路徑。如果你還要使用到com.esri.sde.sdk.client.SeInstance的Start 函數(shù),你還要往你的系統(tǒng)路徑(Windows平臺(tái) system path;所有的Unix平臺(tái)system library path)中添加sdejavautil library。
連接到ArcSDE
使用ArcSDE軟件的第一步是建立一個(gè)ArcSDE服務(wù)器連接。SeConnection類就是用來(lái)建立一個(gè)連接的。下面是一個(gè)建立連接的例子:
public static void main (String args[])throws Exception {
SeConnection conn = null;
String server = “sdeserver”;
int instance = 5151;
String database = “sdedb”;
String user = “user”;
String password = “passwd”;
try {
conn = new SeConnection(server, instance, database, user, password);
}catch (SeException e) {
e.printStackTrace();
}
}
注意:instance參數(shù)是ArcSDE服務(wù)器的端口號(hào)。例如:5151,而不是esri_sde。
連接與數(shù)據(jù)庫(kù)信息
SeConnection類還提供了取得ArcSDE服務(wù)器信息的方法,這些信息包括:服務(wù)器的版本以及連接的信息。使用SeConnection類還可以取得存儲(chǔ)在RDBMS上的數(shù)據(jù)的相關(guān)信息。下面的例子展示了如何取得存儲(chǔ)與ArcSDE數(shù)據(jù)庫(kù)內(nèi)的的圖層列表信息(假設(shè)連接已經(jīng)建立)。
Vector layerList = conn.getLayers();
for( int index = 0 ; index < layerList.size() ; index++ ) {
SeLayer layer = (SeLayer)layerList.elementAt(index);
// Displays the layer’s name
System.out.println( layer.getName() );
// Displays the layer’s ID
System.out.println( layer.getID().longValue() );
// Displays the layer’s spatial column name
System.out.println( layer.getSpatialColumn() );
}
SeLayer對(duì)象包含了圖層的所有相關(guān)信息ArcSDE Java API函數(shù)參考中還列出了其他的取得ArcSDE layer的屬性的方法.
Fetching data
數(shù)據(jù)從一張表或者一個(gè)layer中查詢得出。SeQuery對(duì)象則是用于準(zhǔn)備并執(zhí)行一個(gè)查詢操作,建立并執(zhí)行一個(gè)查詢的步驟如下:
1.建立一個(gè)SeSqlConstruct對(duì)象,這個(gè)對(duì)象中有想要查詢的table/layer的名字。你也可以在SeSqlConstruct的構(gòu)造函數(shù)中指定一個(gè)where查詢語(yǔ)句。
SeLayer layer = new SeLayer( conn, layerName, spatialColumn );
SeSqlConstruct sqlConstruct = new SeSqlConstruct( layer.getName() );
2.創(chuàng)建一個(gè)String數(shù)組以存儲(chǔ)要查詢的表的列名。
String[] cols = new String[2];
cols[0] = new String("ColumnOneName");
cols[1] = layer.getSpatialColumn();
3.定義,準(zhǔn)備并執(zhí)行查詢。
// Create a query stream between the client and server
SeQuery query = new SeQuery( conn, cols, sqlConstruct );
query.prepareQuery();
query.execute();
4.取查詢結(jié)果的第一行存入SeRow對(duì)象中。
SeRow row = query.fetch();
5.取得SeRow的列結(jié)構(gòu)。
// Get the definitions of all the columns retrieved
SeColumnDefinition[] colDefs = SeRow.getColumns();
6.先獲取第一列的數(shù)據(jù)類型,然后獲取該單元上的數(shù)據(jù)。
//獲取第一列的數(shù)據(jù)類型。
int colNum = 0;
int dataType = colDefs[colNum].getType;
//假定數(shù)據(jù)類型只有String和Shape兩種。
//可以自己添加一些語(yǔ)句以支持ArcSDE列的所有數(shù)據(jù)類型。
// ( See Working with Layers Example )
switch( dataType ) {
case SeColumnDefinition.TYPE_STRING:
System.out.println(colDef.getName()+ row.getString(colNum));
break;
case SeColumnDefinition.TYPE_SHAPE:
System.out.println(colDef.getName() );
SeShape shape = row.getShape(colNum);
//調(diào)用一個(gè)函數(shù)以獲取Shape的屬性。
break;
}
7.關(guān)閉查詢。
query.close();
注意:為了取出查詢結(jié)果所有的行,可以反復(fù)的調(diào)用query.fetch直至SeRow對(duì)象返回為空值為止。
插入數(shù)據(jù)
可以使用SeInsert類來(lái)往一張表或者圖層中插入數(shù)據(jù)。插入數(shù)據(jù)的步驟如下:
1. 建立一個(gè)String對(duì)象,以存儲(chǔ)要添加數(shù)據(jù)的表的列名。注意數(shù)組索引值;這些索引值將在SeRow.set*中使用到。String類型的列的索引值是0,而Shape類型的列的索引值是1.
String[] cols = new String[2];
cols[0] = new String("ColumnOneName");
cols[1] = layer.getSpatialColumn();
2.使用當(dāng)前的連接句柄Connection conn,創(chuàng)建一個(gè)SeInsert對(duì)象.這將建立一個(gè)從客戶端到服務(wù)器的Insert數(shù)據(jù)流(Stream)。然后根據(jù)表或圖層的列名來(lái)插入數(shù)據(jù),設(shè)置SeInsert對(duì)象為可寫(xiě)模式(setWriteMode)。
SeInsert insert = new SeInsert(conn);
insert.intoTable(layer.getName(),cols);
insert.setWriteMode(true);
3.獲取SeInsert對(duì)象中將要添加的SeRow對(duì)象。然后設(shè)置要插入的數(shù)據(jù),這一步用到SeRow.set*方法。利用第一步中確定的索引值來(lái)作為set*方法中的columnPosition參數(shù)。
SeRow row = insert.getRowToSet();
row.setString(0, "Shape Number One");
row.setShape(1,shape);
4.調(diào)用SeInsert對(duì)象的execute()方法,將前面設(shè)置好的SeRow對(duì)象插入到圖層中。最后關(guān)閉Insert數(shù)據(jù)流(Stream)結(jié)束這次插入的操作。如果不再使用到連接句柄Connection conn,也順便把連接關(guān)閉。
insert.execute();
insert.close();
注意:數(shù)據(jù)只能插入到由用戶創(chuàng)建并維護(hù)的列中,如果某個(gè)列被注冊(cè)為
SE_REGISTRATION_ROW_ID_COLUMN_TYPE_SDE
則這個(gè)列的值將有ArcSDE自動(dòng)生成并插入,另外object id在ArcCatalog建立一張表或者Feature class的時(shí)候就生成了,由ArcSDE維護(hù),用戶不能插入,刪除或者修改這一列中的值。