oracle的空间数据库:
2007-12-21 16:31:12
1. 什么是oracle的空间数据库:
oracle的空间数据库提供了一组关于如何存储,得到,修改和查询空间数据集的sql schema与函数.
空间数据由以下几个方面组成:
1.MDSYS schema: 规定了所支持的地理数据类型的存储,语法和语义
2.空间数据索引机制
3.提供了关于空间相交查询,空间联合查询和其它空间分析操作的操作符,函数和过程
4.提供函数和过程用于一般的工具性操作与性能操作
5.用于处理点,边和面的拓扑数据模型
6.用于表现 网络的点线的 网络数据模型
7.地理光栅: 一套机制可以让用户存储,索引,查询,分析和发布地图光栅数据,包换光栅图,栅格数据和它们的元数据
1.2 对象关系模型
Spatial支持对象关系模型来表现地理数据.这个模型用Oracle原生空间数据类型SDO_GEOMETRY来对应一个地理数据对象.一个Oracle表可以有一个或多个SDO_GEOMETRY字段.对象关系模型用"sql with Geometry Tpes"来实现the Open GIS ODBC/sql规范所定义的地理空间数据方面的功能.
对象关系模型所能提供的好处在于:
1. 支持很多地理类型,比如: 弧,圆,组合多边型,组合线段和优化矩形(这个偶现在还不知道是什么意思)
2. 更容易的建立和维护索引,以及更容易优化空间查询的性能
3. 索引由Oracle数据库维护
4. 地理信息可以放在一个字段内
5. 专门优化过的性能
1.3 Spatial数据介绍
Oracle Spatial被 设计用于让空间数据的管理更加容易,and more natural to users of location-enabled applications and geographic information system(GIS) applications(这段实在不知道要如何翻译). 一旦空间数据被存储在Oracle数据库中,它能很容易的被维护,取得并建立与存储在数据库中的其它的数据建立关联.
一个典型的空间数据的例子就是道路地图. 一个道路地图是一个二维的对象,它包括了点,线和多边形用以
表现城镇,道路,公共边界(比如国家或省市). 一个道路地图是一种可视化的方法表现的地理信息,城镇,道路和公共边
界这些存在 地球表面的对象都被映射到一个二维的显示器或纸上,保存下它们的相对位置与相对距离.
这些对象在地球的位置数据(比如说经纬度)就是空间数据. 当地图呈现时,这些空间数据被用于在二维的纸
上定位出对象的位置. GIS常常就是用于保存,取回和呈现这些于地理相关(汗,这个....)的空间数据.
另一种可以被存储在Spatial中的空间数据(相对于GISR的空间数据而言)是CAD与CAM的空间数据。它们工作在相对较小的数据范围内,经常用于汽车设计或电路板的设计中。
这两个 系统的不同之处在于数据大小与数据的精度,而不是数据的复杂性。 系统可以有相同数量的数据点。在一个地理维度上,本地的一个桥梁可能只有十几个英寸而不会对道路 建筑的表示造成任何可见的问题,但对于一个引擎活塞的直径来说,十几个英寸的误差就会造成引擎不能工作。
另一方面来说,数据的复杂度是与表现它的区域的大小无关的。例如,一个印刷电路板,它上面可能有上千个蚀刻对象,包容在这个面积上的信息的复杂度可能要比一个道路蓝图还要高。
(一段废话,不翻译了,下面同)
1.4 几何类型
一个几何类型是由一个有顺序的通过直线或曲线相连的向量序列组成。它的语义是通过它的类型来定义的。Spatial支持几种原生的类型,几何类型可以通过这些原生类型的组合而成。 原生类型包括:
二维类型:
1.点与点的集合
2.线段
3.N点组合的多边型
4.曲线段(所有的曲线都是由圆弧组成)
5.弧型多边型
6.组合多边形
7.组合线段
8.圆
9.优化的矩形
二维点是由两个坐标来表示的(X,Y),经常是表示经纬度。线段是一个或多个点对定义的片段的组合。组合多边形是由多个相连的线段形成的闭合环所区域。例如,一个点可以表示一个建筑的地点,一个线段可以表示一条道路或飞行跑道,一个多边形可以表示一个国家,城市,禁区或街区。
自交多边形现在不支持,但自交的线段是支持的。如果一个线段自交,那它不能形成多边形。一个自交的线段不包含任何区域。
Spatial也支持保存和索引三维和四维地理类型,在这方面,三个或四个坐标定义了一个向量。然而,空间函数(除了LRS函数和MBR相关函数)只在工作在二维空间中,并且所有的空间操作符(除了SDO_FILTER)也是不能在超过二维的空间索引上工作的。
1.5数据模型
Spatial数据模型是一个由元素,地理对象和层组合而成的层次结构。层由多个地理对象组成,而地理对象由多个元素组成。
1.5.1元素
一个元素是组成地理对象的基本模块。现在支持的空间元素类型是点,线段与多边形。例如,元素可以模拟星座(点的集合),道路(线段集合)和国家边界(多边形集合)。每一个元素的坐标被以X,Y对来保存。一个多边形的外部圆和内部圆被认为是两个独立的元素,但组合成一个复杂多边形。
点数据由一个坐标形成,线数据由两个坐标表示线段,多边形坐标是由一组有顺序的的坐标组成。
1.5.2 地理对象
一个地理对象是一个空间对象的描述,由多个有顺序的元素组合而成。地理对象可以是单个元素,也可以是多个同构和异构元素组合而成。在一个组合多边形中,例如小岛的集合,是同构集合。一个异构集合是由不同类型的元素组合的,比如点与多边形。
例如一个代表可建筑用地的地理对象,它就可能表现为一个多边形,中间有一个洞,代表水面或建筑分区。
1.5.3 层
层是一个由相同属性的地理对象的集合。例如一个GIS层可以包括地形数据,人口密度,道路与桥梁网络。对于单独一个层来说,它所包括的地理对象和对应的空间索引在数据库中表现为一个单独的表。
1.5.4 坐标系统
坐标系统(也叫空间参考系统)定义为代表位置的坐标和确立两个坐标集合之间的关系。它可以被解释为一个坐标的集合来表示现实空间的位置集合。
任何空间数据都与坐标系统有关。一个坐标系统可以是地理相关的(与地球上的坐标系统相关)或非地理相关(比如笛卡尔坐标系统,与地球上实际的坐标无关)。如果一个坐标系统是地理相关的,它会有一个缺省的测量单位(比如米),但你能用Spatial自动进行与其它测量单位之的换算(比如公里)。
在Oracle Spatial release 8.1.6之前,地理对象(SDO_GEOMETRY)被保存为一个坐标的字符串,而没有与任何特定的坐标系统相关。Spatial函数与操作子总是假定坐标系统是来自于笛卡尔正交坐标系,于是常常不能提供正确的以地球为基础的经纬度坐标。随着8.1.6的发布,Spatial提供了很多坐标系统的支持,方便了在各个坐标系统间自由的转换。
Spatial数据支持的坐标系统包括:
笛卡尔坐标系: 如果地理对象没的指定坐标系统,缺省的为笛卡尔坐标系。
测地学坐标系:也叫地理坐标系,是一个角度坐标系统,与球形极点坐标紧密相关。
项目坐标系:是一个平面笛卡尔坐标系统,用于通过数学映射把地球表面的点对应到一个平面上。有各种数学映射方法,每种都有自己的目的。
本地坐标系:是一个笛卡尔坐标系,对应与非地理相关的坐标系统,比如CAD制图。
当对地理对象进行操作时,Spatial要么使用笛卡尔要么使用曲线计算模型(比如全程的空间坐标系统)。
1.5.5 公差
公差是与空间数据的精度相关的。公差反映了可以表示同一对象的两个测量点之间的距离。公差值是一个大于零的正值。这个值的单位与否决定于它是否与一个地理坐标系统相关。
对一个地理数据而言,公差值为一个以米为单位的值。公差值不可能小于0.05(五毫米),当然在大多数场合它都大于这个值。如果你指定了小于这个的值,Spatial使用0.05作为实际的值保存。
对一个非地理数据而言,公差值一个单位的数值而与实际的坐标相关。例如,如果测量单位是公里,一个0.005的公差就表示0.005公里,2的公差就表示2公里。
在所有的实际用例中,更小的公差值代表了更精确的数据。
公差特别用在两个方面:
1.定义层的地理元数据
2.作为一个函数的输入参数。
1.5.5.1 公差在层的地理元数据中的使用
层的维度信息中包含了公差信息。xx_SDO_GEOM_MetaDATA视图的DIMINFO字段的每个维度中都包含一个SDO_TOLERANCE值,而且这个值在同一图层中是一样的。
如果一个函数接受一个可选的tolerance参数,并且这个参数为null或没有指定,那么图层对象的SDO_TOLERANCE就会被使用。实际使用的例子如:cola_b与cola_d之间的距离为0.846049894。如果一个SDO_GEOM.SDO_DISTANCE函数在计算这两个点之间的距离时,没有指定公差的话,那么它就依赖于点所在的层的SDO_TOLERANCE这个值了。例如
1.如果SDO_TOLERANCE值为0.005,那么这个函数返回0.846049894.
2.如果SDO_TOLERANCE值为0.5,那么这个函数返回0。返回0是因为函数会先在cola_b与cola_d这个两个点的周围各自建立一个0.5的圆,因为这两个圆相交,所以这两个点为0。
你有两种方法为一个层选择一个SDO_TOLERANCE:
1.在查询两个对象的距离时,合适的反映距离的精度的值。比如,两个非地理对象在距离为0.8个单位时应当被认为两个对象的话,那么SDO_TOLERANCE应当小于0.05。
2.值应当能反映图层中地理对象的测量精度。比如如果一个图层中所有的地理对象都用整数作为单位并且0.8个单位距离的两个地理对象视为同一个对象的话,那么SDO_TOLERANCE为0.5是合适的。
对于非地理数据来说,一般使用第二个方法,使用最高精度的SDO_TOLERANCE。例如,如果一个地理对象使用整数单位,那么合适的值应当0.5;因而,如果地理对象定义为使用4位小数(比如31.2587),那么合适值为0.00005。
1.5.5.2 作为输入参数
在很多Spatial函数都接受公差参数,以替代缺省的图层公差值。
1.6 查询模型
Spatial使用两层查询模型来解决查询与空间过滤的问题。模型使用两个不同目的的操作来加快查询过程。而输出的结果是这两个操作组合结果。
这两个操作为primary与secondary操作
1.primary过滤操作:使用地理上近似的查询操作来减小计算的复杂度。因为这个查询是近似,所以它产生一个比较大的结果集,这个结果集是给secondary过滤操作使用 。
2.secondary过滤操作:在primary过滤出来的结果集上使用精确的计算来得到最后精度的空间过滤结果集。因为这个计算过程是很昂贵的,所以它只在primary过滤出来的结果集上计算。
Spatial使用空间索引来实现primary过滤。Spatial并不强求使用一定要使用primary与secondary过滤组合。在很多情况下,光一个primary过滤就足够了。例如一个放大操作中, 应用程序只要得到与一个矩形框相交的地理区域中的内容。这时,primary过滤就可以非常快的返回一个大集合,而 应用程序可以使用减切路径来只显示出目标区域来。
1.7 Spatial数据索引
Spatial索引主要提供两个功能:
1.找到在一个区域中的空间对象。
2.找到两个空间对象的交集。
Oracle Spatial使用R-tree索引(对于Quadtree因为已经不鼓励使用,所以对于它的部分也就不翻了)。
1.7.1 R-tree索引
空间R-tree索引最高能定位四维空间。一个R-tree索引近似的使用单个MBR来代表一个地理对象。它存储在空间索引表(USER_SDO_INDEX_MetaDATA视图中的SDO_INDEX_TABLE字段所指的空间索引表,如果你去查找那个字段内容,只会看到一堆二进制)。同时R-tree索引还维护一个sequence对象(USER_SDO_INDEX_MetaDATA表中的SDO_RTREE_SEQ_NAME字段)。
1.7.2 R-tree的品质
实际上对R-tree索引的插入与删除操作会影响R-tree的质量,从而影响查询的性能。
R-tree是层次树结构,在不同的分枝有不同的高度。它的性能大体依赖于查询面积的分布与树结点的高度。LEVEL0(0层实际上是指叶结点了)包括了特定对象的MBR。而LEVEL1是包含所有叶结点的MBR。 The original ratio of the area at the root(topmost level) to the area at level 0 can change over time basedon updateds to the table(不是很清楚是什么意思,大约是根结点指向的面积与所有叶结点的面积和的比率是会根据对空间表的更新操所而变动的。所以如果这个索引退化,重建将是一个提高性能的好方法。 如果已经进行了大量插入,更新与删除操作,而SDO_FILTER性能退化,那么这方法的性能退化可以归结为R-tree索引的质量退化。可以通过SDO_TUNE.QUALITY_DEGRADATION来对退化程度进行检查,如果函数返回值大于2,那么请考虑重建索引。如果R-tree索引退化不严重,那么查询性能的退化可以考虑是否是Oracle的缓存啊,I/O啊之类的设置问题。 重建R-tree可以使用ALTER INDEX REBUILD语句。 1.8 Spatial关系与过滤器。 Spataial使用secondary过滤器来决定空间关系。空间关系决定于地理位置。最通用的空间关系是基于拓扑与距离的。 为了决定空间关系,Spatail有很多secondary过滤器: 1.SDO_RELATE操作指出拓扑关系。它实现了九个交叠模型在点,线与多边形中间分类两个空间对象的拓扑关系,每个对象都有包含,交叠与不包含三种。由点与线组成的边界将内与外分开。一个线段的边界是由它的两个端点组成,如果它的端点交叠(汗,那么不就是一个点),那么它是一个没有边界的线段。一个多折线线段的边界是由它的每个组成线段的端点组成。一个多边形的边界由描述它的线段组成。内部是指所有组成对象的点都在另一个对象内部,并不与边界重合,而外部正好相反。 2.SDO_WITHIN_DISTANCE操作决定两个空间对象是否在某个指定的距离中。 3.SDO_NN操作指出离某个空间对象最近的对象。 Spatial使用下列的名称来表示空间对象的拓扑关系: 1.DISJOINT 边界与内部都不相交 2.TOUCH 边界相交,但内部不相交 3.OVERLAPBDYDISJOINT 一个对象的内部与另一个对象的边界与内部相交,但边界不相交。比如一条线的起点在多边形的外面,但终点在多边形的里面。 4.OVERLAPBDYINTERSECT 两个对象的边界与内部都交叠 5.EQUAL 两个对象有相同的边界与内部 6.CONTAINS 一个对象的边界与内部完全的包含在另一个对象的内部 7.COVERS 如果一个对象的内部被包含在另一个对象的内部或边界,并且他们的边界交叠 8.INSIDE 与CONTAINS相反,A INSIDE B表明B CONTAINS A 9.CONVEREDBY 与 CONVERS相反,A CONVEREDBY B表明B CONVERS A 10. ON 当一个对象的内部与边界都在另一个对象的边界上,例如,一个线段在多边形的边界上。 11.ANYINTERACT 两个对象有任何以上的相交 SDO_WITHIN_DISTANCE操作符判断两个对象是否在一个指定的距离内。这个操作在B对象的周围建立一个为指定距离的区域,然后看A是否与这个区域相交。 SDO_NN操作返回在一个对象周围指定数目的最近对象。 1.9 空间操作,过程与函数 Spatial PL/SQL应用程序接口包含了多个操作和很多的过程与函数。 Spatial操作,比如SDO_FILTER与SDO_RELATE,因为其使用了空间索引,所以能提供比较好的性能。Spatial操作只能用在查询语句的WHERE子句中。第一个参数都是空间对象的geometry字段,第二个参数指定一个查询窗口(?汗,看来先看过这个操作的说明再来翻比较好)。 Spatial过程与函数使用PL/sql包来提供如SDO_GEOM,SDO_CS,SDO_LRS之类的功能。这些子程序不需要空间索引,也不能使用空间索引(汗)。这些子程序可以使用在WHERE子句中或任何子查询中。作为参数的两个地理对象都应当有相同的坐标系统。 收下是使用这些操作,过程,函数时与性能有关的提示: 1.如果进行比较操作,并且如果有操作符能适合你的需要的话,请优先使用操作符。例如用SDO_RELATE替代SDO_GEOM.RELATE,使用SDO_WITHIN_DISTANCE代替SDO_GEOM.WITHIN_DISTANCE. 2.对于操作子,总是使用大写的TRUE,例如='TRUE',而不要使用<>'FALSE'或='true'. 3.对于操作子,如果查询窗口来自己表,那么使用/*+ ORDERED */来优化性能。 1.10 空间聚合函数 ORACLE空间聚合函数作用于SQL查询出来的地理对象。空间聚合函数返回一个SDO_GEOMETRY地理对象。例如,SELECT SDO_AGGR_MBR(SHAPE) FROM COLA_MARKETS返回能这个表里所有地理对象的MBR。 而SELECT SDO_AGGR_UNION(SDOAGGRTYPE(C.SHAPE,0.005)) FROM COLA_MARKETS C WHERE C.NAME<'COLA_D';返回了除了COLA_D之外的所有的地理对象的集合。 所有能使用空间聚合地理类型都应当定义4位的SDO_GTYPE值。 1.10.1 SDOAGGRTYPE对象类型 很多空间聚合函数接受SDOAGGRTYPE类型作为参数。 create type sdoaggrtype as object ( geometry sdo_geometry,tolerance number); sdoaggrtype类型中的tolerance值一般是与geometry对应的sdo_tolerance值一样的,除非有理由需要不同的值。 1.11 Geocoding Geocoding是一种将表中的地址数据转化为标准地址数据的过程。geocoding过程的结果是一个经纬对来定位输入地址。 1.12 空间JAVA应用程序接口 Oracle Spatial提供一个JAVAapi,其中包括: 1.oracle.spatial.geometry:提供Spatial的sdo_geometry类型支持。 2.oracle.spatial.network: 提供Oracle Spatial网络数据模型支持。 3.oracle.spatial.topo:提供Oracle Spatial拓扑数据模型支持 4.oracle.spaital.util: 提供各种空间操作 1.13 MDDATA Schema 这章不知道在说什么,不翻 1.14 性能与调优 很多因素可以影响Oracle Spatial应用程序的性能。比如使用优化提示来影响查询计划。 1.15 OGC 1.16 Spatial Release(Version)Number 本章及度无聊,教你如何看Spatial的版本号。SELECT SDO_version from dual; 1.17 Spatial应用的硬件要求 1.18 Spatial的错误信息 Spatial错误信息数在13000至13499之间。 1.19 Spatial的例子 Oracle Spatial是有例子的,在$ORACLE_HOME/MD/DEMOS/EXAMPLES下
原文链接:https://www.f2er.com/oracle/206558.html分类: Oracle
简单研究一下,
收藏,
详细内容看下面
[@more@]1. 什么是oracle的空间数据库:
oracle的空间数据库提供了一组关于如何存储,得到,修改和查询空间数据集的sql schema与函数.
空间数据由以下几个方面组成:
1.MDSYS schema: 规定了所支持的地理数据类型的存储,语法和语义
2.空间数据索引机制
3.提供了关于空间相交查询,空间联合查询和其它空间分析操作的操作符,函数和过程
4.提供函数和过程用于一般的工具性操作与性能操作
5.用于处理点,边和面的拓扑数据模型
6.用于表现 网络的点线的 网络数据模型
7.地理光栅: 一套机制可以让用户存储,索引,查询,分析和发布地图光栅数据,包换光栅图,栅格数据和它们的元数据
1.2 对象关系模型
Spatial支持对象关系模型来表现地理数据.这个模型用Oracle原生空间数据类型SDO_GEOMETRY来对应一个地理数据对象.一个Oracle表可以有一个或多个SDO_GEOMETRY字段.对象关系模型用"sql with Geometry Tpes"来实现the Open GIS ODBC/sql规范所定义的地理空间数据方面的功能.
对象关系模型所能提供的好处在于:
1. 支持很多地理类型,比如: 弧,圆,组合多边型,组合线段和优化矩形(这个偶现在还不知道是什么意思)
2. 更容易的建立和维护索引,以及更容易优化空间查询的性能
3. 索引由Oracle数据库维护
4. 地理信息可以放在一个字段内
5. 专门优化过的性能
1.3 Spatial数据介绍
Oracle Spatial被 设计用于让空间数据的管理更加容易,and more natural to users of location-enabled applications and geographic information system(GIS) applications(这段实在不知道要如何翻译). 一旦空间数据被存储在Oracle数据库中,它能很容易的被维护,取得并建立与存储在数据库中的其它的数据建立关联.
一个典型的空间数据的例子就是道路地图. 一个道路地图是一个二维的对象,它包括了点,线和多边形用以
表现城镇,道路,公共边界(比如国家或省市). 一个道路地图是一种可视化的方法表现的地理信息,城镇,道路和公共边
界这些存在 地球表面的对象都被映射到一个二维的显示器或纸上,保存下它们的相对位置与相对距离.
这些对象在地球的位置数据(比如说经纬度)就是空间数据. 当地图呈现时,这些空间数据被用于在二维的纸
上定位出对象的位置. GIS常常就是用于保存,取回和呈现这些于地理相关(汗,这个....)的空间数据.
另一种可以被存储在Spatial中的空间数据(相对于GISR的空间数据而言)是CAD与CAM的空间数据。它们工作在相对较小的数据范围内,经常用于汽车设计或电路板的设计中。
这两个 系统的不同之处在于数据大小与数据的精度,而不是数据的复杂性。 系统可以有相同数量的数据点。在一个地理维度上,本地的一个桥梁可能只有十几个英寸而不会对道路 建筑的表示造成任何可见的问题,但对于一个引擎活塞的直径来说,十几个英寸的误差就会造成引擎不能工作。
另一方面来说,数据的复杂度是与表现它的区域的大小无关的。例如,一个印刷电路板,它上面可能有上千个蚀刻对象,包容在这个面积上的信息的复杂度可能要比一个道路蓝图还要高。
(一段废话,不翻译了,下面同)
1.4 几何类型
一个几何类型是由一个有顺序的通过直线或曲线相连的向量序列组成。它的语义是通过它的类型来定义的。Spatial支持几种原生的类型,几何类型可以通过这些原生类型的组合而成。 原生类型包括:
二维类型:
1.点与点的集合
2.线段
3.N点组合的多边型
4.曲线段(所有的曲线都是由圆弧组成)
5.弧型多边型
6.组合多边形
7.组合线段
8.圆
9.优化的矩形
二维点是由两个坐标来表示的(X,Y),经常是表示经纬度。线段是一个或多个点对定义的片段的组合。组合多边形是由多个相连的线段形成的闭合环所区域。例如,一个点可以表示一个建筑的地点,一个线段可以表示一条道路或飞行跑道,一个多边形可以表示一个国家,城市,禁区或街区。
自交多边形现在不支持,但自交的线段是支持的。如果一个线段自交,那它不能形成多边形。一个自交的线段不包含任何区域。
Spatial也支持保存和索引三维和四维地理类型,在这方面,三个或四个坐标定义了一个向量。然而,空间函数(除了LRS函数和MBR相关函数)只在工作在二维空间中,并且所有的空间操作符(除了SDO_FILTER)也是不能在超过二维的空间索引上工作的。
1.5数据模型
Spatial数据模型是一个由元素,地理对象和层组合而成的层次结构。层由多个地理对象组成,而地理对象由多个元素组成。
1.5.1元素
一个元素是组成地理对象的基本模块。现在支持的空间元素类型是点,线段与多边形。例如,元素可以模拟星座(点的集合),道路(线段集合)和国家边界(多边形集合)。每一个元素的坐标被以X,Y对来保存。一个多边形的外部圆和内部圆被认为是两个独立的元素,但组合成一个复杂多边形。
点数据由一个坐标形成,线数据由两个坐标表示线段,多边形坐标是由一组有顺序的的坐标组成。
1.5.2 地理对象
一个地理对象是一个空间对象的描述,由多个有顺序的元素组合而成。地理对象可以是单个元素,也可以是多个同构和异构元素组合而成。在一个组合多边形中,例如小岛的集合,是同构集合。一个异构集合是由不同类型的元素组合的,比如点与多边形。
例如一个代表可建筑用地的地理对象,它就可能表现为一个多边形,中间有一个洞,代表水面或建筑分区。
1.5.3 层
层是一个由相同属性的地理对象的集合。例如一个GIS层可以包括地形数据,人口密度,道路与桥梁网络。对于单独一个层来说,它所包括的地理对象和对应的空间索引在数据库中表现为一个单独的表。
1.5.4 坐标系统
坐标系统(也叫空间参考系统)定义为代表位置的坐标和确立两个坐标集合之间的关系。它可以被解释为一个坐标的集合来表示现实空间的位置集合。
任何空间数据都与坐标系统有关。一个坐标系统可以是地理相关的(与地球上的坐标系统相关)或非地理相关(比如笛卡尔坐标系统,与地球上实际的坐标无关)。如果一个坐标系统是地理相关的,它会有一个缺省的测量单位(比如米),但你能用Spatial自动进行与其它测量单位之的换算(比如公里)。
在Oracle Spatial release 8.1.6之前,地理对象(SDO_GEOMETRY)被保存为一个坐标的字符串,而没有与任何特定的坐标系统相关。Spatial函数与操作子总是假定坐标系统是来自于笛卡尔正交坐标系,于是常常不能提供正确的以地球为基础的经纬度坐标。随着8.1.6的发布,Spatial提供了很多坐标系统的支持,方便了在各个坐标系统间自由的转换。
Spatial数据支持的坐标系统包括:
笛卡尔坐标系: 如果地理对象没的指定坐标系统,缺省的为笛卡尔坐标系。
测地学坐标系:也叫地理坐标系,是一个角度坐标系统,与球形极点坐标紧密相关。
项目坐标系:是一个平面笛卡尔坐标系统,用于通过数学映射把地球表面的点对应到一个平面上。有各种数学映射方法,每种都有自己的目的。
本地坐标系:是一个笛卡尔坐标系,对应与非地理相关的坐标系统,比如CAD制图。
当对地理对象进行操作时,Spatial要么使用笛卡尔要么使用曲线计算模型(比如全程的空间坐标系统)。
1.5.5 公差
公差是与空间数据的精度相关的。公差反映了可以表示同一对象的两个测量点之间的距离。公差值是一个大于零的正值。这个值的单位与否决定于它是否与一个地理坐标系统相关。
对一个地理数据而言,公差值为一个以米为单位的值。公差值不可能小于0.05(五毫米),当然在大多数场合它都大于这个值。如果你指定了小于这个的值,Spatial使用0.05作为实际的值保存。
对一个非地理数据而言,公差值一个单位的数值而与实际的坐标相关。例如,如果测量单位是公里,一个0.005的公差就表示0.005公里,2的公差就表示2公里。
在所有的实际用例中,更小的公差值代表了更精确的数据。
公差特别用在两个方面:
1.定义层的地理元数据
2.作为一个函数的输入参数。
1.5.5.1 公差在层的地理元数据中的使用
层的维度信息中包含了公差信息。xx_SDO_GEOM_MetaDATA视图的DIMINFO字段的每个维度中都包含一个SDO_TOLERANCE值,而且这个值在同一图层中是一样的。
如果一个函数接受一个可选的tolerance参数,并且这个参数为null或没有指定,那么图层对象的SDO_TOLERANCE就会被使用。实际使用的例子如:cola_b与cola_d之间的距离为0.846049894。如果一个SDO_GEOM.SDO_DISTANCE函数在计算这两个点之间的距离时,没有指定公差的话,那么它就依赖于点所在的层的SDO_TOLERANCE这个值了。例如
1.如果SDO_TOLERANCE值为0.005,那么这个函数返回0.846049894.
2.如果SDO_TOLERANCE值为0.5,那么这个函数返回0。返回0是因为函数会先在cola_b与cola_d这个两个点的周围各自建立一个0.5的圆,因为这两个圆相交,所以这两个点为0。
你有两种方法为一个层选择一个SDO_TOLERANCE:
1.在查询两个对象的距离时,合适的反映距离的精度的值。比如,两个非地理对象在距离为0.8个单位时应当被认为两个对象的话,那么SDO_TOLERANCE应当小于0.05。
2.值应当能反映图层中地理对象的测量精度。比如如果一个图层中所有的地理对象都用整数作为单位并且0.8个单位距离的两个地理对象视为同一个对象的话,那么SDO_TOLERANCE为0.5是合适的。
对于非地理数据来说,一般使用第二个方法,使用最高精度的SDO_TOLERANCE。例如,如果一个地理对象使用整数单位,那么合适的值应当0.5;因而,如果地理对象定义为使用4位小数(比如31.2587),那么合适值为0.00005。
1.5.5.2 作为输入参数
在很多Spatial函数都接受公差参数,以替代缺省的图层公差值。
1.6 查询模型
Spatial使用两层查询模型来解决查询与空间过滤的问题。模型使用两个不同目的的操作来加快查询过程。而输出的结果是这两个操作组合结果。
这两个操作为primary与secondary操作
1.primary过滤操作:使用地理上近似的查询操作来减小计算的复杂度。因为这个查询是近似,所以它产生一个比较大的结果集,这个结果集是给secondary过滤操作使用 。
2.secondary过滤操作:在primary过滤出来的结果集上使用精确的计算来得到最后精度的空间过滤结果集。因为这个计算过程是很昂贵的,所以它只在primary过滤出来的结果集上计算。
Spatial使用空间索引来实现primary过滤。Spatial并不强求使用一定要使用primary与secondary过滤组合。在很多情况下,光一个primary过滤就足够了。例如一个放大操作中, 应用程序只要得到与一个矩形框相交的地理区域中的内容。这时,primary过滤就可以非常快的返回一个大集合,而 应用程序可以使用减切路径来只显示出目标区域来。
1.7 Spatial数据索引
Spatial索引主要提供两个功能:
1.找到在一个区域中的空间对象。
2.找到两个空间对象的交集。
Oracle Spatial使用R-tree索引(对于Quadtree因为已经不鼓励使用,所以对于它的部分也就不翻了)。
1.7.1 R-tree索引
空间R-tree索引最高能定位四维空间。一个R-tree索引近似的使用单个MBR来代表一个地理对象。它存储在空间索引表(USER_SDO_INDEX_MetaDATA视图中的SDO_INDEX_TABLE字段所指的空间索引表,如果你去查找那个字段内容,只会看到一堆二进制)。同时R-tree索引还维护一个sequence对象(USER_SDO_INDEX_MetaDATA表中的SDO_RTREE_SEQ_NAME字段)。
1.7.2 R-tree的品质
实际上对R-tree索引的插入与删除操作会影响R-tree的质量,从而影响查询的性能。
R-tree是层次树结构,在不同的分枝有不同的高度。它的性能大体依赖于查询面积的分布与树结点的高度。LEVEL0(0层实际上是指叶结点了)包括了特定对象的MBR。而LEVEL1是包含所有叶结点的MBR。 The original ratio of the area at the root(topmost level) to the area at level 0 can change over time basedon updateds to the table(不是很清楚是什么意思,大约是根结点指向的面积与所有叶结点的面积和的比率是会根据对空间表的更新操所而变动的。所以如果这个索引退化,重建将是一个提高性能的好方法。 如果已经进行了大量插入,更新与删除操作,而SDO_FILTER性能退化,那么这方法的性能退化可以归结为R-tree索引的质量退化。可以通过SDO_TUNE.QUALITY_DEGRADATION来对退化程度进行检查,如果函数返回值大于2,那么请考虑重建索引。如果R-tree索引退化不严重,那么查询性能的退化可以考虑是否是Oracle的缓存啊,I/O啊之类的设置问题。 重建R-tree可以使用ALTER INDEX REBUILD语句。 1.8 Spatial关系与过滤器。 Spataial使用secondary过滤器来决定空间关系。空间关系决定于地理位置。最通用的空间关系是基于拓扑与距离的。 为了决定空间关系,Spatail有很多secondary过滤器: 1.SDO_RELATE操作指出拓扑关系。它实现了九个交叠模型在点,线与多边形中间分类两个空间对象的拓扑关系,每个对象都有包含,交叠与不包含三种。由点与线组成的边界将内与外分开。一个线段的边界是由它的两个端点组成,如果它的端点交叠(汗,那么不就是一个点),那么它是一个没有边界的线段。一个多折线线段的边界是由它的每个组成线段的端点组成。一个多边形的边界由描述它的线段组成。内部是指所有组成对象的点都在另一个对象内部,并不与边界重合,而外部正好相反。 2.SDO_WITHIN_DISTANCE操作决定两个空间对象是否在某个指定的距离中。 3.SDO_NN操作指出离某个空间对象最近的对象。 Spatial使用下列的名称来表示空间对象的拓扑关系: 1.DISJOINT 边界与内部都不相交 2.TOUCH 边界相交,但内部不相交 3.OVERLAPBDYDISJOINT 一个对象的内部与另一个对象的边界与内部相交,但边界不相交。比如一条线的起点在多边形的外面,但终点在多边形的里面。 4.OVERLAPBDYINTERSECT 两个对象的边界与内部都交叠 5.EQUAL 两个对象有相同的边界与内部 6.CONTAINS 一个对象的边界与内部完全的包含在另一个对象的内部 7.COVERS 如果一个对象的内部被包含在另一个对象的内部或边界,并且他们的边界交叠 8.INSIDE 与CONTAINS相反,A INSIDE B表明B CONTAINS A 9.CONVEREDBY 与 CONVERS相反,A CONVEREDBY B表明B CONVERS A 10. ON 当一个对象的内部与边界都在另一个对象的边界上,例如,一个线段在多边形的边界上。 11.ANYINTERACT 两个对象有任何以上的相交 SDO_WITHIN_DISTANCE操作符判断两个对象是否在一个指定的距离内。这个操作在B对象的周围建立一个为指定距离的区域,然后看A是否与这个区域相交。 SDO_NN操作返回在一个对象周围指定数目的最近对象。 1.9 空间操作,过程与函数 Spatial PL/SQL应用程序接口包含了多个操作和很多的过程与函数。 Spatial操作,比如SDO_FILTER与SDO_RELATE,因为其使用了空间索引,所以能提供比较好的性能。Spatial操作只能用在查询语句的WHERE子句中。第一个参数都是空间对象的geometry字段,第二个参数指定一个查询窗口(?汗,看来先看过这个操作的说明再来翻比较好)。 Spatial过程与函数使用PL/sql包来提供如SDO_GEOM,SDO_CS,SDO_LRS之类的功能。这些子程序不需要空间索引,也不能使用空间索引(汗)。这些子程序可以使用在WHERE子句中或任何子查询中。作为参数的两个地理对象都应当有相同的坐标系统。 收下是使用这些操作,过程,函数时与性能有关的提示: 1.如果进行比较操作,并且如果有操作符能适合你的需要的话,请优先使用操作符。例如用SDO_RELATE替代SDO_GEOM.RELATE,使用SDO_WITHIN_DISTANCE代替SDO_GEOM.WITHIN_DISTANCE. 2.对于操作子,总是使用大写的TRUE,例如='TRUE',而不要使用<>'FALSE'或='true'. 3.对于操作子,如果查询窗口来自己表,那么使用/*+ ORDERED */来优化性能。 1.10 空间聚合函数 ORACLE空间聚合函数作用于SQL查询出来的地理对象。空间聚合函数返回一个SDO_GEOMETRY地理对象。例如,SELECT SDO_AGGR_MBR(SHAPE) FROM COLA_MARKETS返回能这个表里所有地理对象的MBR。 而SELECT SDO_AGGR_UNION(SDOAGGRTYPE(C.SHAPE,0.005)) FROM COLA_MARKETS C WHERE C.NAME<'COLA_D';返回了除了COLA_D之外的所有的地理对象的集合。 所有能使用空间聚合地理类型都应当定义4位的SDO_GTYPE值。 1.10.1 SDOAGGRTYPE对象类型 很多空间聚合函数接受SDOAGGRTYPE类型作为参数。 create type sdoaggrtype as object ( geometry sdo_geometry,tolerance number); sdoaggrtype类型中的tolerance值一般是与geometry对应的sdo_tolerance值一样的,除非有理由需要不同的值。 1.11 Geocoding Geocoding是一种将表中的地址数据转化为标准地址数据的过程。geocoding过程的结果是一个经纬对来定位输入地址。 1.12 空间JAVA应用程序接口 Oracle Spatial提供一个JAVAapi,其中包括: 1.oracle.spatial.geometry:提供Spatial的sdo_geometry类型支持。 2.oracle.spatial.network: 提供Oracle Spatial网络数据模型支持。 3.oracle.spatial.topo:提供Oracle Spatial拓扑数据模型支持 4.oracle.spaital.util: 提供各种空间操作 1.13 MDDATA Schema 这章不知道在说什么,不翻 1.14 性能与调优 很多因素可以影响Oracle Spatial应用程序的性能。比如使用优化提示来影响查询计划。 1.15 OGC 1.16 Spatial Release(Version)Number 本章及度无聊,教你如何看Spatial的版本号。SELECT SDO_version from dual; 1.17 Spatial应用的硬件要求 1.18 Spatial的错误信息 Spatial错误信息数在13000至13499之间。 1.19 Spatial的例子 Oracle Spatial是有例子的,在$ORACLE_HOME/MD/DEMOS/EXAMPLES下