posts - 310, comments - 6939, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          ArcSDE Java API

          Posted on 2009-05-07 11:39 詩特林 閱讀(2148) 評論(0)  編輯  收藏 所屬分類: GIS

          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 SDK1.4.0版本以上。你還必須在你的CLASSPATH環境變量中加上jsde90_sdk.jar, jpe90_sdk.jar and concurrent.jar的文件路徑。如果你還要使用到com.esri.sde.sdk.client.SeInstanceStart 函數,你還要往你的系統路徑(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;

                      //假定數據類型只有StringShape兩種。

                      //可以自己添加一些語句以支持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 idArcCatalog建立一張表或者Feature class的時候就生成了,由ArcSDE維護,用戶不能插入,刪除或者修改這一列中的值。

          主站蜘蛛池模板: 夏河县| 榕江县| 普安县| 张家口市| 海兴县| 四川省| 菏泽市| 广灵县| 贺州市| 景东| 赤峰市| 肥乡县| 四子王旗| 申扎县| 康马县| 江口县| 南岸区| 古丈县| 涟水县| 清水县| 南溪县| 郎溪县| 大庆市| 赫章县| 阿鲁科尔沁旗| 黔西县| 鲁山县| 东乌| 驻马店市| 石河子市| 阳谷县| 米脂县| 忻州市| 集贤县| 广德县| 崇义县| 龙州县| 雷州市| 万州区| 乐安县| 文成县|