空间数据库实习三个实验

更新时间:2023-10-22 20:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《空间数据库》

实验指导书

评分表 实验一 实验二 实验三 实验四 总评 空间数据库实验预备知识—Oracle Spatial简介

Oracle Spatial主要通过元数据表、空间数据字段(即sdo_Geometry字段)和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的程序包,让用户进行更深层次的GIS应用开发。Oracle Spatial使用空间字段sdo_Geometry存储空间数据,用元数据表来管理具有sdo_Geometry字段的空间数据表,并采用R树索引和四叉树索引技术来提高空间查询和空间分析的速度。 一、元数据表说明

Oracle Spatial的元数据表存储了有空间数据的数据表名称、空间字段名称、空间数据的坐标范围、坐标系以及坐标维数说明等信息。用户必须通过元数据表才能知道Oracle数据库中是否有Oracle Spatial的空间数据信息。通过元数据视图(USER_SDO_GEOM_METADATA)访问元数据表。元数据视图

的基本定义为:

其中,TABLE_NAME为含有空间数据字段的表名,COLUMN_NAME为空间数据表中的空间字段名称,DIMINFO是一个按照空间维顺序排列的SDO_DIM_ARRAY对象的动态数组,SRID则用于标识与几何对象相关的空间坐标参考系。SDO_DIM_ELEMENT对象的定义如下所示:

Create Type SDO_DIM_ARRAY as OBJECT ( SDO_DIMNAME VARCHAR2(64), SDO_LB NUMBER, SDO_UB NUMBER,

SDO_TOLERANCE NUMBER);

其中,SDO_DIMNAME是空间维名称,SDO_LB为该空间维的左下角坐标,SDO_UB为该空间维的右上角坐标,SDO_TOLERANCE为几何对象的表示精度。 二、空间字段解析

Oracle Spatial的空间数据都存储在空间字段sdo_Geometry中,理解sdo_Geometry是编写Oracle Spatial程序的关键。sdo_Geometry是按照

Open GIS规范定义的一个对象,其原始的创建方式如下所示。

① sdo_Gtype

是一个NUMBER型的数值,用来定义存储几何对象的类型。sdo_Gtype是一个4个数字的整数,其格式为dltt,其中d表示几何对象的维数;l表示三维线性参考系统中的线性参考值,当d为3维或者4维时需要设置该值,一般情况下为空;tt为几何对象的类型,Oracle Spatial定义了7种类型的几何类型,目前,tt使用了00到07,其中08到99是Oracle Spatial保留的数字,

以备将来几何对象扩展所用。

② sdo_Srid

sdo_Srid也是一个NUMBER型的数值,它用于标识与几何对象相关的空间坐标系。如果sdo_Srid为空(null),则表示没有坐标系与该几何对象相关;如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_SDO_GEOM_METADATA视图的SRID字段中。对于我们通常使用国际标准的Longitude/Latitude(8307),Oracle Spatial规定,一个几何字段中的所有几何对象都必须为相同的sdo_Srid值。

③ sdo_Point

sdo_Point是一个包含三维坐标X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象。如果sdo_Elem_Info和SDO_ORDINATES数组都为空,则sdo_Point中的X,Y,Z为点对象的坐标值,否则,sdo_Point的值将被忽略(用NULL表示)。Oracle Spatial强烈要求用sdo_Point存储空间实体为点类型空间数据,这样可以极大的优化Oracle Spatial的存储性能和查询效率。

④ 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, …}的顺序排列。 三、空间索引技术

Oracle Spatial提供R树索引和四叉树索引两种索引机制来提高空间查询和空间分析的速度。用户需要根据不同空间数据类型创建不同的索引,当空间数据类型比较复杂时,如果选择索引类型不当,将使Oracle Spatial创建索引的过程变得非常慢。

实验一 认识Oracle Spatial的主要数据库对象

一、实验目的

1. 了解Oracle10g数据库中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的Enterprise Manager中进行实验,打开Enterprise Manager的方法:登陆页面http://w8-01:1158/em/,出现如下登录界面:

填入正确的用户名:system和口令:abc,如下图:

点击下方“我同意”之后,连接主界面为下图所示:

三、实验步骤及分析(2课时)

1.了解Oracle数据库中MDSYS方案的空间元数据。

(1)打开MDSYS. SDO_GEOM_METADATA_TABLE空间元数据表,并记录表结构下来,同时给出每个属性代表的实际意义:

SDO_OWNER 是数据库所有者

SDO_TABLE_NAME 是为含有空间数据字段的表名 SDO_COLUMN_NAME为空间数据表中的空间字段名称 SDO_DIMINFO是一个按照空间维顺序排列的

SDO_SRID则用于标识与几何对象相关的空间坐标参考系

