空间数据库实验报告中国地质大学(武汉)实验名称:空间数据查询与访问实验环境:win7 64位系统,内存为2G,Oracle11g数据库实验者:实验时间:2013.12.09实验目的:(1)了解掌握Oracle Spatial中空间数据查询与访问的原理与方法;(2)掌握用PL/SQL访问Oracle Spatial数据库中几何数据,以及调用相关的空间分析函数对几何数据进行分析。
实验内容:将数据文件mvdemo.dmp导入到创建的用户中去,然后根据要求利用SQL语言进行编程实现相应的功能。
需要实现的功能如下:(1)输出数据库中所有州的多边形,采用WKT格式输出;(2)输出数据库中所有的城市的几何对象信息,采用GML格式输出;(3)给定点的经纬度坐标(40°43′N,74°00′W),查询该点是位于美国的哪个州?(4)给定一个矩形区域(35-45°N,90-100°W ),查询有哪些城市位于该区域内?哪些州与该区域相交?实验步骤及结果展示:(1)将mvdemo.dmp数据集导入到创建好的用户mvdemo中由于表空间和用户的创建过程我们已经展示过很多次,并且也尝试过很多次了,这里我们就直接跳过表空间和用户的创建过程,直接将数据集导入到创建好的用户中去,导入数据的具体过程如下:在C:\app\oracle\product\11.2.0\dbhome_1\BIN文件夹中打开imp.exe 文件,这个文件是用来将数据导入到数据库中的,因此我们利用这个文件将mvdemo.dmp文件导入到数据库中,进入后输入用户名和密码,在此之前我们已经创建建好了一个名为mvdemo的表空间和用户,密码也设置为mvdemo,输入后显示连接成功,然后按照提示进行数据的导入工作,如下图所示:按照要求填入适当的回答后,数据便开始导入,导入过程如下图所示:导入成功后对话框将会自动退出,此时我们进入到SQL Developer,进入后界面如下:此时我们连接刚刚创建好名为“mvdemo”的用户和表空间测试结果显示状态为成功,此时我们直接点击连接即可连接到数据库。
连接后我们查看表中的对象,发现mvdemo.dmp文件中的数据已经全部导入到mvdemo这个用户中去了,导入的表如下图所示:此时我们可以查看一下表“CITIES”中的数据,结果如下图所示:mvdemo用户中去了,因此接下来我们可以进行相应的编程来实现相应的功能。
(2)输出数据库中所有州的多边形,采用WKT格式输出我们首先定义一个clob类型的参数wkt_clob,clob是数据库中的一种保存文件所使用的类型,我们采用WKT格式输出的时候将会用到,然后定义一个mdsys.sdo_geometry类型的参数g,这是一个用来保存对象几何形状的参数,用来存储state的多边形信息,最终将其转化为wkt格式赋给wkt_clob,最后定义一个游标geomcursor指向states表中的geom这一列。
定义了以上的参数后,我们便开始编写具体的代码,首先 open geomcursor 打开游标,如果可以找到states中的几何数据,则将其赋给g,然后将g中的信息转化成为WKT格式并赋给wkt_clob,最终打印输出该信息,知道游标将states表中的几何信息提取完毕即退出,具体的代码如下:declarewkt_clob clob;g mdsys.sdo_geometry;cursor geomcursor is select t.GEOM from STATES t;beginopen geomcursor ;loopfetch geomcursor into g;if geomcursor%FOUND thenwkt_clob := g.get_wkt();dbms_output.put_line(sys.dbms_lob.substr(wkt_clob,256,1));elseexit;end if;end loop;close geomcursor;end;运行后输出的结果如下图所示:(3)输出数据库中所有的城市的几何对象信息,采用GML格式输出与(2)的方法基本类似,只是在定义的时候将游标指向cities表中的location这一列,然后打开游标,提取数据,将数据进行赋值和转化,基本思路相同,转化成GML格式与转化成WKT格式有小小的差异,这一点需要注意,具体的代码如下:declaregml_clob clob;g mdsys.sdo_geometry;cursor geomcursor is select t.LOCATION from CITIES t;beginopen geomcursor ;loopfetch geomcursor into g;if geomcursor%FOUND thengml_clob := mdsys.sdo_util.to_gmlgeometry(g);dbms_output.put_line(sys.dbms_lob.substr(gml_clob,256,1));elseexit;end if;end loop;close geomcursor;end;运行后输出的结果如下图所示:(4)给定点的经纬度坐标(40°43′N,74°00′W),查询该点是位于美国的哪个州?我们定义一个varchar2类型参数来记录点的信息,然后定义一个clob类型参数来将数据格式转化成WKT格式,并将其输出,一个用来保存state名称的varchar2类型,此外我们定义了两个几何类型的参数,g用来保存从游标中提取出来的数据,将gt存储传入的几何参数,定义的游标为带参数的游标,从states表中选择包含传递参数的state,设置mask=CONTAINS,表示前者要包含后者,打开游标后找到符合条件的数据,并将其进行一系列的转化和输出,主要是输出state的名称和它的几何信息,其中几何信息以WKT格式输出,具体代码如下:declarewkt varchar2(255);wkt_clob clob;g mdsys.sdo_geometry;gt mdsys.sdo_geometry;statename varchar2(255);cursor geomcursor (gm mdsys.sdo_geometry) isselect t.state, t.GEOM from states tWhere sdo_relate(t.geom, gm,'mask=CONTAINS')='TRUE'; beginwkt:='POINT (-100.0 40.0)';gt:=MDSYS.SDO_GEOMETRY(wkt,8307);open geomcursor (gt) ;loopfetch geomcursor into statename, g;if geomcursor%FOUND thenwkt_clob := g.get_wkt();dbms_output.put_line(statename);dbms_output.put_line(sys.dbms_lob.substr(wkt_clob,256,1));else exit; end if; end loop;close geomcursor;end;运行后的结果如下图所示:(5)给定一个矩形区域( 35-45°N,90-100°W ),查询有哪些城市位于该区域内?哪些州与该区域相交?选择哪些城市位于该区域内,哪些州与选择区域相交的算法与前面(4)中的步骤基本相同,在这里就不一一解释了,同样也是定义了一个带参数的游标,其中需要注意的就是这里设置的mask的值需要做相应的调整,表示选择数据时要保证几何信息位于给定的区域内或者是与给定的区域相交,在查询哪些城市位于该区域时,令mask=INSIDE,当选择哪些州与该区域相交时,令mask=ANYINTERACT,只是在这两个过程中分别是从cities表中选择相应的信息和从states表中选择相应的信息,因此我们在代码中定义了两个游标,分别从cities表和states表中选择则符合条件的城市和州的信息,并分别进行打印输出,先输出包含在该区域城市的基本信息,然后输出与该区域相交的州的基本信息,具体代码如下:declarewkt varchar2(255);wkt_clob clob;g mdsys.sdo_geometry;gt mdsys.sdo_geometry;cityname varchar2(255);stateyname varchar2(255);cursor geomcursor (gm mdsys.sdo_geometry) isselect t.CITY, t.LOCATION from CITIES twhere sdo_relate(t.LOCATION, gm,'mask=INSIDE')='TRUE';cursor geomcursor1 (gm mdsys.sdo_geometry) isselect t.state, t.geom from states twhere sdo_relate(t.geom, gm,'mask=ANYINTERACT')='TRUE'; begingt:=MDSYS.SDO_GEOMETRY(2003,8307,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),MDSYS.SDO_ORDINATE_ARRAY(-100.0,35.0,-90.0,45.0)); wkt_clob := gt.get_wkt();dbms_output.put_line(sys.dbms_lob.substr(wkt_clob,256,1));open geomcursor (gt) ;open geomcursor1(gt);dbms_output.put_line('输出包含在该区域城市的基本信息');loopfetch geomcursor into cityname, g;if geomcursor%FOUND thenwkt_clob := g.get_wkt();dbms_output.put_line(cityname);dbms_output.put_line(sys.dbms_lob.substr(wkt_clob,256,1));elseexit;end if;end loop;dbms_output.put_line('输出与该区域相交的州的基本信息');loopfetch geomcursor1 into stateyname, g;if geomcursor1%FOUND thenwkt_clob := g.get_wkt();dbms_output.put_line(stateyname);dbms_output.put_line(sys.dbms_lob.substr(wkt_clob,256,1)); elseexit;end if;end loop;close geomcursor;close geomcursor1;end;运行该代码的结果如下图所示:实验心得与结论:在本次实验过程中,同学们了解并掌握了Oracle Spatial中空间数据查询与访问的基本原理与方法,对空间数据的结构有了一定程度的了解,学会了空间数据的导入方法以及基本的空间信息查询和基本的空间分析方法,学会了用SQL 语言对空间对象信息进行基本的访问查询操作。