ArcSDE Java API

http://edndoc.esri.com/arcsde/9.3/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 维护,用户不能插入,删除或者修改这一列中的值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值