(2) MDSYS. SDO_GEOM_METADATA_TABLE空间元数据表中的SDO_DIMINFO属性的类型是SDO_DIM_ARRAY,在用户类型.数组类型中查看SDO_DIM_ARRAY的一般信息,SDO_DIM_ARRAY这个数组的元素是什么类型?

MDSYS.SDO_DIM_ELEMENT

(3)查看用户类型SDO_DIM_ELEMENT的结构并记录下来并说明每个属性代表的实际意义。它和元数据表中的SDO_DIMINFO属性有何关系?

SDO_DIMNAME是空间维名称, SDO_LB为该空间维的左下角坐标, SDO_UB为该空间维的右上角坐标,

SDO_TOLERANCE为几何对象的表示精度。 SDO_DIMINFO是一个按照空间维顺序排列的,而这些属性是定义空间维的,这些属性的存在才能够使DIMINFO排列。

(4)打开SQL-Plus(以后步骤中的SQL都在此程序中执行),步骤为:

打开开始->程序等路径,如下图:

注意改写*.ora文件中的内容,复制一段代码后将主机名改写为w8-01登陆,

填入正确的用户名:system和口令:abc,主机字符串:orcl,如下图:

并运行如下SQL语句,建立一个包含MDSYS . SDO_GEOMETRY属性的表: CREATE TABLE SPATIALTEST_liufei( ID VARCHAR2(20) PRIMARY KEY, NAME VARCHAR2(100), ADDRESS VARCHAR2(200), TELEPHONE VARCHAR2(50), LOC MDSYS . SDO_GEOMETRY);

在对应方案中找到数据表SPATIALTEST,双击查看表结构,可以看到LOCATION的数据类型是MDSYS . SDO_GEOMETRY,所以,LOCATION需要在元数据表中填写一条相关记录。

(5)根据用户表填写空间元数据,并说明其实际意义。 INSERT INTO USER_SDO_GEOM_METADATA VALUES(

‘SPATIALTEST_liufei’, ‘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 * FROM USER_SDO_GEOM_METADATA

(7)查看对象类型MDSYS.SDO_GEOMETRY的结构并记录下来,说明每个属性代表的实际意义。

(8)查看数组类型MDSYS.SDO_ELEM_INFO_ARRAY的结构并记录下来。它和MDSYS.SDO_GEOMETRY对象类型有何关系?

实验三 简单的空间数据库示例

一、实验目的

通过一个简单的空间集合的示例,运用前面实验所学的方法,建立空间数据表、元数据表、建立空间索引、输入空间数据,实现一些简单的空间查询和分析。 二、实验环境

实验中的SQL语句均在SQL-PLUS中执行。 三、实验内容和要求(2课时)

一个商场有4个区域cola_a,cola_b,cola_c,cola_d,可以在一个20X20的直角坐标中表示为不同的多边形,如下图:

针对上图,自行设计并完成以下实验内容: 1.创建一个表(COLA_MARKETS)来保存空间数据; CREATE TABLE liufei (

feature_id NUMBER PRIMARY KEY, name VARCHAR2(32),

shape MDSYS.SDO_GEOMETRY)

2.将4个多边形(cola_a,cola_b,cola_c,cola_d)的空间数据插入到COLA_MARKETS表中;

INSERT INTO liufei VALUES( 1, 'cola_a', SDO_GEOMETRY(

2003, --two-dimensional polygon NULL, NULL,

SDO_ELEM_INFO_ARRAY(1,1003,3), --one rectangle (1003 = exterior) SDO_ORDINATE_ARRAY(1,1, 5,7) --only 2 points needed to --define rectangle (lower left and upper right) with --Cartesian-coordinate data ) );

INSERT INTO liufei VALUES( 2, 'cola_b', SDO_GEOMETRY(

2003, --two-dimensional polygon NULL, NULL,

SDO_ELEM_INFO_ARRAY(1,1003,1), --one polygon (exterior polygon ring)

SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1) ) );

INSERT INTO liufei VALUES( 3, 'cola_c', SDO_GEOMETRY(

2003, --two-dimensional polygon NULL, NULL,

SDO_ELEM_INFO_ARRAY(1,1003,1), --one polygon ring)

SDO_ORDINATE_ARRAY(3,3, 6,3, 6,5, 4,5, 3,3) ) );

INSERT INTO liufei VALUES( 4, 'cola_d', SDO_GEOMETRY(

2003, --two-dimensional polygon NULL, NULL,

SDO_ELEM_INFO_ARRAY(1,1003,4), --one circle SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) ) );

polygon (exterior

3.通过USER_SDO_GEOM_METADATA视图将COLA_MARKETS的空间属性列加入到空间元数据表中;

INSERT INTO USER_SDO_GEOM_METADATA VALUES ( 'liufei', 'shape',

SDO_DIM_ARRAY( --20X20 grid

SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ),

NULL --SRID );

本文来源:https://www.bwwdw.com/article/lg6f.html

Top