《空间数据库》实习指导书.docx
- 文档编号:23593384
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:23
- 大小:252.08KB
《空间数据库》实习指导书.docx
《《空间数据库》实习指导书.docx》由会员分享,可在线阅读,更多相关《《空间数据库》实习指导书.docx(23页珍藏版)》请在冰豆网上搜索。
《空间数据库》实习指导书
《空间数据库》
课程实习指导书
评分表
完成时间
设计过程
结果及分析
实习报告
总评
20
30
30
20
《空间数据库原理》课程实习预备知识
—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的数据连接,利用C#.NET开发语言建立空间数
据表、元数据表、建立空间索引、输入空间数据的方法,重点学习OracleSpatial中空间数据类型在c#编程环境中的映射方法,实现一些简单的空间查询、空间
分析和数据可视化功能。
二、开发环境
开发中的程序代码均可在.NET环境中执行,编程语言自选,调用Oracle11g数据库开发动态库。
三、提交成果形式
实习报告,要求每个同学独立自主完成,可相互讨论,但不可抄袭,发现抄袭者严惩,成绩记为不及格。
实习报告内容要求过程饱满,有具体的实验结果和必要的分析内容,注意排版和图文并茂,不要满篇都是黏贴的代码,找重要的代码分析清楚即可。
最后注意写明实习心得与实习收获。
四、内容和要求
一个商场有4个区域cola_a,cola_b,cola_c,cola_d,可以在一个20X20的直角坐标中表示为不同的多边形,如下图:
针对上图,自行设计并完成以下开发内容,特别是在实验三的基础上完成下列内容:
1.在C#.NET编程环境中实现自己实验项目的新建、数据库开发
动态库的导入与引用、界面的设计等工作。
数据库开发动态库的导入与引用方法如下:
首先右键点击项目中引用项:
在“添加引用”的“浏览”选项卡中找到所要引用的动态库文件“Oracle.DataAccess.dll”,点击确定导入动态库文件:
导入动态库后在程序代码中添加对数据库的引用就可以使用Oracle数据库开发工具了:
usingOracle.DataAccess.Client;usingOracle.DataAccess.Types;
数据库连接界面如下图所示:
由于疫情原因,实习在第20周周一到周五每日1-6节课期间在学生个人电脑上实现,可登陆自己安装的服务器,服务器IP如:
10.19.2.91样例,数据源:
orcl;用户名:
system;密码:
sa。
注意新建的所有数据库对象都要以自己的名字简写命名,还要注意与以前数据库中定义的名称相区别,避免数据库对象冲突。
如果冲突,请注意将使用完毕的数据库对象及时删除。
数据库连接代码示例如下,可供参考:
publicstaticMainFrmm_MainFrm;//=newMainFrm();
publicstaticOracleConnectionconn=newOracleConnection();publicstaticstringUserId;
publicstaticstringPassword;publicstaticstringDataSource;
privatevoidconnect_Click(objectsender,EventArgse)
{
录?
!
ê?
if(conn.State==ConnectionState.Closed)//判D断?
数ºy据Y库a是º?
否¤?
已°?
登Ì?
{
UserId=m_userID.Text.Trim();Password=m_password.Text.Trim();
stringhostname=textBoxHostName.Text.Trim();
DataSource="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=
TCP)(HOST="+hostname+")(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME="+
m_datasource.Text.Trim()+")))";
conn.ConnectionString="UserId="+m_userID.Text.Trim()+";Password="
+m_password.Text.Trim()+";DataSource="+DataSource+";";/
}
3.完成“2Day+.NETDeveloper'sGuide,11gRelease1.pdf”文件中非空间数据库的相关使用方法(讲解的部分);利用数据库设计界面创建一个表(COLA_MARKETS)来保存空间数据;
a.数据库变量定义:
privateOracleCommandocmd;//DataGridView控?
件t显?
示º?
内¨²容¨YprivateOracleDataAdapterda;
privateDataSetds;
privateOracleCommandBuildercb;
b.选择语句的使用:
try
{
stringsqlstr="select*fromSYSTEM.PROJTREE_TABLE";ocmd=newOracleCommand(sqlstr,LogDatabaseFrm.conn);ocmd.CommandType=CommandType.Text;
da=newOracleDataAdapter(ocmd);ds=newDataSet();
da.Fill(ds);
//加入自己操作数据库中数据的代码:
ds.Dispose();
da.Dispose();ocmd.Dispose();
TState.Text="软¨¨ª件t准Á?
备À?
完ª¨º毕À?
......";
}
catch(Exceptionex)
{
TState.Text=ex.Message.ToString();MessageBox.Show(ex.Message.ToString());
}
4.将4个多边形(cola_a,cola_b,cola_c,cola_d)的空间数据插入到COLA_MARKETS表中;
数据插入方法示例(重点:
注意输入参数的写法):
try
{//插?
入¨?
数ºy据Y库a记?
录?
Stringblock="BEGIN"+
"insertintoSYSTEM.PROJTREE_TABLE(CURRENTID,NAME,PARENTID)
VALUES(:
1,:
2,:
3);"+
"commit;"+"END;";
ocmd=newOracleCommand();ocmd.CommandText=block;
if(LogDatabaseFrm.conn.State==ConnectionState.Closed)//判D断?
数ºy据Y
库a是º?
否¤?
已°?
登Ì?
录?
!
ê?
{
MessageBox.Show("请?
先¨¨登Ì?
录?
数ºy据Y库a.");return;
}
ocmd.Connection=LogDatabaseFrm.conn;ocmd.CommandType=CommandType.Text;
//BindtheparameterasOracleDbType.BlobtocommandforinsertingimageOracleParameterparam1=ocmd.Parameters.Add("CURRENTIDtodb",
OracleDbType.Int32);
param1.Direction=ParameterDirection.Input;
//AssignByteArraytoOracleParameterparam1.Value=int.Parse(tmp.Tag.ToString());
OracleParameterparam2=ocmd.Parameters.Add("NAMEtodb",OracleDbType.Varchar2);
param2.Direction=ParameterDirection.Input;param2.Value=tmp.Text;
OracleParameterparam3=ocmd.Parameters.Add("PARENTIDtodb",OracleDbType.Int32);
param3.Direction=ParameterDirection.Input;param3.Value=int.Parse(selectednode.Tag.ToString());
ocmd.ExecuteNonQuery();
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message.ToString());
}
5.通过USER_SDO_GEOM_METADATA视图将COLA_MARKETS的空间属
性列加入到空间元数据表中;
学习:
一段SQL语句在C#中的写法:
StringDeleteSQL="DECLARE"+
"v_PCIDNUMBER:
=0;"+"BEGIN"+
"deletefromSYSTEM.PROJTREE_TABLEwhereCURRENTID=:
1;"+"commit;"+
"selecto.PTXDATA.PC_IDintov_PCIDfromSYSTEM.RANGEIMAGE_TABLEowhereo.PROJINFORID=:
1ANDo.PROJINFORNAME=:
2;"+
"deletefromSYSTEM.RIBLK_TABLEwhereOBJ_ID=v_PCID;"+"deletefromSYSTEM.RANGEIMAGE_TABLEwherePROJINFORID=:
1AND
PROJINFORNAME=:
2;"+
"commit;"+"END;";
ocmd=newOracleCommand();ocmd.CommandText=DeleteSQL;
if(LogDatabaseFrm.conn.State==ConnectionState.Closed)//判D断?
数ºy
据Y库a是º?
否¤?
已°?
登Ì?
录?
!
ê?
{
MessageBox.Show("请?
先¨¨登Ì?
录?
数ºy据Y库a.");return;
//LogDatabaseDlg.conn.Open();
}
OracleDbType.Int32);
ocmd.Connection=LogDatabaseFrm.conn;ocmd.CommandType=CommandType.Text;
OracleParameterparam1=ocmd.Parameters.Add("CURRENTIDtodb",
param1.Direction=ParameterDirection.Input;
param1.Value=TreeNodeID;//int.Parse(selectednode.Tag.ToString());OracleParameterparam2=ocmd.Parameters.Add("PROJINFORNAMEtodb",
OracleDbType.Varchar2);
param2.Direction=ParameterDirection.Input;param2.Value=TreeNodeName;
ocmd.ExecuteNonQuery();
6.创建COLA_MARKETS表的空间索引COLA_SPATIAL_IDX,并学习利用c#程序读取空间数据的方法,空间数据字段读取参考如下示例:
stringsql=//"BEGIN"+
"SELECTb.PTXDATA.PC_ID,b.PTXDATA.PC_EXTENT"+
"fromRangeImage_tablebWHEREb.PROJINFORID="+id;//+"'ANDb.NAME='"+riname+"'";//+";"+
//"END;";
OracleCommandcmd=newOracleCommand(sql,LogDatabaseFrm.conn);cmd.CommandType=CommandType.Text;
OracleDataReaderreader=cmd.ExecuteReader();while(reader.Read())
{
stringz_PC_ID=reader.GetValue(0).ToString();
SdoGeometryp;
if(reader.IsDBNull
(1))
p=SdoGeometry.Null;
else
p=(SdoGeometry)reader.GetValue
(1);
MBV3Dz_MBV3D=newMBV3D();
z_MBV3D.min.dx=p._ordinates[0];z_MBV3D.min.dy=p._ordinates[1];z_MBV3D.min.dz=p._ordinates[2];
z_MBV3D.max.dx=p._ordinates[3];z_MBV3D.max.dy=p._ordinates[4];z_MBV3D.max.dz=p._ordinates[5];
MainFrm.MBVBlockList.Add(z_MBV3D);
…….
7.完成下列查询,查询条件输入需要自行设计界面,查询结果显示在文本控件或其他可行的控件中,注意对比单纯利用SQL语言写代码的异同:
(1)查询cola_a和cola_c相交的部分;
(2)查询cola_b和cola_d是否相交;
(3)查询cola_a,cola_b,cola_c,cola_d的面积;
(4)查询cola_b和cola_d之间的距离;
(5)检查cola_a,cola_b,cola_c,cola_d的有效性。
提示:
1.
(1)-(5)的操作可参考OracleSpatialUser’sGuideandReference
的2-2开始的相关说明;
2.对(5)的更详细的信息可参照OracleSpatialUser’sGuideandReference的11-46开始的相关说明。
3.OracleSpatial中空间数据类型在c#编程环境中的映射方法:
publicclassSdoPoint:
IOracleCustomType,INullable
{
[OracleObjectMapping(0)]publicfloatX;[OracleObjectMapping
(1)]publicfloatY;[OracleObjectMapping
(2)]publicfloatZ;
privateboolm_bIsNull;publicboolIsNull
{
get
{
}
}
returnm_bIsNull;
publicstaticSdoPointNull
{
get
{
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 空间数据库 空间 数据库 实习 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)