空间数据库操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
测 绘 学 院
Table Roads
测
绘
学
院
河流表 River
create table rivers( rname varchar2(64), geometry mdsys.sdo_geometry); insert into user_sdo_geom_metadata values( 'rivers','geometry', mdsys.sdo_dim_array( mdsys.sdo_dim_element('X',0,100,0.05), mdsys.sdo_dim_element('Y',0,100,0.05)),8307); create index rivers_spatial_idx on rivers(geometry) indextype is mdsys.spatial_index; insert into rivers(rname,geometry) values ('Yangtze River',mdsys.sdo_geometry(2002,8307,null, mdsys.sdo_elem_info_array(1,2,1), mdsys.sdo_ordinate_array(8,8,9,10,15,15)));
OO4O介绍 准备: 1. 首先要安装Oralce数据库客户端,
2. 并安装了本地Oracle数据库 或者有远程数据库 服务 3. 已知用户名称和用户密码
219.140.160.67/polardb gis/gis2006
测 绘 学 院
基于OO4O的Oracle Spatial接口程序实现
测
绘
学
院
sdoGeo.Open(m_database,"MDSYS.SDO_GEOMETRY"); gElem.Open(m_database,"MDSYS.SDO_ELEM_INFO_ARRAY"); gCood.Open(m_database,"MDSYS.SDO_ORDINATE_ARRAY"); sdoGeo.SetAttrValue("SDO_GTYPE",2002); //默认为简单线段 sdoGeo.SetAttrValue("SDO_SRID",8307); //坐标系WGS-84 gElem.SetValue(1,1); //设置简单线段的三元组 gElem.SetValue(2,2);
OObject gPointType; // 点类型
OCollection gElem; OCollection gCood;
测
绘
学
院
dyn.GetFieldValue(fieldName,&sdoGeo); fieldName为SDO_GEOMETRY类型
// 获取几何信息,
sdoGeo.GetAttrValue(1,&m_nGeomType); // 获取几何类型 sdoGeo.GetAttrValue(2,&m_nSRID); sdoGeo.GetAttrValue(3,&gPointType); // 获取坐标系信息 // 获取点信息
diminfo.GetAttrValue(4,&elem); //获取几何精度值
测
绘
学
院
当字段的类型为SDO_GEOMETRY时表示这个字段存储了 空间信息,我们可以通过对该字段的解析,获取Oracle Spatial存储的空间数据。
OObject sdoGeo; // 几何信息 // 坐标系信息 // 空间坐标信息 // 坐标值 OValue m_nGeomType; // 几何类型 OValue m_nSRID;
dInfo.GetValue(1,&diminfo);
OValue elem;
// 获取第一维信息
diminfo.GetAttrValue(1,&elem); //获取维数名称 diminfo.GetAttrValue(2,&elem); //获取该维的左下角数据 diminfo.GetAttrValue(3,&elem); //获取该维的右上角数据
ORACLM32.lib, ORACLM32.DLL, ORACL.H
数据库的连接
要对Oracle Spatial进行操作,首先需要建立与Oracle 数据库的 连接,可以用以下语句完成对数据库的连接工作。 ODatabase m_database; OSession m_session; // 定义数据库对象 // 定义oo4o会话句柄
测
绘
学
院
增加数据记录
insert into roads(rname,geometry) values ('luoyu road', mdsys.sdo_geometry( 2002, 8307, null, mdsys.sdo_elem_info_array(1,2,1), mdsys.sdo_ordinate_array(10,10,10,15,15 ,15)) );
Oracle Spatial简介
Oracle Spatial是Oracle公司推出的空间数据 库组件,通过Oracle数据库系统存储和管理 空间数据。 Oracle从9i开始对空间数据提供 了较为完备的支持。 由于Oracle Spatial本身是ORACLE数据库的 一个特殊的部分,因此可以用ORACLE提 供的程序接口来对Oracle Spatial管理的空间 数据进行操作。目前,ORACLE数据库主 要提供两种接口方式对其数据进行存取:
测 绘 学 院
Table River
测
绘
学
院
y
空间示意图
Yellow River (5,15) Luoyu road (15,15)
15
12
Jianghan road
(10,10) Yangtze River
4
Luoyu Road
Jiefang road
Yellow River Jianghan Road Yangtze River Jiefang Road
m_session.Open(); // 打开一个会话 m_database.Open(m_session, dbaseName, userName, password) ; // 建立数据库连接, dbaseName是数据库名称
测 绘 学 院
从Oracle Spatial中获取空间数据
与空间数据表相关的信息都存储在元数据表 MDSYS.SDO_GEOM_METADATA_TABLE中,获取 元数据表信息的语句为: ODynaset dyn; // 定义结果集对象
dyn.Open(m_database, "select SDO_OWNER, SDO_TABLE_NAME, SDO_COLUMN_NAME, SDO_DIMINFO from MDSYS.SDO_GEOM_METADATA_TABLE");
测
绘
学
院
其中SDO_OWNER为空间数据表所属的用户名称, SDO_TABLE_NAME为空间数据表名称, SDO_COLUMN_NAME为空间字段名称,SDO_DIMINFO为维 数信息。对于每一条记录,可以采用如下语句获取相关的数据:
)
)
测 绘 学 院
Oracle Spatial Infrastructure
Oracle Spatial主要通过空间数据字段(即 SDO_GEOMETRY字段) 、元数据表和空 间索引来管理空间数据,并在此基础上提 供一系列空间查询和空间分析的函数,让 用户进行更深层次的GIS应用开发。
spatial_index USER_SDO_GEOM_METADATA
SDO_GEOMETRY
SDO_GEOMETRY
测 绘 学 院
•例子
创建一个含有空间数据字段的表:
道路表 roads
create table roads(
rname varchar2(64), geometry mdsys.sdo_geometry
);
测 绘 学 院
元数据注册
insert into user_sdo_geom_metadata values( 'roads', 'geometry', mdsys.sdo_dim_array( mdsys.sdo_dim_element('X',0,100,0.05), mdsys.sdo_dim_element('Y',0,100,0.05)) , 8307);
(0,0)
测
x
绘 学 院
Oracle Spatial空间索引技术
Oracle Spatial 提供了 R 树索引和四叉树索引两种 索引机制来提高空间查询和空间分析的速度。用 户需要根据空间数据的不同类型创建不同的索引, 当空间数据类型比较复杂时,如果选择索引类型 不当,将使Oracle Spatial创建索引的过程变得非 常慢。
OValue tName; //表名
OValue cName; //列名 OValue oName; //用户名称 OCollection dInfo; //维数信息 OObject diminfo; //用于解析维数信息的变量
dyn.GetFieldValue(0, &oName); // 获取用户名
安装Oracle客户端即可使用
测
绘
学
院
连接数据库的基本参数
Oracle Net Service Name/SID TCP/IP Host Name(IP) and Port User and Password
测
绘
学
院
Oracle9i\network\admin\tnsnames.ora
POLARDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.158.236)(PORT = 1521)) ) (CONNECT_DATA = (SID = polardb) (SERVER = DEDICATED)
dyn.GetFieldValue(1, &tName); // 获取元数据中的表名 dyn.GetFieldValue(2, &cName); // 获取元数据中的列名 dyn.GetFieldValue(3, &dInfo); // 获取维数信息和边界
测 绘 学 院
由于dInfo是一个对象集合,因此需要通过进一步解析才能得 到各个维数的信息,以获取第一维信息为例(第二、第三维信 息可以类推),则获取该维信息的语句为:
测
绘
学
院
创建空间索引 create index roads_spatial_idx on roads(geometry) indextype is mdsys.spatial_index;
空间分析检索
select t1.rname road,t2.rname river from gis.roads t1,gis.rivers t2 where mdsys.sdo_relate(t1.geometry,t2.geometry,'mas k=anyinteract querytype=window')='TRUE';
sdoGeo.GetAttrValue(4,&gElem);
// 获取空间坐标的存
// 获取坐标值
储信息
sdoGeo.GetAttrValue(5,&gCood); 对于gElem和gCood,我们同样需要使用GetAttrValue函数 进一步解析出具体的数据,通过gElem的三元组数据我们 可以得到各个几何实体的坐标值。
测 绘 学 院
将空间信息导入Oracle Spatial
将空间信息导入Oracle Spatial是上述过程的逆过程, 但是需要在建立空间数据表时首先判断是否有同名 的表,在将空间数据导入到Oracle Spatial后,需要 更新元数据表的信息,并且需要根据不同的空间数 据类型建立不同的空间索引。值得注意的是, Oracle Spatial的空间字段的坐标数组只能接受999个 坐标,简单的insert语句不能插入坐标超过999个的 数据,必须采用变量绑定的方法才能把大数据量的 坐标准确插入到Oracle Spatial中。
测 绘 学 院
两种方式
1. ORACLE提供的面向C语言程序员的编 程接口(Oracle Call Interface,简称OCI )百度文库
最新Oracle 10g Instant Client, 可以免费下载 http://www.oracle.com
2. ORACLE本身所提供的OLE对象 (Oracle Objects for OLE,简称OO4O )来快速访问有关数据库。
测
绘
学
院
空间位置的拓扑关系
TOUCH,
OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ANYINTERACT, ON.
测 绘 学 院
VC读写Oracle数据库
Table Roads
测
绘
学
院
河流表 River
create table rivers( rname varchar2(64), geometry mdsys.sdo_geometry); insert into user_sdo_geom_metadata values( 'rivers','geometry', mdsys.sdo_dim_array( mdsys.sdo_dim_element('X',0,100,0.05), mdsys.sdo_dim_element('Y',0,100,0.05)),8307); create index rivers_spatial_idx on rivers(geometry) indextype is mdsys.spatial_index; insert into rivers(rname,geometry) values ('Yangtze River',mdsys.sdo_geometry(2002,8307,null, mdsys.sdo_elem_info_array(1,2,1), mdsys.sdo_ordinate_array(8,8,9,10,15,15)));
OO4O介绍 准备: 1. 首先要安装Oralce数据库客户端,
2. 并安装了本地Oracle数据库 或者有远程数据库 服务 3. 已知用户名称和用户密码
219.140.160.67/polardb gis/gis2006
测 绘 学 院
基于OO4O的Oracle Spatial接口程序实现
测
绘
学
院
sdoGeo.Open(m_database,"MDSYS.SDO_GEOMETRY"); gElem.Open(m_database,"MDSYS.SDO_ELEM_INFO_ARRAY"); gCood.Open(m_database,"MDSYS.SDO_ORDINATE_ARRAY"); sdoGeo.SetAttrValue("SDO_GTYPE",2002); //默认为简单线段 sdoGeo.SetAttrValue("SDO_SRID",8307); //坐标系WGS-84 gElem.SetValue(1,1); //设置简单线段的三元组 gElem.SetValue(2,2);
OObject gPointType; // 点类型
OCollection gElem; OCollection gCood;
测
绘
学
院
dyn.GetFieldValue(fieldName,&sdoGeo); fieldName为SDO_GEOMETRY类型
// 获取几何信息,
sdoGeo.GetAttrValue(1,&m_nGeomType); // 获取几何类型 sdoGeo.GetAttrValue(2,&m_nSRID); sdoGeo.GetAttrValue(3,&gPointType); // 获取坐标系信息 // 获取点信息
diminfo.GetAttrValue(4,&elem); //获取几何精度值
测
绘
学
院
当字段的类型为SDO_GEOMETRY时表示这个字段存储了 空间信息,我们可以通过对该字段的解析,获取Oracle Spatial存储的空间数据。
OObject sdoGeo; // 几何信息 // 坐标系信息 // 空间坐标信息 // 坐标值 OValue m_nGeomType; // 几何类型 OValue m_nSRID;
dInfo.GetValue(1,&diminfo);
OValue elem;
// 获取第一维信息
diminfo.GetAttrValue(1,&elem); //获取维数名称 diminfo.GetAttrValue(2,&elem); //获取该维的左下角数据 diminfo.GetAttrValue(3,&elem); //获取该维的右上角数据
ORACLM32.lib, ORACLM32.DLL, ORACL.H
数据库的连接
要对Oracle Spatial进行操作,首先需要建立与Oracle 数据库的 连接,可以用以下语句完成对数据库的连接工作。 ODatabase m_database; OSession m_session; // 定义数据库对象 // 定义oo4o会话句柄
测
绘
学
院
增加数据记录
insert into roads(rname,geometry) values ('luoyu road', mdsys.sdo_geometry( 2002, 8307, null, mdsys.sdo_elem_info_array(1,2,1), mdsys.sdo_ordinate_array(10,10,10,15,15 ,15)) );
Oracle Spatial简介
Oracle Spatial是Oracle公司推出的空间数据 库组件,通过Oracle数据库系统存储和管理 空间数据。 Oracle从9i开始对空间数据提供 了较为完备的支持。 由于Oracle Spatial本身是ORACLE数据库的 一个特殊的部分,因此可以用ORACLE提 供的程序接口来对Oracle Spatial管理的空间 数据进行操作。目前,ORACLE数据库主 要提供两种接口方式对其数据进行存取:
测 绘 学 院
Table River
测
绘
学
院
y
空间示意图
Yellow River (5,15) Luoyu road (15,15)
15
12
Jianghan road
(10,10) Yangtze River
4
Luoyu Road
Jiefang road
Yellow River Jianghan Road Yangtze River Jiefang Road
m_session.Open(); // 打开一个会话 m_database.Open(m_session, dbaseName, userName, password) ; // 建立数据库连接, dbaseName是数据库名称
测 绘 学 院
从Oracle Spatial中获取空间数据
与空间数据表相关的信息都存储在元数据表 MDSYS.SDO_GEOM_METADATA_TABLE中,获取 元数据表信息的语句为: ODynaset dyn; // 定义结果集对象
dyn.Open(m_database, "select SDO_OWNER, SDO_TABLE_NAME, SDO_COLUMN_NAME, SDO_DIMINFO from MDSYS.SDO_GEOM_METADATA_TABLE");
测
绘
学
院
其中SDO_OWNER为空间数据表所属的用户名称, SDO_TABLE_NAME为空间数据表名称, SDO_COLUMN_NAME为空间字段名称,SDO_DIMINFO为维 数信息。对于每一条记录,可以采用如下语句获取相关的数据:
)
)
测 绘 学 院
Oracle Spatial Infrastructure
Oracle Spatial主要通过空间数据字段(即 SDO_GEOMETRY字段) 、元数据表和空 间索引来管理空间数据,并在此基础上提 供一系列空间查询和空间分析的函数,让 用户进行更深层次的GIS应用开发。
spatial_index USER_SDO_GEOM_METADATA
SDO_GEOMETRY
SDO_GEOMETRY
测 绘 学 院
•例子
创建一个含有空间数据字段的表:
道路表 roads
create table roads(
rname varchar2(64), geometry mdsys.sdo_geometry
);
测 绘 学 院
元数据注册
insert into user_sdo_geom_metadata values( 'roads', 'geometry', mdsys.sdo_dim_array( mdsys.sdo_dim_element('X',0,100,0.05), mdsys.sdo_dim_element('Y',0,100,0.05)) , 8307);
(0,0)
测
x
绘 学 院
Oracle Spatial空间索引技术
Oracle Spatial 提供了 R 树索引和四叉树索引两种 索引机制来提高空间查询和空间分析的速度。用 户需要根据空间数据的不同类型创建不同的索引, 当空间数据类型比较复杂时,如果选择索引类型 不当,将使Oracle Spatial创建索引的过程变得非 常慢。
OValue tName; //表名
OValue cName; //列名 OValue oName; //用户名称 OCollection dInfo; //维数信息 OObject diminfo; //用于解析维数信息的变量
dyn.GetFieldValue(0, &oName); // 获取用户名
安装Oracle客户端即可使用
测
绘
学
院
连接数据库的基本参数
Oracle Net Service Name/SID TCP/IP Host Name(IP) and Port User and Password
测
绘
学
院
Oracle9i\network\admin\tnsnames.ora
POLARDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.158.236)(PORT = 1521)) ) (CONNECT_DATA = (SID = polardb) (SERVER = DEDICATED)
dyn.GetFieldValue(1, &tName); // 获取元数据中的表名 dyn.GetFieldValue(2, &cName); // 获取元数据中的列名 dyn.GetFieldValue(3, &dInfo); // 获取维数信息和边界
测 绘 学 院
由于dInfo是一个对象集合,因此需要通过进一步解析才能得 到各个维数的信息,以获取第一维信息为例(第二、第三维信 息可以类推),则获取该维信息的语句为:
测
绘
学
院
创建空间索引 create index roads_spatial_idx on roads(geometry) indextype is mdsys.spatial_index;
空间分析检索
select t1.rname road,t2.rname river from gis.roads t1,gis.rivers t2 where mdsys.sdo_relate(t1.geometry,t2.geometry,'mas k=anyinteract querytype=window')='TRUE';
sdoGeo.GetAttrValue(4,&gElem);
// 获取空间坐标的存
// 获取坐标值
储信息
sdoGeo.GetAttrValue(5,&gCood); 对于gElem和gCood,我们同样需要使用GetAttrValue函数 进一步解析出具体的数据,通过gElem的三元组数据我们 可以得到各个几何实体的坐标值。
测 绘 学 院
将空间信息导入Oracle Spatial
将空间信息导入Oracle Spatial是上述过程的逆过程, 但是需要在建立空间数据表时首先判断是否有同名 的表,在将空间数据导入到Oracle Spatial后,需要 更新元数据表的信息,并且需要根据不同的空间数 据类型建立不同的空间索引。值得注意的是, Oracle Spatial的空间字段的坐标数组只能接受999个 坐标,简单的insert语句不能插入坐标超过999个的 数据,必须采用变量绑定的方法才能把大数据量的 坐标准确插入到Oracle Spatial中。
测 绘 学 院
两种方式
1. ORACLE提供的面向C语言程序员的编 程接口(Oracle Call Interface,简称OCI )百度文库
最新Oracle 10g Instant Client, 可以免费下载 http://www.oracle.com
2. ORACLE本身所提供的OLE对象 (Oracle Objects for OLE,简称OO4O )来快速访问有关数据库。
测
绘
学
院
空间位置的拓扑关系
TOUCH,
OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT, EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS, ANYINTERACT, ON.
测 绘 学 院
VC读写Oracle数据库