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

2010年5月28日星期五

ArcSDE vs. Oracle Spatial 8

I. 空间索引 对于空间数据中几何对象的索引显然不能套用数据库现有的索引类型,其不确定的数据结构和数据操作方法使现有的索引并不能适用,因此无论是Oracle Spatial还是ArcSDE都是采用域索引(Domain Index[1])来实现,简单地说就是创建一个数据库中原来没有的新的索引类型。 · Oracle Spatial 1. 索引类型SPATIAL_INDEX Oracle Spatial中的空间索引极其重要,没建空间索引的空间表就像断了腿的兔子,不但跑不起来,甚至可能比乌龟还慢。 让我们从索引的创建入手来看一下Oracle Spatial的空间索引机制: SQL> create index idx_test_index_geom on spatial.test_index(geom) indextype is mdsys.spatial_index; 索引已创建。 如果你的数据是用shp2sdo等工具导入的,那么直接就可以创建索引;如果是自己创建的空间表,那么必然会遇到ORA-13203错误,因为Oracle Spatial在创建空间索引时会读取USER_SDO_GEOM_

2010年5月14日星期五

ArcSDE vs. Oracle Spatial 7

常见几何对象的构造 介绍ESRI的ST_GEOMETRY的几何对象构造方法比Oracle Spatial就轻松多了,我们已经知道ST_GEOMETRY的各个子类型中的构造函数构造几何对象时都会首根据参数拼装成WKT格式的字符串,然后调用ST_SHAPELIB链接库转化到二进制的几何对象返回,那相对更通用的方法就是直接使用ST_GEOMETRY的构造函数,给一个WKT格式的字符串作为初始化参数就可以了: SQL> select sde.st_geometry('POINT(1 1)',0) from dual; SDE.ST_GEOMETRY('POINT(11)',0)(ENTITY, NUMPTS, MINX, MINY, MAXX, MAXY, MINZ, MAXZ, MINM, MAXM, AREA, LEN, SRID, POINTS) ------------------------------------------------------------------------------------------------------------------------ S

2010年4月26日星期一

ArcSDE vs. Oracle Spatial 5

基于SDO_GEOMETRY的ST_GEOMETRY Oracle Spatial虽然使用了SDO_GEOMETRY类型作为几何对象的存储,不过它也提供了另外的一种类型ST_GEOMETRY,同时在此基础上还提供了一些符合OGC Simple Features Access规范的操作。 首先让我们来看一下这个ST_GEOMETRY的定义: CREATE OR REPLACE TYPE ST_GEOMETRY AS OBJECT ( GEOM SDO_GEOMETRY, MEMBER FUNCTION GET_SDO_GEOM RETURN SDO_GEOMETRY DETERMINISTIC, … ) 可见,Oracle Spatial的ST_GEOMETRY事实上还是通过对SDO_GEOMETRY的包装实现的。因此,我们可以通过最简单的构造函数来构造一个ST_GEOMETRY对象: ST_GEOMETRY(geom SDO_GEOMETRY); 或者,也可以使用具体的ST_GEOMETRY类型来构造,比如用ST_POINT来构造一个点,你会发现内部Oracle Spatial还是根

2010年4月20日星期二

ArcSDE vs. oracle Spatial 4

导入数据到Oracle Spatial Oracle Spatial并没有像ArcGIS那样有一套从桌面到数据库到服务器到开发包的全方位GIS产品体系,因此向Oracle中加载数据相比用ArcGIS要麻烦得多,同时也没有那么多的数据源格式的支持。Oracle本身则提供了一个工具shp2sdo[1],可以帮助你导入Shapefile到Oracle Spatial中,这个工具的使用分三个步骤: 第一步,使用shp2sde工具生成脚本和数据: [oracle@test2 shp2sdo_linux]$ ./shp2sdo.exe shp2sdo - Shapefile(r) To Oracle Spatial Converter Version 2.15 21-May-2004 Copyright 1997,2004 Oracle Corporation For use with Oracle Spatial. Input shapefile (no extension): /home/wuyf/world/cities Shape file /home/wuyf/world/cities.

2010年4月19日星期一

ArcSDE vs. Oracle Spatial 3

1. 常见几何对象的构造 对于SDO_GEOMETRY这种定义晦涩的类型,最好是搞几个例子来对照一下,好在《Oracle Spatial Developer’s Guide》里提供了几个简单的Example,还配上了很好看的插图,在这里一并引用一下: 矩形 SDO_GEOMETRY( 2003,-- 面,表 1 4326, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),-- 矩形,表 2 SDO_ORDINATE_ARRAY(1,1, 5,7) -- 左下角和右上角 ) 有洞的多边形 SDO_GEOMETRY( 2003,-- 面,表 1 4326, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- 从1开始多边形,从19开始多边形,表 2 SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,--外多边形,逆时针 7,5, 7,10, 10,10, 10,5, 7,5)-- 内多边形,顺时针 )

2010年4月16日星期五

ArcSDE vs. Oracle Spatial 2

I. 几何对象 · Oracle Spatial 1. SDO_GEOMETRY Oracle Spatial在MDSYS模式下定义了一系列几何类型、函数来支持空间数据的存储和使用,最为人耳熟能详的就是SDO_GEOMETRY这种类型——当然,ArcSDE也可以使用这种类型进行存储。让我们首先来看一下SDO_GEOMETRY的定义: CREATE OR REPLACE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, SDO_ORDINATES SDO_ORDINATE_ARRAY, MEMBER FUNCTION GET_GTYPE RETURN NUMBER DETERMINISTIC, MEMBER FUNCTION GET_DIMS RETURN NUMBER DETERMINISTIC, MEMBER FUNCTION GET_LRS_DIM RETURN NUMBER DE

2010年4月15日星期四

ArcSDE vs. Oracle Spatial 1

Oracle Spatial的出现让很多人产生这样一个想法:“Oracle对自己的数据库产品肯定是最熟悉的,Oracle Spatial的性能也肯定是最好的,相比之下ArcSDE for Oracle这个后娘养的哪天还是踹掉算了”。这话听起来有一点糙,不过好像也挺在理。就在此摇摆不定之际,一旁的微软泪流满面:“作为对Windows最熟悉的厂商我要说一句,为什么还有人用Windows竟然都不选择SQL Server而非要用天杀的Oracle!” ——打住,以上情节纯属虚构,如有雷同,纯属巧合。 书归正传,自打Oracle Spatial的出现,从开始的点线面的简单支持到栅格(Raster)、拓扑(Topology)、网络(Network)的支持;从纯粹数据库的功能到OGC Web服务的支持都能看出Oracle对Spatial模块的进取心。然而,SDO_GEOMETRY这种有点晦涩的存储方式及其空间操作方法的风格也可以看出Oracle——或许也就是它的CEO埃里森的一贯作风——强势、特立独行。 当然,不管是Oracle亲生的还是ESRI后娘养的,名分都是浮云,能更好地支持我们的GIS应用才