API:http://edndoc.esri.com/arcsde/9.2/api/japi/docs/index.html
介紹
ArcSDE Java API提供了一個開放的、高層次的編程接口,以處理與分析空間信息。它包含了三個java包:Client包、Geometry包、以及Projection包。
Client包提供了實現ArcSDE服務器相關的功能的類。利用這個包建立的應用程序,能建立一個到ArcSDE實例的連接,查詢一個層,或者與ArcSDE服務器進行通訊。
Geometry包提供了實現OGC(開源GIS)幾何學功能接口的類。
Projection包提供了定義一個坐標系統與在不同坐標系統中轉換的功能的類。
下面的主題對ArcSDE Java API的功能進行了大體的介紹。
設置API
在ArcSDE客戶端安裝的時候安裝了下列文件:
1. jsde90_sdk.jar- 包含了ArcSDE客戶端, 幾何學功能以及SG Java API的類文件。
2. jpe90_sdk.jar – 包含了ArcSDE Projection Engine Java API的類文件。
3. concurrent.jar – 這個文件在使用PeCSTransformationX()時必須要用到, PeCSTransformationX()的功能是轉換坐標系統。
4. sdejavautil.dll (Windows平臺下) - 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中鏈接到,這個文檔可以在ArcSDE客戶端安裝的CD上以及ESRI的技術支持網站中找到。
要建立一個使用ArcSDE java API的應用程序,你必須要在系統中安裝Java 2 Standard Edition SDK,1.4.0版本以上。你還必須在你的CLASSPATH環境變量中加上jsde90_sdk.jar, jpe90_sdk.jar and concurrent.jar的文件路徑。如果你還要使用到com.esri.sde.sdk.client.SeInstance的Start 函數,你還要往你的系統路徑(Windows平臺 system path;所有的Unix平臺system library path)中添加sdejavautil library。
連接到ArcSDE
使用ArcSDE軟件的第一步是建立一個ArcSDE服務器連接。SeConnection類就是用來建立一個連接的。下面是一個建立連接的例子:
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參數是ArcSDE服務器的端口號。例如:5151,而不是esri_sde。
連接與數據庫信息
SeConnection類還提供了取得ArcSDE服務器信息的方法,這些信息包括:服務器的版本以及連接的信息。使用SeConnection類還可以取得存儲在RDBMS上的數據的相關信息。下面的例子展示了如何取得存儲與ArcSDE數據庫內的的圖層列表信息(假設連接已經建立)。
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對象包含了圖層的所有相關信息ArcSDE Java API函數參考中還列出了其他的取得ArcSDE layer的屬性的方法.
Fetching data
數據從一張表或者一個layer中查詢得出。SeQuery對象則是用于準備并執行一個查詢操作,建立并執行一個查詢的步驟如下:
1.建立一個SeSqlConstruct對象,這個對象中有想要查詢的table/layer的名字。你也可以在SeSqlConstruct的構造函數中指定一個where查詢語句。
SeLayer layer = new SeLayer( conn, layerName, spatialColumn );
SeSqlConstruct sqlConstruct = new SeSqlConstruct( layer.getName() );
2.創建一個String數組以存儲要查詢的表的列名。
String[] cols = new String[2];
cols[0] = new String("ColumnOneName");
cols[1] = layer.getSpatialColumn();
3.定義,準備并執行查詢。
// Create a query stream between the client and server
SeQuery query = new SeQuery( conn, cols, sqlConstruct );
query.prepareQuery();
query.execute();
4.取查詢結果的第一行存入SeRow對象中。
SeRow row = query.fetch();
5.取得SeRow的列結構。
// Get the definitions of all the columns retrieved
SeColumnDefinition[] colDefs = SeRow.getColumns();
6.先獲取第一列的數據類型,然后獲取該單元上的數據。
//獲取第一列的數據類型。
int colNum = 0;
int dataType = colDefs[colNum].getType;
//假定數據類型只有String和Shape兩種。
//可以自己添加一些語句以支持ArcSDE列的所有數據類型。
// ( 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);
//調用一個函數以獲取Shape的屬性。
break;
}
7.關閉查詢。
query.close();
注意:為了取出查詢結果所有的行,可以反復的調用query.fetch直至SeRow對象返回為空值為止。
插入數據
可以使用SeInsert類來往一張表或者圖層中插入數據。插入數據的步驟如下:
1. 建立一個String對象,以存儲要添加數據的表的列名。注意數組索引值;這些索引值將在SeRow.set*中使用到。String類型的列的索引值是0,而Shape類型的列的索引值是1.
String[] cols = new String[2];
cols[0] = new String("ColumnOneName");
cols[1] = layer.getSpatialColumn();
2.使用當前的連接句柄Connection conn,創建一個SeInsert對象.這將建立一個從客戶端到服務器的Insert數據流(Stream)。然后根據表或圖層的列名來插入數據,設置SeInsert對象為可寫模式(setWriteMode)。
SeInsert insert = new SeInsert(conn);
insert.intoTable(layer.getName(),cols);
insert.setWriteMode(true);
3.獲取SeInsert對象中將要添加的SeRow對象。然后設置要插入的數據,這一步用到SeRow.set*方法。利用第一步中確定的索引值來作為set*方法中的columnPosition參數。
SeRow row = insert.getRowToSet();
row.setString(0, "Shape Number One");
row.setShape(1,shape);
4.調用SeInsert對象的execute()方法,將前面設置好的SeRow對象插入到圖層中。最后關閉Insert數據流(Stream)結束這次插入的操作。如果不再使用到連接句柄Connection conn,也順便把連接關閉。
insert.execute();
insert.close();
注意:數據只能插入到由用戶創建并維護的列中,如果某個列被注冊為
SE_REGISTRATION_ROW_ID_COLUMN_TYPE_SDE
則這個列的值將有ArcSDE自動生成并插入,另外object id在ArcCatalog建立一張表或者Feature class的時候就生成了,由ArcSDE維護,用戶不能插入,刪除或者修改這一列中的值。