天天看點

ArcSDE Java API 翻譯

ArcSDE Java API

介紹

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維護,使用者不能插入,删除或者修改這一列中的值。

下一篇: ArcSDE