arcgis SDE for Java

来源:互联网 发布:投融界源码 编辑:程序博客网 时间:2024/05/16 05:27
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 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维护,用户不能插入,删除或者修改这一列中的值