
目前,采用数据库管理空间数据已经成为主流技术,其优点在于能够实现空间数据与属性数据的无缝集成,这种数据库也称为空间数据库。空间数据库利用数据库的管理机制可以保证空间数据的完整性和安全性,对空间数据进行备份和恢复以及控制用户的并发访问等。
Oracle的空间数据选件(Oracle Spatial)可以把复杂的地图对象(包括空间数据和属性数据)存入一个表中,同时建立空间数据索引,从而实现空间数据和属性数据的一体化存储和管理。Oracle Spatial还提供空间算子,结合SQL语句实现对空间数据的查询和其它复杂空间分析。
MapX是MapInfo公司的地图控件,用户可以在自己的程序中引入MapX控件,实现带地图功能的应用,同时可以选择用户熟悉的开发工具,如VB、VC、PowerBuilder、Delphi等。
用MapX访问Oracle的空间数据是通过Oracle提供给Mapinfo的底层数据库接口OCI(Oracle Call Interface)。
Mapinfo提供EasyLoader工具,用来将用户制作的Mapinfo地图数据上载到Oracle数据库中。如果将来地图数据发生了变更,也只需要通过EasyLoader的刷新表功能,即可将发生变化的地图数据在Oracle数据库中更新。
摘 要:采用数据库管理空间数据是当前的发展趋势,文中总结了Oracle数据库中空间数据的上载和存储机制,探讨了应用程序对Oracle数据库中空间数据的访问,并给出应用实例。
关键词:空间数据库;Oracle数据库;MapX
中图分类号:TP311;P2853文献标识码:A
Accessing Spatial Data in Oracle Using MapXAbstract:Spatial data managed by database is development trend currently This paper summarizes spatial data uploaded to Oracle database and its storage,discusses accessing spatial data in Oracle database and gives an application instance
Key words:spatial database;Oracle database;MapX本文着重探讨用VC、MapX开发带地图的应用程序,Oracle中空间数据的存储和管理以及如何在应用程序中访问存储Oracle中的空间数据。工作环境如下:Visual C++ 60,Mapinfo65,MapX45,EasyLoader for Oracle 81116,Oracle81116。Mapinfo65用来进行地图的编辑和属性数据的编辑,EasyLoader for Oracle816将地图数据上载到Oracle中,Visual C++60与MapX45相结合开发实现Oracle中空间数据访问的应用程序。
1 空间数据的准备和管理
11 空间数据存储的配置
首先创建数据库,然后进行空间数据存储的配置,主要涉及以下两个方面的配置:
1)为存储空间数据创建新的表空间
每个Oracle的数据库至少有一个SYSTEM表空间,为了提高运行效率和管理的需要,最好使用其他表空间来划分用户和应用程序,因此为访问空间数据的用户和应用程序创建新的表空间,设表空间名为GISTEST,并配置GISTEST的初始大小、增量大小等参数。
2)创建有权访问空间数据的用户
Oracle中可以为用户设定特定的表空间作为他的缺省表空间,创建用户GISTESTuser的缺省表空间为GISTEST,则该用户便具有访问空间数据的权利,同时还要为用户GISTESTuser设定合适的角色、系统权限和对象权限。
12 Mapinfo地图的上载
地图用Mapinfo编辑完成,再用EasyLoader forOracle81116将编辑好的Mapinfo的地图上载到Oracle中。要将地图上载到GISTEST表空间中,需要以用户GISTESTuser的身份登录到Oracle。通过Oracle的身份验证后,才可以上载Map-info地图。第一次上载Mapinfo地图到Oracle时,EasyLoader会自动创建一个名为mapinfo的用户,该用户的缺省口令为逗mapinfo地,缺省表空间和临时表空间都是SYSTEM,同时会在该用户下创建一个名为MAPINFO-MAPCATALOG的表,这个表用来记录所有上载到Oracle中的Mapinfo地图的信息,如:地图的存储和索引形式、地图的名称、地图的所有者、存储地图空间数据的列名、地图的坐标系、地图的边界、地图中点线面的样式信息等。
13 Mapinfo地图在Oracle中的存储和管理方式Oracle为管理空间数据提供了对象管理模式SDO(Spatial Data Object),同时提供优秀的空间索引机制。
MDSYS是Oracle Spatial的管理用户,MDSYS方案规定几何数据的存储方式、语法形式和语义。MDSYS方案中,表SDOGEOM-METADATA-TABLE存储所有上载到Oracle中的Mapinfo地图的信息,表SDO-INDEX-METADATA-TABLE存储与索引相关的信息,如:被索引的列名,索引的方式,索引的级别,索引的所有者等。MDSYS方案中还有与空间数据及其索引相关的视图:ALL-SDO-GEOM-METADATA,ALL-SDO-INDEXMETA DATA,DBA-SDO-GEOM-METADATA,DBA-SDO-INDEXMET ADATA,USER-SDO-GEOM-METADATA,USER-SDOINDEX-METADATA。
上载到Oracle中的每一个地图由两个表表示,一个是与该地图空间索引方式相关的表,叫做索引表,另一个用来存储地图属性数据和空间数据,叫数据表。例如:一个名为ShangHaiMap的地图上载到Oracle,创建两个表:数据表ShangHaiMap和索引表ShangHaiMap-SX-FL6$。Oracle为了有效的管理和存储Mapinfo地图,在数据表ShangHaiMap中新增加两列:一列是类型为NUMBER的逗MI-PRINX地,它是唯一性索引字段,一列是类型为SDO-GEOMETRY的逗GEOLOC地,用来存储空间数据。SDO-GEOMETRY是Oracle中存储地图数据的空间数据类型。
2 应用程序的开发
在VC下,引入MapX控件开发带地图的应用程序。MapX控件一般自动打开在系统中注册的缺省GST文件,其路径位于注册表HKEY-LOCAL-MACHINE\Software\MapInfo\MapX\40下,注册键SearchPaths下是缺省的数据目录,定位3gst文件。3gst文件是MapX可以访问的地图文件,由MapX的实用程序GeoSet Manager创建,它是将多个Mapinfo的地图文件(3tab)集中在一起,这样打开一个3gst文件,即可将一个包含多层的地图打开。此外还有注册键GeoDicionary,用来定位3dct文件。3dct文件由MapX的另一个实用程序Geodictionary Manager生成,Geodictionary Manager默认的3dct文件为自带的GeoDictdct,用户可以根据需要,建立自己的3dct文件。
应用程序采用客户/服务器结构,通过OCI接口,实现应用程序对Oracle中空间数据的访问,如图1所示。
MapX应用程序结构
21 应用程序开发中的关键技术
在VC的工程项目中加入MapXcpp和MapXh两个文件,这两个文件中定义了有关MapX控件的类和访问方法。开发过程中,有如下几个关键技术:
1)访问用户自己的GST文件
在应用程序中,如果用户要访问自己的GST文件,改变MapX控件缺省打开的3gst文件,就必须对类CMapX进行设置,指定要打开的3gst文件。方法如下:
CMapX m_MapX;
//指明用户要访问的GST文件替代缺省设置
m-MapXSetGeoSet("\roads\roadsgst");
2)访问Oracle空间数据库
MapX控件有两种方式访问Oracle中的空间数据,一种为ODBC方式,一种为OCI方式。ODBC方式的缺点是通用接口,速度慢,需要配置数据源DNS。OCI方式的优点是底层接口,速度快。现以OCI方式实现在应用程序中与Oracle的连接并访问Oracle中的空间数据。
通过OCI访问空间数据相当于从服务器端下载相关的空间数据,并在客户端进行显示。客户端显示空间数据的方式就是在原有地图上增加一层新的地图,而与图层相关的类为CmapX2LayerInfo,有两个重要的方法SetType()和AddParameter()。前者用来设置图层的类型,后者为连接数据库设置参数。
图2所示为连接Oracle空间数据库的流程。
连接Oracle空间数据库的流程图
类CmapXLayerInfo是类ColeDispatchDriv2er的继承类,创建类CmapXLayerInfo的方法,即为创建新图层的方法。方法如下:
CMapXLayerInfo LayerInfoObject;
if (!LayerInfoObjectCreateDispatch(LayerInfoObjectGetClsid())){
TRACE0("Failed to Createobject");
return;
}
图层类型为miLayerInfoTypeServer时,连接Oracle数据库需要设置连接字符串、连接方式、是否设置缓存、是否设置最小边界矩形查询、新建图层名称、查询空间数据的SQL语句等参数。下面给出设置连接字符串的VC语句。
VARIANT s;
CString str;
str="SRVR=GISTEST;UID=GISTESTuser;PWD=GISTESTuser";svt = VT-BSTR;
sbstrVal = strAllocSysString();
LayerInfoObjectAddParameter("CONNECTSTRING",s);查询结果的显示通过类CmapXLayers的Add()方法实现,具体示例如下:
m_MapXGetLayers()Add(LayerInfoObject,1);3)Oracle Spatial的空间函数
Oracle Spatial提供了适合于空间数据 *** 作的空间函数,如比较常用的用于相交查询的SDO-FILTER,SDORELATE,SDO-WITHIN-DISTANCE;用于缓冲区分析的SDO-GEOMSDO-BUFFER;用于面积、长度计算函数的SDO-GEOMAREA,SDO-GEOMLENGTH等。下面给出用于面积计算的SQL语句示例:
update aTable set aTableAREA=
mdsyssdo-geomsdo-area(GEOLOC,(select sdo-diminfofrom mdsyssdo-geom-metadata-table where sdo-geommetadata-tablesdo-table-name = 'aTable' and sdo-geommetadata-tablesdo-column-name= 'GEOLOC'))
其中aTable表示一个空间数据表,它存储空间数据的列名为逗GEOLOC地,列AREA存放计算出的面积值,SDOAREA计算二维多边形的面积,并将计算结果存放到列AREA中保存。
22 应用程序示例
应用程序通过与空间数据库的接口来实现对数据库中存储的属性数据和空间数据的访问,同时根据实际情况的需要对数据进行查询,并用地图等直观的形式反应查询结果。
图3中的地图基本数据来源于北大方正MapInfo事业部,基于实验目的,增添了道路长度字段,并设定各个道路的长度,其查询SQL语句为:
SELECT 3 FROM Shanghai-thirdr
WHERE Shanghai-thirdrRoadLength > 10
基于道路长度属性的查询
文章只是对空间数据库的访问方面做了一些有益的探索,还有很多工作需要做。随着面向空间数据库的应用,基于空间数据库的空间数据挖掘以及将空间数据应用于各行各业的研究将会不断展开。
参考文献
[1] 本丛书编委会Oracle816管理员指南[M] 北京:北京希望电子出版社,2000
[2] 修文群,池天河,等 城市地理信息系统[M] 北京:北京希望电子出版社,1999
[3] Oracle8Oracle Spatial User's Guide and Reference Release 816[DB/CD]
Origin 软件在物理化学实验数据处理中的应用 物理化学实验中常见的数据处理有: ①公式计算; ②用实验数据作图或对实验数据计算后作图; ③线性拟合,求截距或斜率; ④非线性曲线拟合; ⑤作切线,求截距或斜率。目前学生多用坐标纸手工作图;手工拟合直线,求斜率或截距;手工作曲线和切线,求斜率或截距。这种手工作图的方法不仅费时费力,而且误差较大。本来实验数据就有一定的误差,加上数据处理带来的较大误差,可想而知,所得结果的误差就更大。随着计算机应用的深入发展,计算机作图软件越来越多。利用Origin 软件可方便地进行作图、线性拟合、非线性曲线拟合等数据处理,能够满足物化实验数据处理的要求。下面介绍用Origin 软件对物化实验数据处理的方法。1Origin 软件的一般用法1 1数据作图Origin 可绘制散点图、点线图、柱形图、条形图或饼图以及双Y轴图形等,在物化实验中通常使用散点图或点线图。Origin 有如下基本功能: ①输入数据并作图, ②将数据计算后作图, ③数据排序, ④选择需要的数据范围作图, ⑤数据点屏蔽。1 2线性拟合当绘出散点图或点线图后,选择Analysis 菜单中的Fit Linear 或Tools 菜单中的Linear Fit ,即可对图形进行线性拟合。结果记录中显示拟合直线的公式、斜率和截距的值及其误差,相关系数和标准偏差等数据。在线性拟合时,可屏蔽某些偏差较大的数据点,以降低拟合直线的偏差。1 3非线性曲线拟合Origin 提供了多种非线性曲线拟合方式: ①在Analysis 菜单中提供了如下拟合函数:多项式拟合、指数衰减拟合、指数增长拟合、S 形拟合、Gaussian 拟合、Lorentzian 拟合和多峰拟合;在Tools 菜单中提供了多项式拟合和S 形拟合。②在Analysis 菜单中的Non2linear Curve Fit 选项提供了许多拟合函数的公式和图形。③Analysis 菜单中的Non2linear Curve Fit 选项可让用户自定义函数。在处理实验数据时,可根据数据图形的形状和趋势选择合适的函数和参数,以达到最佳拟合效果。多项式拟合适用于多种曲线,且方便易行, *** 作如下:(1) 对数据作散点图或点线图。(2) 选择Analysis 菜单中的Fit Polynomial 或Tools 菜单中的Polynomial Fit ,打开多项式拟合对话框,设定多项式的级数、拟合曲线的点数、拟合曲线中X 的范围。(3) 点击OK或Fit 即可完成多项式拟合。结果记录中显示:拟合的多项式公式、参数的值及其误差, R2 (相关系数的平方) 、SD (标准偏差) 、N (曲线数据的点数) 、P 值( R2 = 0 的概率)等。
先花点时间来说说一个程序怎么和数据库进行交互
1和数据库建立连接
2执行sql语句,接收返回值
3关闭数据库连接
使用MySQLdb也要遵循上面的几步让我们一步步的进行
1、MySQL数据库要用MySQLdb模块,但Python用来链接MySQL的第三方库MySQLdb不支持Python3x
特别说明:我在我的电脑上实验时,我的python是272版本,安装对应版本的MySQLdb之后直接可以运行,并与数据库连接成功,所以如果大家
也像我一样顺利的话,下面的就不需要看了,直接跳过,看第2点如何执行sql语句即可!如果安装之后出现异常,可以参考一下下面的解决办法。
连接的关键是安装MySQLdb模块要下载与Python相对应的版本:
下载好后安装,它会自动检测到计算机Python的安装路径,并自动填写模块解压路径(我的是:D:\ProgramFiles\ActivePython 26617\Lib\site-packages\)。
但解压完成后并不能使用,还要修改MySQLdb模块下的一些文件:
①在MySQLdb目录下(我的是:D:\ProgramFiles\ActivePython 26617\Lib\site-packages\MySQLdb)找到__init__py:
注释第34、35行的from setsimport ImmutableSet、class DBAPISet(ImmutableSet):,在后面添加class DBAPISet(frozenset):
# from sets import ImmutableSet
# class DBAPISet(ImmutableSet):
class DBAPISet(frozenset):
②打开converterspy:
注释第37行的from sets import BaseSet, Set,将第45行的return Set([ i for i in
ssplit(',') ifi ])中的Set改为set;同样将第129行的Set:
Set2Str,中的Set改为set(不要修改Set2Str),到这里就修改完毕了
2建立数据库连接
import MySQLdb
conn=MySQLdbconnect(host="localhost",user="root",passwd="sa",db="mytable")
比较常用的参数包括
host: 连接的数据库服务器主机名,默认为本地主机(localhost)。
user:数据库登陆名默认是当前用户
passwd:数据库登陆的秘密默认为空
db:要使用的数据库名没有默认值
port:MySQL服务使用的TCP端口默认是3306
conn连接有两个重要的方法commit提交新增和修改,rollback撤销新增或修改
3、执行数据库 *** 作
n=cursorexecute(sql,param)
我们要使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作
这些方法包括两大类:1执行命令,2接收返回值
cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集
cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行
fetchmany(self, size=None):接收size条返回结果行如果size的值大于返回的结果行的数量,则会返回cursorarraysize条数据
fetchone(self):返回一条结果行
scroll(self, value, mode='relative'):移动指针到某一行如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条
下面的代码是一个完整的例子
#使用sql语句,这里要接收的参数都用%s占位符要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
sql="insert into cdinfo values(%s,%s,%s,%s,%s)"
#param应该为tuple或者list
param=(title,singer,imgurl,url,alpha)
#执行,如果成功,n的值为1
n=cursorexecute(sql,param)
#再来执行一个查询的 *** 作
cursorexecute("select from cdinfo")
#我们使用了fetchall这个方法这样,cds里保存的将会是查询返回的全部结果每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple
cds=cursorfetchall()
#因为是tuple,所以可以这样使用结果集
print cds[0][3]
#或者直接显示出来,看看结果集的真实样子
print cds
#如果需要批量的插入数据,就这样做
sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"
#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list
param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
#使用executemany方法来批量的插入数据这真是一个很酷的方法!
n=cursorexecutemany(sql,param)
需要注意的是(或者说是我感到奇怪的是),在执行完插入或删除或修改 *** 作后,需要调用一下
conncommit()方法进行提交这样,数据才会真正保存在数据库中我不清楚是否是我的mysql设置问题,总之,今天我在一开始使用的时候,
如果不用commit,那数据就不会保留在数据库中,但是,数据确实在数据库呆过因为自动编号进行了累积,而且返回的受影响的行数并不为0
4、关闭数据库连接
需要分别的关闭指针对象和连接对象他们有名字相同的方法
cursorclose()
connclose()
5、
5 编码(防止乱码)
需要注意的点:
1 Python文件设置编码 utf-8 (文件前面加上 #encoding=utf-8)
2 MySQL数据库charset=utf-8
3 Python连接MySQL是加上参数 charset=utf8
4 设置Python的默认编码为 utf-8 (syssetdefaultencoding(utf-8)
#encoding=utf-8 import sys import MySQLdb reload(sys) syssetdefaultencoding('utf-8') db=MySQLdbconnect(user='root',charset='utf8')
注:MySQL的配置文件设置也必须配置成utf8
6模块功能演示
#!/usr/bin/python
import MySQLdb
Con= MySQLdbconnect(host='localhost',user='root',passwd='root',db='abc')
cursor =concursor()
sql ="select from myt"
cursorexecute(sql)
row=cursorfetchone()
print row
cursorclose()
conclose()
执行以下SQL语句获取返回值:
//获取连接的游标
cursor=conncursor()
//查询
sql = "select from table"
//新增
sql = "insert into table(字段,字段) values(值,值)"
//修改
sql = "update table set 字段 =‘值’where 条件 "
//删除
sql = "delete from tablewhere 条件"
cursorexecute(sql)
返回值
curexecute('select from tables')
其返回值为SQL语句得到的行数,如:2L,表示2行。
然后,可以从该对象的fetchone或fetchall方法得到行信息。
获取行信息
指针对象的fetchone()方法,是每次得到一行的tuple返回值:
引用
>>> row=curfetchone()
>>> print row
('user1', '52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L, '/home/FTP/user1','')
指针对象的fetchall()方法,可取出指针结果集中的所有行,返回的结果集一个元组(tuples):
引用
>>> curscroll(0,'absolute')
>>> row=curfetchall()
>>> print row
(('user1', '52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L,
'/home/FTP/user1',''), ('user2', '7e58d63b60197ceb55a1c487989a3720',
1000L, 1000L,'/home/FTP/user2', None))
移动指针
当使用fetchone()方法是,指针是会发生移动的。所以,若不重置指针,那么使用fetchall的信息将只会包含指针后面的行内容。
手动移动指针使用:
curscroll(int,parm)
含义为:
引用
int:移动的行数,整数;在相对模式下,正数向下移动,负值表示向上移动。
parm:移动的模式,默认是relative,相对模式;可接受absoulte,绝对模式。
修改数据
修改数据,包括插入、更新、删除。它们都是使用指针对象的execute()方法执行:
curexecute("insert into table (row1, row2) values ('111', '222')")
curexecute("update table set row1 = 'test' where row2 = 'row2' ")
curexecute("delete from table where row1 = 'row1' ")
因单引号“'”用于SQL语句中的标识,所以,python中的字符串需使用双引号括住。
此外,也可以使用python的“格式化字符串”写法,简化命令,例如:
curexecute("update table set row1 = '%s' where row2 = '%s' "%('value1','value2'))
※请注意,'%s'的单引号是SQL语句的间隔符,'value1'的单引号是python的字符串间隔符,其含义是不同的。是否需要间隔符,以及使用双引号还是单引号作为间隔,需根据其含义决定。例如,还有:
curexecute("update FTPUSERS set passwd=%s where userid='%s' "%("md5('123')",'user2'))
这里,paswd=%s是因SQL的md5()函数是不需要单引号间隔的;"md5('123')"是python的字符串中含有单引号,所以用双引号括住。
提交修改
一般情况下,MySQLdb模块会自动提交修改。但我们在更新数据后,手动运行一次:
conncommit()
关闭数据库连接
需要分别的关闭指针对象和连接对象他们有名字相同的方法
cursorclose()
connclose()
以上就是关于Oracle空间 *** 作函数SDO_RELATE和SDO_GEOM.RELATE的关系和区别是什么全部的内容,包括:Oracle空间 *** 作函数SDO_RELATE和SDO_GEOM.RELATE的关系和区别是什么、物理化学中数据的处理、如何用python实现对数据库的整理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)