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 维护,用户不能插入,删除或者修改这一列中的值。