空间数据库.docx
《空间数据库.docx》由会员分享,可在线阅读,更多相关《空间数据库.docx(18页珍藏版)》请在冰豆网上搜索。
空间数据库
《空间数据库》
实验指导书
班级
学号
姓名
评分表
实验一
实验二
实验三
总评
空间数据库实验预备知识——OracleSpatial简介
OracleSpatial主要通过元数据表、空间数据字段(即sdo_Geometry字段)和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的程序包,让用户进行更深层次的GIS应用开发。
OracleSpatial使用空间字段sdo_Geometry存储空间数据,用元数据表来管理具有sdo_Geometry字段的空间数据表,并采用R树索引和四叉树索引技术来提高空间查询和空间分析的速度。
一、元数据表说明
OracleSpatial的元数据表存储了有空间数据的数据表名称、空间字段名称、空间数据的坐标范围、坐标系以及坐标维数说明等信息。
用户必须通过元数据表才能知道Oracle数据库中是否有OracleSpatial的空间数据信息。
通过元数据视图(USER_SDO_GEOM_METADATA)访问元数据表。
元数据视图的基本定义为:
其中,TABLE_NAME为含有空间数据字段的表名,COLUMN_NAME为空间数据表中的空间字段名称,DIMINFO是一个按照空间维顺序排列的SDO_DIM_ARRAY对象的动态数组,SRID则用于标识与几何对象相关的空间坐标参考系。
SDO_DIM_ELEMENT对象的定义如下所示:
CreateTypeSDO_DIM_ARRAYasOBJECT(
SDO_DIMNAMEVARCHAR2(64),
SDO_LBNUMBER,
SDO_UBNUMBER,
SDO_TOLERANCENUMBER);
其中,SDO_DIMNAME是空间维名称,SDO_LB为该空间维的左下角坐标,SDO_UB为该空间维的右上角坐标,SDO_TOLERANCE为几何对象的表示精度。
二、空间字段解析
OracleSpatial的空间数据都存储在空间字段sdo_Geometry中,理解sdo_Geometry是编写OracleSpatial程序的关键。
sdo_Geometry是按照OpenGIS规范定义的一个对象,其原始的创建方式如下所示。
①sdo_Gtype
是一个NUMBER型的数值,用来定义存储几何对象的类型。
sdo_Gtype是一个4个数字的整数,其格式为dltt,其中d表示几何对象的维数;l表示三维线性参考系统中的线性参考值,当d为3维或者4维时需要设置该值,一般情况下为空;tt为几何对象的类型,OracleSpatial定义了7种类型的几何类型,目前,tt使用了00到07,其中08到99是OracleSpatial保留的数字,以备将来几何对象扩展所用。
②sdo_Srid
sdo_Srid也是一个NUMBER型的数值,它用于标识与几何对象相关的空间坐标系。
如果sdo_Srid为空(null),则表示没有坐标系与该几何对象相关;如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_SDO_GEOM_METADATA视图的SRID字段中。
对于我们通常使用国际标准的Longitude/Latitude(8307),OracleSpatial规定,一个几何字段中的所有几何对象都必须为相同的sdo_Srid值。
③sdo_Point
sdo_Point是一个包含三维坐标X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象。
如果sdo_Elem_Info和SDO_ORDINATES数组都为空,则sdo_Point中的X,Y,Z为点对象的坐标值,否则,sdo_Point的值将被忽略(用NULL表示)。
OracleSpatial强烈要求用sdo_Point存储空间实体为点类型空间数据,这样可以极大的优化OracleSpatial的存储性能和查询效率。
④sdo_Elem_Info
sdo_Elem_Info是一个可变长度的数组,每3个数作为一个元素单位,用于表示坐标是如何存储在SDO_ORDINATES数组中的。
本文把组成一个元素的3个数称为3元组。
一个3元组包含以下3部分的内容:
◇SDO_STARTING_OFFSET
SDO_STARTING_OFFSET表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置。
它的值从1开始,逐渐增加。
◇SDO_ETYPE
SDO_ETYPE用于表示几何对象中每个组成元素的几何类型。
当它的值为1,2,1003和2003时,表明这个几何元素为简单元素。
如果SDO_ETYPE为1003,表明该多边形为外环(第一个数为1表示外环),坐标值以逆时针存储;如果SDO_ETYPE为2003,表明该多边形为内环(第一个数为2表示内环),坐标值以顺时针存储。
当SDO_ETYPE为4,1005和2005时,表明这个几何元素为复杂元素。
它至少包含一个3元组用以说明该复杂元素具有多少个几何简单元素。
同样,1005表示多边形为外环,坐标值以逆时针存储;2005表示多边形为内环,坐标值以顺时针存储。
◇SDO_INTERPRETATION
SDO_INTERPRETATION具有两层含义,具体的作用由SDO_ETYPE是否为复杂元素决定。
如果SDO_ETYPE是复杂元素(4,1005和2005),则SDO_INTERPRETATION表示它后面有几个子3元组属于这个复杂元素。
如果SDO_ETYPE是简单元素(1,2,1003和2003),则SDO_INTERPRETATION表示该元素的坐标值在SDO_ORDINATES中是如何排列的。
需要注意的是,对于复杂元素来说,组成它的子元素是连续的,一个子元素的最后一个点是下一个子元素的起点。
最后一个子元素的最后一个坐标要么与下一个元素的SDO_STARTING_OFFSET值减1所对应的坐标相同,要么是整个SDO_ORDINATES数组的最后一个坐标。
⑤sdo_Ordinates
SDO_ORDINATES是一个可变长度的数组,用于存储几何对象的实际坐标,是一个最大长度为1048576,类型为Number的数组。
SDO_ORDINATES必须与sdo_Elem_Info数组配合使用,才具有实际意义。
SDO_ORDINATES的坐标存储方式由几何对象的维数决定,如果几何对象为二维,则SDO_ORDINATES的坐标以{x1,y1,x2,y2,…}顺序排列,如果几何对象为三维,则SDO_ORDINATES的坐标以{x1,y1,z1,x2,y2,z2,…}的顺序排列。
三、空间索引技术
OracleSpatial提供R树索引和四叉树索引两种索引机制来提高空间查询和空间分析的速度。
用户需要根据不同空间数据类型创建不同的索引,当空间数据类型比较复杂时,如果选择索引类型不当,将使OracleSpatial创建索引的过程变得非常慢。
实验一认识OracleSpatial的主要数据库对象
一、实验目的
1.了解Oracle数据库中MDSYS方案的空间元数据表的结构及用途;
2.了解对象类型MDSYS.SDO_DIM_ARRAY以及和空间元数据表的关系;
3.掌握通过元数据视图USER_SDO_GEOM_METADATA查看空间元数据表的内容;
4.了解对象类型MDSYS.SDO_GEOMETRY的结构及用途;
5.了解数组类型MDSYS.SDO_DIM_ELEMENT结构及用途;
6.了解数组类型MDSYS.SDO_ORDINATE_ARRAY结构及用途;
二、实验环境
在Oracle的EnterpriseManagerConsole中进行实验,打开EnterpriseManagerConsole的
方法:
开始→程序→Oracle–ora92→EnterpriseManagerConsole,出现如下登录界面:
选择“独立启动”选择按钮,点击确定进入EnterpriseManagerConsole界面如下图所示:
点击数据库中的实例(上图中实例为ORACLE01),进行连接,出现如下图所示的连接界面:
填入正确的用户名和口令,“连接身份(A)”选择SYSDBA,如下图:
连接后实例名将改变为下图所示:
三、实验步骤及分析(2课时)
1.了解Oracle数据库中MDSYS方案的空间元数据。
(1)打开MDSYS.SDO_GEOM_METADATA_TABLE空间元数据表,并记录表结构下来,同时给出每个属性代表的实际意义:
(2)MDSYS.SDO_GEOM_METADATA_TABLE空间元数据表中的SDO_DIMINFO属性的类型是SDO_DIM_ARRAY,在用户类型.数组类型中查看SDO_DIM_ARRAY的一般信息,SDO_DIM_ARRAY这个数组的元素是什么类型?
(3)查看用户类型SDO_DIM_ELEMENT的结构并记录下来并说明每个属性代表的实际意义。
它和元数据表中的SDO_DIMINFO属性有何关系?
(4)打开SQL-Plus(以后步骤中的SQL都在此程序中执行),并运行如下SQL语句,建立一个包含MDSYS.SDO_GEOMETRY属性的表:
CREATETABLESPATIALTEST(
IDVARCHAR2(20)PRIMARYKEY,
NAMEVARCHAR2(100),
ADDRESSVARCHAR2(200),
TELEPHONEVARCHAR2(50),
LOCMDSYS.SDO_GEOMETRY);
在对应方案中找到数据表SPATIALTEST,双击查看表结构,可以看到LOCATION的数据类型是MDSYS.SDO_GEOMETRY,所以,LOCATION需要在元数据表中填写一条相关记录。
(5)根据用户表填写空间元数据,并说明其实际意义。
INSERTINTOUSER_SDO_GEOM_METADATA
VALUES(
‘SPATIALTEST’,
‘LOC’,
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT(’Longitude’,-180,180,10),
MDSYS.SDO_DIM_ELEMENT(’Latitude’,-90,90,10)
),
8307
);
(6)利用USER_SDO_GEOM_METADATA视图查看元数据表并记录内容:
SELECT*FROMUSER_SDO_GEOM_METADATA
(7)查看对象类型MDSYS.SDO_GEOMETRY的结构并记录下来,说明每个属性代表的实际意义。
(8)查看数组类型MDSYS.SDO_ELEM_INFO_ARRAY的结构并记录下来。
它和MDSYS.SDO_GEOMETRY对象类型有何关系?
(9)查看数组类型MDSYS.SDO_ORDINATE_ARRAY的结构并记录下来。
它和MDSYS.SDO_ELEM_INFO_ARRAY数组类型有何关系?
完成时间
实验过程、结果及分析
得分
教师签名
20
80
实验二空间查询
一、实验目的
1.掌握空间数据表的建立的过程;
2.掌握空间数据的输入方法;
3.掌握空间索引的建立方法;
3.掌握filter和related两个查询过程。
二、实验环境
实验中的SQL语句均在SQL-PLUS中执行。
三、实验步骤及内容(2课时)
Step1.创建一张表,其中shape用来存放空间数据
CREATETABLEmylake(
feature_idNUMBERPRIMARYKEY,
nameVARCHAR2(32),
shapeMDSYS.SDO_GEOMETRY);
Step2.在user_sdo_geom_metadata表中插入新记录,用于描述空间字段
INSERTINTOuser_sdo_geom_metadataVALUES(
'mylake', //---表名
'shape', //---字段名
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X',0,100,0.05), //---X维最小,最大值和容忍度。
MDSYS.SDO_DIM_ELEMENT('Y',0,100,0.05) //---Y维最小,最大值和容忍度
),
NULL //---坐标系,缺省为笛卡尔坐标系
);
Step3.创建空间索引
CREATEINDEXmylake_idxONmylake(shape)
INDEXTYPEISMDSYS.SPATIAL_INDEX
打开创建的空间索引mylake_idx,记录索引的一般信息。
Step4.插入空间数据
OracleSpatial用MDSYS.SDO_GEOMETRY来存储空间数据,
//插入包含一个岛屿的湖泊
INSERTINTOmylakeVALUES(
10,
'LakeCalhoun',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,19,2003,1),
MDSYS.SDO_ORDINATE_ARRAY(0,0,10,0,10,10,0,10,0,0,4,4,6,4,6,6,4,6,4,4)
));
//插入两艘小船
INSERTINTOmylakeVALUES(
11,
'TheWindswept',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(2,2,3,2,3,2,2,3,2,2)
)
);
INSERTINTOmylakeVALUES(
12,
'BlueCrest',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(7,7,8,7,8,7,7,8,7,7)
)
);
运行SELECT*FROMMYLAKE,并记录运行结果,并说明每条记录代表什么。
Step5.查询
OracleSpatial查询数据包括二个处理过程:
只通过索引查询候选项。
通过函数SDO_FILTER实现:
SDO_FILTER(geometry1MDSYS.SDO_GEOMETRY, geometry2MDSYS.SDO_GEOMETRY,paramsVARCHAR2)
geometry1:
必须是被索引的几何数据
geometry2:
不一定是表中的空间字段,也不要求被索引
params:
Filter类型
querytype=WINDOW:
geometry2不要求来自表
querytype=JOIN:
geometry2必须来自表
运行下列SQL语句,并记录结果,并说明这个结果这代表什么意义?
SELECTnameboat_name
FROMmylaket
WHEREfeature_id=11
ANDSDO_FILTER(t.shape,mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2,5,2,5,5,2,5,2,2)),
'querytype=WINDOW')='TRUE';
再检查每个候选项是否和条件精确匹配。
通过函数SDO_RELATE实现:
SDO_RELATE(geometry1MDSYS.SDO_GEOMETRY,geometry2MDSYS.SDO_GEOMETRY,paramsVARCHAR2)
params:
masktype类型
DISJOINT—theboundariesandinteriorsdonotintersect
TOUCH—theboundariesintersectbuttheinteriorsdonotintersect
OVERLAPBDYDISJOINT—theinteriorofoneobjectintersectstheboundaryandinterioroftheotherobject,butthetwoboundariesdonotintersect.Thisrelationshipoccurs,forexample,whenalineoriginatesoutsideapolygonandendsinsidethatpolygon.
OVERLAPBDYINTERSECT—theboundariesandinteriorsofthetwoobjectsintersect
EQUAL—thetwoobjectshavethesameboundaryandinterior
CONTAINS—theinteriorandboundaryofoneobjectiscompletelycontainedintheinterioroftheotherobject
COVERS—theinteriorofoneobjectiscompletelycontainedintheinterioroftheotherobjectandtheirboundariesintersect
INSIDE—theoppositeofCONTAINS.AINSIDEBimpliesBCONTAINSA.
COVEREDBY—theoppositeofCOVERS.ACOVEREDBYBimpliesBCOVERSA.
ON—theinteriorandboundaryofoneobjectisontheboundaryoftheotherobject(andthesecondobjectcoversthefirstobject).Thisrelationshipoccurs,forexample,whenalineisontheboundaryofapolygon.
ANYINTERACT—theobjectsarenon-disjoint.
运行下列SQL语句,并记录结果,并说明这个结果这代表什么意义?
//选择在定义矩形内的所有小船
SELECTnameboat_name
FROMmylaket
WHEREfeature_id=12
ANDSDO_FILTER(t.shape,mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2,5,2,5,5,2,5,2,2)),
'querytype=WINDOW')='TRUE'
ANDSDO_RELATE(t.shape,mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2,5,2,5,5,2,5,2,2)),
'mask=INSIDEquerytype=WINDOW')='TRUE'
运行结果和分析:
//masktype可联合使用
SELECTnameboat_name
FROMmylaket
WHEREfeature_id=11
ANDSDO_FILTER(t.shape,mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2,5,2,5,5,2,5,2,2)),
'querytype=WINDOW')='TRUE'
ANDSDO_RELATE(t.shape,mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(1,1,5,1,5,5,1,5,1,1)),
'mask=INSIDE+TOUCHquerytype=WINDOW')='TRUE'
运行结果和分析:
完成时间
实验过程、结果及分析
得分
教师签名
20
80
实验三简单的空间数据库示例
一、实验目的
通过一个简单的空间集合的示例,运用前面实验所学的方法,建立空间数据表、元数据表、建立空间索引、输入空间数据,实现一些简单的空间查询和分析。
二、实验环境
实验中的SQL语句均在SQL-PLUS中执行。
三、实验内容和要求(4课时)
一个商场有4个区域cola_a,cola_b,cola_c,cola_d,可以在一个20X20的直角坐标中表示为不同的多边形,如下图:
针对上图,自行设计并完成以下实验内容:
1.创建一个表(COLA_MARKETS)来保存空间数据;
2.将4个多边形(cola_a,cola_b,cola_c,cola_d)的空间数据插入到COLA_MARKETS表中;
3.通过USER_SDO_GEOM_METADATA视图将COLA_MARKETS的空间属性列加入到空间元数据表中;
4.创建COLA_MARKETS表的空间索引COLA_SPATIAL_IDX;
5.完成下列查询:
(1)查询cola_a和co