空间数据库课程设计报告第五章.docx
《空间数据库课程设计报告第五章.docx》由会员分享,可在线阅读,更多相关《空间数据库课程设计报告第五章.docx(27页珍藏版)》请在冰豆网上搜索。
空间数据库课程设计报告第五章
第5章空间数据的加载、传输和验证
一、向SDO_GEOMETRY列中插入数据
新建一个sales_regions表,向表中插入一个多边形几何体,运用前面学过的SDO_GEOMETRY数据类型。
SQL语句如下:
程序5—1
CREATETABLEsales_regions
(
idNUMBER,
geomSDO_GEOMETRY
);
把表示销售区域的多边形插入到这表中的geom列中,SQL语句如下:
程序5-2
INSERTINTOsales_regionsVALUES
(
10000,--SALES_REGIONSID
SDO_GEOMETRY--usetheSDO_GEOMETRYconstructor
(
2003,--Atwo-dimensionalPolygon
8307,--SRIDisGEODETIC
NULL,--SDO_POINT_TYPEisnullasitisnotapoint
SDO_ELEM_INFO_ARRAY(1,1003,1),--Apolygonwithjustonering
SDO_ORDINATE_ARRAY--SDO_ORDINATESfield
(
-77.04487,38.9043742,--coordinatesoffirstvertex
-77.046645,38.9040983,--othervertices
-77.04815,38.9033127,-77.049155,38.9021368,
-77.049508,38.9007499,-77.049155,38.899363,-77.048149,38.8981873,
-77.046645,38.8974017,-77.04487,38.8971258,-77.043095,38.8974017,
-77.041591,38.8981873,-77.040585,38.899363,-77.040232,38.9007499,
-77.040585,38.9021368,-77.04159,38.9033127,-77.043095,38.9040983,
-77.04487,38.9043742--coordinatesoflastvertexsameasfirstvertex
)
)
);
二、加载和转换空间数据
(一)用SQL*Loader从文本文件加载
SQL*Loader是Oracle的一个工具,用于从文件向Oracle表加载数据,可以执行批量加载。
SQL*Loader由控制文件和数据组成,控制文件定义了数据的格式,怎样把文件数据分解成Oracle中的行,以及怎样把这些行分解为不同的列。
数据可以在同一个控制文件的BEGINDATA关键字之后被指定,也可以存储在一个独立文件里。
加载点数据时,不需要指定SDO_SRID、SDO_ELEM_INFO_ARRAY和SDO_ORDONATE_ARRAY组件,它们将被自动设为NULL。
程序5-3是将点数据插入geom列中,数据在控制文件中被指定:
程序5-3
LOADDATA
INFILE*
INTOTABLEsales_regions
APPEND
FIELDSTERMINATEDBY'|'
TRAILINGNULLCOLS
(
idNULLIFID=BLANKS,
geomCOLUMNOBJECT
(
SDO_GTYPEINTEGEREXTERNAL,
SDO_POINTCOLUMNOBJECT
(
XFLOATEXTERNAL,
YFLOATEXTERNAL
)
)
)
BEGINDATA
1|2001|-76.99022|38.888654|
2|2001|-77.41575|38.924753|
将该文件用DOS导入,
插入了数据,
也可将控制文件和数据文件分开,在命令行中指定这个文件,如程序5-6是控制文件,程序5-7是数据文件,DOS中的语句改为程序5-5:
程序5-6
LOADDATA
INFILEsales_regions.dat
INTOTABLEsales_regions
APPEND
FIELDSTERMINATEDBY'|'
TRAILINGNULLCOLS
(
idNULLIFID=BLANKS,
geomCOLUMNOBJECT
(
SDO_GTYPEINTEGEREXTERNAL,
SDO_POINTCOLUMNOBJECT
(
XFLOATEXTERNAL,
YFLOATEXTERNAL
)
)
)
程序5-7
1|2001|-76.99022|38.888654|
2|2001|-77.41575|38.924753|
程序5-5
SQLLDRspatial/spatialCONTROL=sales_regions.ctlDATA=sales_region.dat
这样和程序5-3的功能是相同的。
加载非点数据时,需要填充SDO_GEOMETRY中的SDO_ELEM_INFO域和SDO_ORDINATES域,如程序5-8:
程序5-8
LOADDATA
INFILE*
CONTINUEIFNEXT(1:
1)='#'
INTOTABLEsales_regions
APPEND
FIELDSTERMINATEDBY'|'
TRAILINGNULLCOLS
(
idCHAR(6),
geomCOLUMNOBJECT
(
SDO_GTYPEINTEGEREXTERNAL,
SDO_SRIDINTEGEREXTERNAL,
SDO_ELEM_INFOVARRAYterminatedby'/'(EFLOATEXTERNAL),
SDO_ORDINATESVARRAYterminatedby'/'(OFLOATEXTERNAL)
)
)
BEGINDATA
10000|2003|8307|
#1|1003|1|/
#-77.04487|38.9043742|-77.046645|38.9040983|-77.04815|38.9033127|-77.049155|
#38.9021368|-77.049508|38.9007499|-77.049155|38.899363|-77.048149|
#38.8981873|-77.046645|38.8974017|-77.04487|38.8971258|-77.043095|
#38.8974017|-77.041591|38.8981873|-77.040585|38.899363|-77.040232|
#38.9007499|-77.040585|38.9021368|-77.04159|38.9033127|-77.043095|
#38.9040983|-77.04487|38.9043742|-77.04487|38.9043742|/
如果数据被包含在控制文件中,SQL*Loader就不能处理多于64K的数据,为了变通解决这个限制,记录可被分割成多行,如果每行的首字母以“#”开始,记录就是连续的。
(二)在Oracle数据库之间传输空间数据
加载数据最简单的方式是使用独立于Qracle平台的.dmp文件,这种文件被Oracle的Import/Export实用工具所使用,如程序5-9是从spatial模式中导出customers表:
程序5-9
EXPspatial/spatialFILE=customers.dmpTABLES=customers
使用OracleImport实用工具这个.dmp文件导入到scott模式中,如程序5-10:
程序5-10
IMPscott/tigerFILE=customers.dmpIGNORE=YTABLES=CUSTOMERS
也可以用fromuseer和touser命令行参数向scott模式中导入数据,导入的命令是以系统账户(system/manager)来运行的,如程序5-11:
程序5-11
IMPSYSTEM/MANAGERFROMUSER=spatialTOUSER=scottFILE=customers.dmp
在不同的Oracle数据库之间传输数据的另一种机制是可传输的表空间,利用这种机制,可以在两个数据之间传输整个表空间,如程序5-12:
程序5-12
CONNECTSPATIAL/SPATIAL
EXECUTESDO_UTIL.PREPARE_FOR_TTS('TBS');
CONNECTSYSTEM/MANAGERASSYSDBA
EXECUTEDBMS_TTS.TRANSPORT_SET_CHECK('TBS',TRUE);
ALTERTABLESPACETBSREADONLY;
EXIT
导入rans_ts.dmp中的内容:
程序5-13
IMPUSERID="'SYS/'"TRANSPORT_TABLESPACE=YFILE=trans_ts.dmpDATAFILES='sdo_tts.dbf'TABLESPACES=tbs
导入后,应该改变表空间TBS以允许对其进行读/写操作,并执行SDO_UTIL.INITIALIZE_INDEXES_FOR_TTS过程来启用空间索引:
程序5-14
CONNECTSYS/
ALTERTABLESPACETBSREADWRITE;
CONNECTspatial/spatial;
EXECSDO_UTIL.INITIALIZE_INDEXES_FOR_TTS;
SDO_UTIL.INITIALIZE_INDEXES_FOR_TTS函数重新启用了空间索引,但是如果尾格式不同,空间索引需要通过ALTERINDEXREBUILD命令进行重建:
程序5-15
ALTERINDEXcustomers_sidxREBUILD;
SDO_MIGRATE程序包中类似于TO_CURRENT的函数可以把空间数据从以前的版本中移植到当前版本中:
程序5-16
EXECUTESDO_MIGRATE.TO_CURRENT('customers','location',100);
其中第三个参数规定了提交间隔为100,也就是每移植customers表的100行数据就提交一次。
(三)在SDO_GEOMETRY和WKT/WKB之间转换
SQL/MM为几何体定义了WKT(熟知文本)和WKB(熟知二进制)格式,程序5-20显示了怎样把一个SDO_GEOMETRY对象转换成WKT格式,使用SDO_GEOMETRY数据类型的GET_WKT方法将WKT作为一个字符大对象返回。
程序5-21显示了另一个使用SDO_UTIL.TO_WKTGEOMETRY函数得到同样结果的方法:
程序5-20
SELECTa.location.GET_WKT()wktFROMcustomersaWHER