图
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_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(5, 10, 0, 20, 5, NULL, 35, 10, NULL, 55, 10, 100))
同时,如果要在Oracle Spatial中可以使用这个空间数据,除了在相应的空间表中插入这些记录之外,还需要在元数据表中插入相关记录,插入元数据信息示例如下:
INSERT INTO user_sdo_geom_metadata(TABLE_NAME,COLUMN_NAME,DIMINFO,SRID)
VALUES('SDO_TEST,'SHAPE',
SDO_DIM_ARRAY (
SDO_DIM_ELEMENT('X', 0, 20, 0.005),
SDO_DIM_ELEMENT('Y', 0, 20, 0.005),
SDO_DIM_ELEMENT('M', 0, 100, 0.005)),
NULL);
正常情况下,在USER_SDO_GEOM_METADATA表中可以查到相关的信息(关于USER_SDO_GEOM_METADATA表的作用及定义可以回顾《II.1索引类型SPATIAL_INDEX》):
SQL> select * from user_sdo_geom_metadata where table_name='SDO_ROUTES';
TABLE_NAME COLUMN_NAME
-------------------------------------
DIMINFO(SDO_DIMNAME, SDO_LB, SDO_UB, SDO_TOLERANCE) SRID
------------------------------------------------------------------------------------------------------------------------
SDO_ROUTES SHAPE
SDO_DIM_ARRAY(SDO_DIM_ELEMENT(NULL, 2389694, 2569011.02, .0000005), SDO_DIM_ELEMENT(NULL, 581586.917, 760268.123, .0000005), SDO_DIM_ELEMENT('M', -1000, 267435.456, .0000005))
对于线性参考的空间对象,就可以根据线性参考来定位对象上的点,比如上述例子中图 15的对象,如果我们要获得在线方向上位于中点的点坐标,我们可以这样做:
SQL> select SDO_LRS.LOCATE_PT(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)), 50) from dual;
SDO_LRS.LOCATE_PT(SDO_GEOMETRY(3302,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,2,1),SDO_ORDINATE_ARRAY(5,10,0,20,5,NULL,35,10,NULL,
------------------------------------------------------------------------------------------------------------------------
SDO_GEOMETRY(3301, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1, 1), SDO_ORDINATE_ARRAY(29.486833, 8.16227766, 50))
图 16 线性参考的线中点
其中SDO_LRS包的LOCATE_PT函数原型如下:
SDO_LRS.LOCATE_PT(
geom_segment IN SDO_GEOMETRY,
measure IN NUMBER
[, offset IN NUMBER
) RETURN SDO_GEOMETRY;
注意到这里还可以指定一个offset值,这个值代表查找的定位点可以和线性参考的几何对象有一定的偏移。比如,如果上面的例子中这条线代表一条公路,现在我们想找到离公路中点一边(沿线的右手边)距离为5的某个点,那就可以使用这个offset值,注意,沿线左侧为正、右侧为负:
SQL> select SDO_LRS.LOCATE_PT(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)), 50, -5) from dual;
SDO_LRS.LOCATE_PT(SDO_GEOMETRY(3302,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,2,1),SDO_ORDINATE_ARRAY(5,10,0,20,5,NULL,35,10,NULL,
------------------------------------------------------------------------------------------------------------------------
SDO_GEOMETRY(3301, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1, 1), SDO_ORDINATE_ARRAY(31.0679718, 3.41886117, 50))
图 17 线性参考的线中点右侧距离5的点
对于如图 15的例子,ArcSDE中如果需要通过SQL语句进行创建可以采用以下的方式:
SQL> select sde.st_astext(sde.st_geometry ('linestring m(5 10 0, 20 5 16.67, 35 10 33.33, 55 10 53.33)', 0)) from dual;
SDE.ST_ASTEXT(SDE.ST_GEOMETRY('LINESTRINGM(5100,20516.67,351033.33,551053.33)',0
--------------------------------------------------------------------------------
LINESTRING M ( 5.00000000 10.00000000 0.00000000, 20.00000000 5.00000000 16.67000000, 35.00000000 10.00000000 33.33000000, 55.00000000 10.00000000 53.33000000)
ArcSDE对线性参考几何对象的操作并不在数据库层面实现,而是在各种ArcGIS的产品中的ArcObjects进行操作,下面演示了采用ArcGIS Server的ArcObjects进行同上定位的操作:
ServerConnection conn = new
ServerConnection();
conn.connect("localhost", "*", "arcgismanager", "passwd");
IServerObjectManager som = conn.getServerObjectManager();
IServerContext serverContext = som.createServerContext(null
, null
);
try
{
Polyline pl = (Polyline)serverContext.createObject(Polyline.getClsid
());
Point pt = null
;
pt = (Point) serverContext.createObject(Point.getClsid
());
pt.setX(5); pt.setY(10); pt.setM(0);
pl.addPoint(pt, null
, null
);
pt = (Point) serverContext.createObject(Point.getClsid
());
pt.setX(20); pt.setY(5); pt.setM(16.67);
pl.addPoint(pt, null
, null
);
pt = (Point) serverContext.createObject(Point.getClsid
());
pt.setX(35); pt.setY(10); pt.setM(33.33);
pl.addPoint(pt, null
, null
);
pt = (Point) serverContext.createObject(Point.getClsid
());
pt.setX(55); pt.setY(10); pt.setM(53.33);
pl.addPoint(pt, null
, null
);
pl.setMAware(true
);
Multipoint mp = (Multipoint)pl.getPointsAtM(26.67, 0);
IPoint ptM = mp.getPoint(0);
System.out
.println(ptM.getX() + "," + ptM.getY());
} catch
(Exception ex) {
ex.printStackTrace();
} finally
{
serverContext.releaseContext();
}
这样的代码可以得到中点的坐标(29.0036,8.0012),这个结果和Oracle Spatial中基本相符(这里为了简便采用了0-16.67-33.33-53.33这样不同的分段)。下面通过修改getPointsAtM()方法的参数查找线中点一边距离为5的点,btw,这里的offset参数的正负规则和Oracle Spatial中是恰恰相反的:
Multipoint mp = (Multipoint)pl.getPointsAtM(26.67, 5);
这样可以得到结果坐标为(30.5847,3.2578)。
分享到:
相关推荐
### ArcSDE 与 Oracle Spatial 的空间数据存储比较与分析 #### 一、几何对象 ##### Oracle Spatial **1. SDO_GEOMETRY** Oracle Spatial 在 MDSYS 模式下定义了一系列几何类型和函数来支持空间数据的存储与使用...
ArcSDE和Oracle Spatial的定位不同
"使用Oracle Spatial对ArcSDE中的SDO_GEOMETRY类型数据进行空间操作" Oracle Spatial 是 Oracle 数据库中的一个空间数据处理组件,用于存储、管理和操作空间数据。ArcSDE 是一个空间数据引擎,用于存储和管理大规模...
直接连接(Direct Connect)是指ArcGIS直接访问Oracle Spatial数据库的一种方式,无需通过中间层如ArcSDE等工具进行数据传输。这种方式可以提高查询效率,简化系统架构,并减少维护成本。 **2.2 主要优点** - **...
【ArcSDE与Oracle9i Spatial简介】 ArcSDE是一种用于访问和管理存储在关系数据库管理系统(RDBMS)中的大型多用户地理数据库的服务器软件。它是Esri的ArcGIS平台的一部分,也是企业级解决方案的核心组件。ArcSDE的...
### Oracle Spatial与ArcSDE空间数据上载及应用比较 #### 引言 在地理信息系统(GIS)领域,Oracle Spatial与ArcSDE是目前较为流行的两种利用关系型数据库存储和管理空间数据的商用软件。随着GIS技术的发展,空间...
"Oracle Spatial和ArcSDE的应用比较研究" Oracle Spatial和ArcSDE是当前较为流行的利用关系型数据库存储和管理空间数据的商用软件。本文首先分析Oracle Spatial和ArcSDE的存储机制,然后对二者进行比较研究,最后...
ArcSDE(Arc Spatial Data Engine)是Esri公司开发的一款强大的地理空间数据管理软件,它为Oracle 10g这样的大型数据库系统提供了全面的地理空间数据支持。在本篇中,我们将深入探讨ArcSDE 9.2 for Oracle 10g的授权...
【Oracle Spatial与ArcSDE简介】 Oracle Spatial是Oracle数据库的一个扩展模块,专门用于处理和管理地理空间数据。它提供了一套全面的空间数据管理和分析功能,包括几何对象的存储、空间索引、空间查询以及复杂的...
总的来说,Oracle Spatial与ArcSDE的结合使用,为管理和操作空间数据提供了一种强大而灵活的解决方案。无论是通过Query Layer还是ArcSDE注册图层,都能够帮助用户在ArcGIS环境中有效地利用和分析Oracle Spatial数据...
【ArcSDE与Oracle10i Spatial数据转换】 在地理信息系统(GIS)的应用中,空间数据的管理和转换是至关重要的。ArcSDE是由Esri公司开发的一种空间数据库引擎,它允许用户将空间数据集成到关系数据库管理系统(RDBMS)中...
### Oracle Spatial 与 ArcSDE 的对比分析 #### 一、引言 随着地理信息系统(GIS)技术的发展,对空间数据存储与管理的需求日益增长。Oracle Spatial 与 ArcSDE 成为当前主流的空间数据存储解决方案之一。本研究...
《ArcSDE与Oracle Spatial:空间数据库的深度解析》 ArcSDE和Oracle Spatial,两者都是业界领先的空间数据管理解决方案,但它们各自有着独特的特性和优势。本文将深入探讨这两个系统在存储空间数据、建立空间索引、...
7. **集成ArcSDE**:ArcSDE是Esri公司的产品,用于将GIS数据与关系数据库管理系统(RDBMS)集成,Oracle Spatial与ArcSDE的结合提供了更全面的GIS解决方案。 8. **查询优化**:Oracle Spatial提供了高级的空间查询...
- 在Oracle数据库中,不同的表空间可以被分配给特定类型的数据,例如FEATURE、ATTRIBUTE、SPATIAL_INDEX、ORACLE_INDEX等。 - 每个表空间都有其独特的用途,例如,FEATURE表空间用于存储特征数据;ATTRIBUTE表空间...
《实现ArcSDE向Oracle9i Spatial空间数据的转换》 空间数据是地理信息系统(GIS)的核心组成部分,而ArcSDE和Oracle Spatial是两种广泛使用的空间数据库引擎。这两种引擎分别由ESRI公司和Oracle公司开发,它们各自...
ArcSDE,全称为Arc Spatial Data Engine,是ESRI(Environmental Systems Research Institute)公司开发的一款用于管理和分发地理空间数据的软件产品。它提供了一种高效、可靠的解决方案,使用户能够在关系数据库...
本文研究了基于Oracle Spatial组件实现多源异构空间数据一体化存储及管理的方法。Oracle Spatial是甲骨文公司提供的用于GIS数据存储的空间数据处理系统,它通过扩展的SDO_GEOMETRY和SDO_GEORASTER数据类型实现了矢量...
【对比其他产品】虽然有多个GIS和数据库厂商提供类似解决方案,如ESRI的ArcSDE和Informix的Spatial Data Blade,但Oracle Spatial凭借其先进的技术和高性能,在市场上占据主导地位,尤其适用于大型GIS系统和工程CAD...
ArcSDE(Spatial Database Engine)是Esri公司开发的空间数据库引擎,它为ArcGIS(一款流行的地理信息系统软件)与Oracle数据库之间提供了桥梁,使得用户可以在Oracle数据库中存储、管理和操作空间数据。 【ArcSDE...