2010年6月21日星期一

《ArcSDE SDK Java 快速实践》 PDF

http://cid-c71882196b68eee5.office.live.com/self.aspx/%E5%85%AC%E5%BC%80%E5%85%B1%E4%BA%AB%E6%96%87%E6%A1%A3/ArcSDE%20SDK%20Java%20%E5%BF%AB%E9%80%9F%E5%AE%9E%E8%B7%B5.pdf

ArcSDE SDK Java 快速实践 8

I. ArcSDE服务管理 · SeInstance 通过SeInstance对象可以管理和查询ArcSDE的服务实例,比如通过下面的代码可以从实例中获取ArcSDE服务的配置信息: try { SeInstance instance = new SeInstance("localhost", 5151); SeInstanceConfiguration config = instance.getConfiguration(); System.out.println("最大连接数:"+config.getMaxConnections()); } catch (SeException e) { e.printStackTrace(); } 还可以获得实例的运行状态信息: try { SeInstance instance = new SeInstance("localhost", 5151); SeInstanceStatus status = instance.getStatus(); System.out.println("连接数:"+status.getNumConnections

ArcSDE SDK Java 快速实践 6

I. 图层锁 · 图层锁的类型和作用 ArcSDE图层中定义了两种锁,SE_READ_LOCK和SE_WRITE_LOCK。锁影响的范围可以是整个图层或者是图层中的某个范围。 当数据以SE_READ_LOCK的方式锁住以后,这部分数据就被保护起来以防止被更新。其它用户也可以在相同的数据上建立SE_READ_LOCK锁,但是不能再加SE_WRITE_LOCK锁或者更新数据。 当数据以SE_WRITE_LOCK的方式锁住以后,这部分数据不但不能被其它用户更新,而且其它用户也不能再在相同的数据上加任何锁。 由此也可以推出,如果在图层上以SE_READ_LOCK方式锁定的数据互相是可以有重叠的,而以SE_WRITE_LOCK方式锁定的数据是不能相互重叠的。 · 使用锁 以下的代码显示了如何在图层上添加和释放锁: SeConnection conn = getConn(); if (conn != null) { try { SeLayer layer = new SeLayer(conn, "SDE_CITIES", "SHAPE"); layer.lock(SeLayer.SE_READ_L

ArcSDE SDK Java 快速实践 7

I. 版本 · 添加删除版本 通过如下的代码可以基于Default版本创建一个新的子版本: SeConnection conn = getConn(); if (conn != null) { try { SeVersion v_1 = new SeVersion(conn, SeVersion.SE_QUALIFIED_DEFAULT_VERSION_NAME); v_1.setName("v_1"); v_1.create(true, v_1); } catch (SeException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SeException e) { e.printStackTrace(); } } } 至于删除版本就更容易了: SeConnection conn = getConn(); if (conn != null) { try { SeVersion v_1 = new SeVersion(conn, "v_1"); v_1.delete(); } catch (SeE

ArcSDE SDK Java 快速实践 5

I. 数据操作 · 添加 添加数据操作封装在SeInsert类中,如下的代码展示了如何在一个名为“PT”的点图层中添加数据: SeConnection conn = getConn(); if (conn != null) { try { SeInsert insert = new SeInsert(conn); insert.intoTable("PT", new String[] { "SHAPE", "NAME" }); insert.setWriteMode(true);// 开启buffer SeLayer layer = new SeLayer(conn, "PT", "SHAPE"); SeCoordinateReference cr = layer.getCoordRef(); for (int i = 0; i 4"); String[] cols = new String[] { "OBJECTID", "SHAPE","NAME" }; SeQuery query = new SeQuery(conn, cols, sqlC); query.prepareQuer

ArcSDE SDK Java 快速实践 3

I. 表和图层 在ArcSDE中的“表”(Table)指的就是所有的数据库表对象,而“图层”(Layer)指的是在ArcSDE中注册过的空间表。 · SeTable 1. 创建表 通过SeTable的create方法可以创建一个表,一下代码展示了如何创建一个名为“CREATE_TEST”的表: SeConnection conn = getConn(); if(conn !=null){ try { SeTable table = new SeTable(conn, "CREATE_TEST"); SeColumnDefinition[] colDefs = new SeColumnDefinition[2]; colDefs[0] = new SeColumnDefinition("ID", SeColumnDefinition.TYPE_INT32, 10, 0, false); colDefs[1] = new SeColumnDefinition("NAME", SeColumnDefinition.TYPE_STRING, 0, 0, true); table.create(

2010年6月18日星期五

ArcSDE SDK Java 快速实践 2

I. 连接和流 · ArcSDE连接SeConnection 通过ArcSDE SDK可以通过服务连接和直连两种方式进行连接。如果要进行直连可以参考这里: http://edndoc.esri.com/arcsde/9.3/api/japi/japi.htm 不过直连的配置比较复杂,一般尽量通过服务方式连接到ArcSDE服务器,以下的代码可以通过服务连接到ArcSDE,然后返回一个SeConnection对象: private SeConnection conn = null; private static String server = "192.168.200.222"; private static String instance = "5151"; private static String database = ""; private static String username = "sde"; private static String password = "sde"; public SeConnection getConn() { if (conn == null)

ArcSDE SDK Java 快速实践 1

I. 几何对象 ArcSDE SDK中的几何对象定义分布在很多地方,他们各自有不同的用途。其中一部分几何对象类型组织在com.esri.sde.sdk.geom包中、在com.esri.sde.sdk.client包中包含有SeShape和SDEPoint等类型。 com.esri.sde.sdk.geom包中组织的是符合OGC规范的简单对象,它们之间的关系如下图: 图 1 com.esri.sde.sdk.geom包的类关系图 com.esri.sde.sdk.client包中组织的则是ArcSDE客户端中的几何对象。 · SeGeometry 构造SeGeometry对象还需要一个空间参考对象SeCoordRef,比如一个点对象应该用如下的方式构造: SeCoordRef cr = new SeCoordRef(); SePoint pt = new SePoint(cr, 116.39, 39.9); 这里通过X、Y坐标值就可以构造一个点对象,类似的,线对象和面对象则可以通过SePoint点的集合来进行构造: SeCoordRef cr = new SeCoordRef();

2010年6月13日星期日

《ArcSDE vs. Oracle Spatial》 PDF

http://cid-c71882196b68eee5.office.live.com/embedicon.aspx/%e5%85%ac%e5%bc%80%e5%85%b1%e4%ba%ab%e6%96%87%e6%a1%a3/ArcSDE%20vs.%20Oracle%20Spatial.pdf

ArcSDE vs. Oracle Spatial 18

一些补充测试结果: 1. 几何对象的存储空间 为了测试Oracle Spatial和ArcSDE在相对真实的环境中几何对象存储空间的大小,测试分别使用了2个包含约1亿个要素的线数据和面数据进行。其中线数据只包含几何信息,面数据还包含一些属性信息。大部分线数据只包含2个节点,而面数据一般都是几十个节点以上 对这2个数据分别进行了存储空间的比较: 数据 存储类型 空间数据表存储大小(G) 线数据 ST_GEOMETRY 14.72 SDO_ GEOMETRY 16.51 面数据 ST_ GEOMETRY 49.93 SDO_ GEOMETRY 87.87 可见随着几何对象节点数的增加,SDO_Geometry存储耗费的空间要多不少。   · 空间索引的性能 1. 空间索引的用处 对于空间数据库进行空间查询的操作一般都有两个阶段,对于Oracle Spatial而言,一个空间查询分为2个步骤,一个称为主过滤(Primary Filter),另外一个称为次过滤(Secondary Filter)。主过滤通过矩形的MBR相交从海量的数据中首先过滤出可

ArcSDE vs. Oracle Spatial 17

I. 其它 · 还没有涉及的话题 关于Oracle Spatial的GeoRaster支持本文没做研究。另外,Oracle Spatial中现在还支持一些更“GIS”的功能,比如网络、拓扑;还有一些更“Web”的功能,比如Web Service的支持。对这些功能我的兴趣实在不大,由于精力有限暂时也就不再研究了。事实上从第III章开始,后面的比较都有些“多余”,因为在实际应用中,如果采用ArcSDE和ArcGIS的产品,很少会直接在数据库服务器上执行这些空间关系运算、几何处理等操作,取而代之的是在客户端的ArcGIS Engine或者应用服务器的ArcGIS Server等环境中进行的。而与此相对的是,如果仅采用Oracle Spatial,必然将基本的空间数据存取和其它高级GIS业务的压力(通常是高CPU资源消耗)都放到数据库服务器,这样的系统设计我觉得也并不太可取。 而且,ArcSDE和Oracle Spatial也并不冲突,ArcSDE支持ST_Geometry类型的存储,同样也支持SDO_Geometry类型的存储,使用ArcSDE也并不意味着就摒弃了Oracle Spatial

切图地图服务使用Flex API编辑和更新切图

ArcGIS Flex API 2.0开始支持访问ArcGIS Server 10 的Feature Service进行编辑。 Flex:                                                                                       更新数据完成后,再通过基于ArcObjects开发的Web服务更新切图 Java:     private String result(String objectids) {        String result = "false";         IServerContext serverContext = null;        try {            ResourceBundle rb = ResourceBundle.getBundle("wuyf.Config");             String host = rb.getString("HOST");            String username = rb.getStr

2010年6月12日星期六

ArcSDE vs. Oracle Spatial 16

I. 线性参考 · Oracle Spatial 1. 创建线性参考的空间对象 图 15 一个线性参考空间对象的例子 对于如图 15的例子,Oracle Spatial中需要通过如下的SQL语句进行创建: SQL> select SDO_GEOMETRY(3302, NULL, NULL,SDO_ELEM_INFO_ARRAY(1,2,1),SDO_ORDINATE_ARRAY(5,10,0, 20,5,NULL, 35,10,NULL, 55,10,100)) shape from dual; SHAPE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES) ------------------------------------------------------------------------------------------------------------------------ SDO_GEOMETRY(3302, NULL, NULL, SDO_ELEM_INFO_ARRA

2010年6月10日星期四

ArcSDE vs. Oracle Spatial 15

I. 几何处理 · 缓冲分析 Oracle Spatial中缓冲分析使用SDO_GEOM.SDO_BUFFER函数实现,下面是SDO_GEOM包中SDO_BUFFER函数的原型: function sdo_buffer(geom IN MDSYS.SDO_GEOMETRY, dist IN NUMBER, tol IN NUMBER, params IN VARCHAR2) return MDSYS.SDO_GEOMETRY DETERMINISTIC; 这里的dist为缓冲距离;tol为容差值;params代表2个可选参数,分别为unit=和arc_ tolerance=,这些可选参数可以帮助用户在地理坐标系的数据上直接进行投影距离的缓冲。 下面的操作是对一个经纬度点数据进行一个1000千米的缓冲后,再输出经纬度几何对象: SQL> select sdo_geom.sdo_buffer(SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(0,0, NULL),NULL,NULL),1000,1,'arc_tolerance=0.1 unit=km') from

2010年6月8日星期二

ArcSDE vs. Oracle Spatial 13

I. 空间关系运算 以上两个章节是必不可少的基础,涉及到空间数据在数据库中的存储和通过索引加速空间数据的获取。从这句话也可以看出,后续的章节并不是必须的,也就是说某些基于空间数据的应用可能并不需要诸如空间关系判断、几何对象处理等功能。这并不是说这些功能就用不着了,而是这些功能并不一定需要在数据库端执行。比如基于ArcSDE,这些空间算法和功能在ArcGIS的产品线中无处不在,很多时候都不会把这些功能放到数据库上去。 · Oracle Spatial 在Oracle Spatial中,主要的空间关系操作在下表中列出: 空间操作 描述 SDO_FILTER 主过滤,判断哪些几何对象可能和给定的几何对象相交 SDO_JOIN 基于一定空间关系的表连接 SDO_NN 查询离某个几何对象最近的几何对象 SDO_NN_DISTANCE 查询离某个几何对象最近的几何对象与当前对象的距离 SDO_RELATE 判断两个几何对象是否满足某种空间关系 SDO_WITHIN_DISTANCE 判断两个几何对象间距离是否小于某给定值 其中SDO_RELATE操作比

ArcSDE vs. Oracle Spatial 12

· 空间索引的性能 1. 空间索引的用处 对于空间数据库进行空间查询的操作一般都有两个阶段,对于Oracle Spatial而言,一个空间查询分为2个步骤,一个称为主过滤(Primary Filter),另外一个称为次过滤(Secondary Filter)。主过滤通过矩形的MBR相交从海量的数据中首先过滤出可能符合空间查询的一小部分数据,然后再用次过滤中具体的空间关系算法来判断这个小的结果集中到底哪些是满足空间关系的。如图 12,在主过滤的过程中,空间索引会被使用到。 图 12 Oracle Spatial中空间查询的处理流程 对于ArcSDE来说,原理上也是类似,ArcSDE中有一个函数叫ST_ENVINTERSECTS,这就是通过四角坐标来从海量数据中过滤一个矩形范围内的一小部分数据。对于其它一般的空间操作,比如ST_WITHIN等,只要你的数据建立了空间索引,这个操作也会先通过空间索引找到一个小数据集(相当于ST_ENVINTERSECTS操作,或者说Oracle Spatial中的主过滤),然后再通过具体的“Within”的空间关系算法再查得准确的结果(相当于Oracle

2010年6月7日星期一

ArcSDE vs. Oracle Spatial 11

1. 格网索引的创建和调整 ArcSDE提供了最多3级的空间索引,如何选择空间索引的层级、格网的网格大小设置多少合适等都关系到空间数据的性能。这里我们通过一个简单的Polygon图层入手,探讨一些格网空间索引的性能影响因素。 首先我们在ArcSDE中准备一个WGS84的面层,名为“TESTGRID”。在这个面层上我们添加2个要素,一个较小,一个较大,如图 10所示。为了提供一些参考信息,图中还将WGS84坐标范围按照30度的尺寸进行了分割,显示在这2个要素之下。 图 10 ArcSDE中有2个要素的面层 上述的数据如果我们创建3级索引,为了直观起见,我们可以把最小的网格尺寸定位30,也就是图 10中方格的大小。因此网格最大的第3级可以选择尺寸为270×270,那么第2级可以设置为90×90,第1级设置为30×30。我们如下创建空间索引: SQL> CREATE INDEX A141_IX1 on TESTGRID(shape) INDEXTYPE is ST_SPATIAL_INDEX PARAMETERS ('ST_GRIDS=30,90,270 ST_SRID=2'); odc