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
上以及
中找到。
要建立一个使用
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
维护,用户不能插入,删除或者修改这一列中的值。