空间数据库课程设计报告第九章.docx

上传人:b****6 文档编号:5878986 上传时间:2023-01-01 格式:DOCX 页数:25 大小:598.24KB
下载 相关 举报
空间数据库课程设计报告第九章.docx_第1页
第1页 / 共25页
空间数据库课程设计报告第九章.docx_第2页
第2页 / 共25页
空间数据库课程设计报告第九章.docx_第3页
第3页 / 共25页
空间数据库课程设计报告第九章.docx_第4页
第4页 / 共25页
空间数据库课程设计报告第九章.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

空间数据库课程设计报告第九章.docx

《空间数据库课程设计报告第九章.docx》由会员分享,可在线阅读,更多相关《空间数据库课程设计报告第九章.docx(25页珍藏版)》请在冰豆网上搜索。

空间数据库课程设计报告第九章.docx

空间数据库课程设计报告第九章

第9章几何处理函数

1、缓冲函数

SDO_BUFFER函数可以在一个特定的几何体或几何体周围创建一个缓冲。

这个函数有如下语法:

SDO_BUFFER

geometryINSDO_GEOMETRY,

distanceINNUMBER,

toleranceINNUMBER,

[,paramsINVARCHAR2]

RETURNSanSDO_GEOMETRY

其中,geometry是一个参数,表示将被缓冲的SDO_GEOMETRY对象。

distance是一个参数,表示缓冲输入的几何体的数值距离。

tolerance是一个参数,表示容差。

Params是可选的第四个参数,表示两个参数:

unit=和arc_tolerance=,unit=表示距离的单位,如果几何体是大地测量,那么arc_tolerance=参数就是必须的。

程序9-1展示了如何在branches表中的每一分支机构位置周围创建一个0.25英里的缓冲:

程序9-1

CREATETABLEsales_regionsAS

SELECTid,

SDO_GEOM.SDO_BUFFER(b.location,0.25,0.5,'arc_tolerance=0.005unit=mile')geom

FROMbranchesb;

也可以创建竞争对手周围的缓冲,如程序9-2:

程序9-2

CREATETABLECOMPETITORS_SALES_REGIONSAS

SELECTid,

SDO_GEOM.SDO_BUFFER(cmp.location,0.25,0.5,'unit=milearc_tolerance=0.005')geom

FROMcompetitorscmp

2、关系分析函数

SDO_DISTANCE函数用于确定两个几何体之间的距离的长度。

使用这个函数,可以确定在竞争对手位置周围0.25英里半径范围内的客户,如程序9-3:

程序9-3

SELECTct.id,ct.name

FROMcompetitorscomp,customersct

WHEREcomp.id=1

ANDSDO_GEOM.SDO_DISTANCE(ct.location,comp.location,0.5,'unit=mile')<0.25

ORDERBYct.id;

程序9-4中,SDO_WITHIN_DISTANCE操作符确认了在一个特定距离内的行数,在SQL的SELECT列表中的SDO_DISTANCE函数识别每一行与查询几何体的准确距离:

程序9-4

SELECTct.id,ct.name,

SDO_GEOM.SDO_DISTANCE(ct.location,comp.location,0.5,'unit=yard')distance

FROMcompetitorscomp,customersct

WHEREcomp.id=1

ANDSDO_WITHIN_DISTANCE(ct.location,comp.location,'distance=0.25unit=mile')='TRUE'

ORDERBYct.id;

程序9-5所示的SQL用于确定一条直升机轨迹和最近的建筑物之间的距离,由于建筑物被模拟为三维的物体,直升机轨迹被模拟为一个三维的线串,因此距离也将是一个三维的距离。

程序9-5

SELECTcbldg.id,

SDO_GEOM.SDO_DISTANCE(cbldg.geom,tr.trajectory,0.05,'UNIT=foot')dist

FROMtrip_routetr,city_buildingscbldg

WHEREcbldg.id=16;

SDO_CLOSEST_POINTS过程可以获得最近的点。

如程序9-7,返回16号建筑与直升机轨迹之间的最近的点之间的距离:

程序9-7

setserverouton

declare

trajsdo_geometry;

bldg16sdo_geometry;

distnumber;

trajptsdo_geometry;

bldg16ptsdo_geometry;

begin

selectgeomINTObldg16fromcity_buildingswhereid=16;

selecttrajectoryintotrajfromtrip_routewhererownum<=1;

bldg16.sdo_srid:

=null;--WorkaroundforBug6201938

traj.sdo_srid:

=null;--WorkaroundforBug6201938

sdo_geom.sdo_closest_points(

traj,bldg16,0.05,'UNIT=FOOT',

dist,trajpt,bldg16pt);

dbms_output.put_line('Distance='||TO_CHAR(dist));

dbms_output.put_line('PtonTrajectory:

'||

TO_CHAR(trajpt.sdo_point.x)||','||

TO_CHAR(trajpt.sdo_point.y)||','||

TO_CHAR(trajpt.sdo_point.z));

dbms_output.put_line('PtonBldg16:

'||

TO_CHAR(bldg16pt.sdo_point.x)||','||

TO_CHAR(bldg16pt.sdo_point.y)||','||

TO_CHAR(bldg16pt.sdo_point.z));

end;

/

RELATE函数可以确定销售区域和竞争对手区域里的客户。

如程序9-9:

程序9-9

SELECTct.id,ct.name

FROMcustomersct,competitors_sales_regionscomp

WHERESDO_GEOM.RELATE(ct.location,'INSIDE',comp.geom,0.5)='INSIDE'

ANDcomp.id=1

ORDERBYct.id;

上面的查询只返回指定范围内的客户,没有返回接触的或对手缓冲区域边界上的,可以指定ANYINTERACTmask,如程序9-10:

程序9-10

SELECTct.id,ct.name

FROMcustomersct,competitors_sales_regionscomp

WHERESDO_GEOM.RELATE(ct.location,'ANYINTERACT',comp.geom,0.5)='TRUE'

ANDcomp.id=1

ORDERBYct.id;

对于三维的几何体,可以指定ANYINTERACTmask只作为RELATE函数的第二个参数。

在程序9-11中,可以通过SDO_GEOM.RELATE函数得知哪些建筑物与直升机轨迹相交:

程序9-11

SELECTcbldg.id

FROMcity_buildingscbldg,trip_routetr

WHERESDO_GEOM.RELATE(cbldg.geom,'ANYINTERACT',tr.trajectory,0.5)='TRUE';

程序9-14展示了如何使用SDO_GEOM.RELATE函数来SDO_RELATE操作符,得到在竞争对手周围0.25英里内的确定客户:

程序9-14

SELECTct.id,ct.name,

SDO_GEOM.RELATE(ct.location,'DETERMINE',comp.geom,0.5)relationship

FROMcustomersct,competitors_sales_regionscomp

WHEREcomp.id=1

ANDSDO_RELATE(ct.location,comp.geom,'mask=anyinteract')='TRUE';

程序9-15所示的SQL语句用于查找与id号为51的销售区域相交的所有销售区域:

程序9-15

SELECTsra.id,

SDO_GEOM.RELATE(sra.geom,'DETERMINE',srb.geom,0.5)relationship

FROMsales_regionssrb,sales_regionssra

WHEREsrb.id=51

ANDsra.id<>51

ANDSDO_RELATE(

sra.geom,srb.geom,

'mask=TOUCH+OVERLAPBDYDISJOINT+OVERLAPBDYINTERSECT'

)='TRUE'

ORDERBYsra.id;

3、几何组合函数

ASDO_INTERSECTIONB:

返回A和B共有的区域。

ASDO_UNIONB:

返回A和B覆盖的区域的并。

ASDO_DIFFERENCEB:

返回被A覆盖但不被B覆盖的区域。

ASDO_XORB:

返回A和B不相交的区域。

每一个函数都有如下语法:

SDO_

Geometry_AINSDO_GEOMETRY,

Geometry_BINSDO_GEOMETRY,

ToleranceINNUMBER

RETURNSSDO_GEOETRY

程序9-19展示了与用于确定在销售区域51和43的相交区域内的客户相对应的SQL语句:

程序9-19

SELECTCOUNT(*)

FROMcustomersct

WHERESDO_RELATE

ct.location,

SELECTSDO_GEOM.SDO_INTERSECTION(sra.geom,srb.geom,0.5)

FROMsales_regionssra,sales_regionssrb

WHEREsra.id=51andsrb.id=43

),

'mask=anyinteract'

)='TRUE';

可以使用SDO_UNION函数来计算被两个销售区域覆盖的几何体,利用最终的合并集合体来确定客户的总数量。

程序9-20用于确定在销售区域43和51范围内的客户数量:

程序9-20

SELECTcount(*)

FROM

SELECTSDO_GEOM.SDO_UNION(sra.geom,srb.geom,0.5)geom

FROMsales_regionssrb,sales_regionssra

WHEREsra.id=51andsrb.id=43

)srb,customerssra

WHERESDO_RELATE(sra.location,srb.geom,'mask=anyinteract')='TRUE';

SDO_DIFFERENCE函数是从第一个几何体中减去第二个几何体,返回只属于第一个几何体的区域。

程序9-24展示了如何使用SDO_DIFFERENCE函数得到竞争对手的独书区域内的确定客户:

程序9-24

SELECTct.id,ct.name

FROMsales_regionssr,competitors_sales_regionscsr,customersct

WHEREcsr.id=2ANDsr.id=6

ANDSDO_RELATE

ct.location,

SDO_GEOM.SDO_DIFFERENCE(csr.geom,sr.geom,0.5),

'mask=anyinteract'

)='TRUE'

ORDERBYct.id;

程序9-25展示了销售区域43和51上的SDO_XOR操作以识别不被它们共享的客户:

程序9-25

SELECTcount(*)

FROM

SELECTSDO_GEOM.SDO_XOR(a.geom,b.geom,0.5)geom

FROMsales_regionssrb,sales_regionssra

WHEREsra.id=51andsrb.id=43

)srb,customerssra

WHERESDO_RELATE(sra.location,srb.geom,'mask=anyinteract')='TRUE';

4、几何分析函数

(1)面积、长度和体积函数

程序9-26表示了如何计算sales_regions表中销售区域51好43的相交区域的面积:

程序9-26

SELECTSDO_GEOM.SDO_AREA(

SDO_GEOM.SDO_INTERSECTION(sra.geom,srb.geom,0.5),0.5,'unit=sq_yard')area

FROMsales_regionssrb,sales_regionssra

WHEREsra.id=51

ANDsrb.id=43;

对于一个立方体,可以使用面积函数来计算它的表面积,首先在表city_buildings中插入一个200英尺*200英尺*400英尺的新的建筑物,如程序9-27:

程序9-27

insertintocity_buildings(id,geom)

values(

1,--IDofthebuilding

sdo_geometry(3008,7407,null,

sdo_elem_info_array(1,1007,3),--3representsaSolidBoxrepresentationusingjustthecornerpoints

sdo_ordinate_array(

27731202,42239124,0,--Minvaluesforx,y,z

27731402,42239324,400--Maxvaluesforx,y,z

);

commit;

程序9-28举例说明了city_buildings表中的建筑物1的表面积的计算。

面积函数把立方体的6个面的面积加起来。

程序9-28

SELECTid,SDO_GEOM.SDO_AREA(geom,0.05)SURFACE_AREA

FROMcity_buildings

WHEREid=1;

SDO_LENGTH函数返回一条线的长度和多边形、平面和立方体的周长。

程序9-30展示了长度小于一英里的州际:

程序9-30

SELECTinterstate

FROMus_interstates

WHERESDO_GEOM.SDO_LENGTH(geom,0.5,'unit=mile')<1;

Count_chared_length用于表示共有的边是否被计算了一次(如果参数的值是1),程序9-31和程序9-32确定了建筑物1的两种Count_chared_length值,因此,Count_chared_length的值为2的长度大约是Count_chared_length的值为1的长度的两倍。

程序9-31

SELECTSDO_GEOM.SDO_LENGTH(

geom,--inputgeometry

0.05,--tolerancevalue

'UNIT=FOOT',--unitsparameter

1--count_shared_edgesonlyonce

)LENGTH

FROMcity_buildings

WHEREid=1;

程序9-32

SELECTSDO_GEOM.SDO_LENGTH(

geom,--inputgeometry

0.05,--tolerancevalue

'UNIT=FOOT',--unitsparameter

2--count_shared_edgesonlyonce

)LENGTH

FROMcity_buildings

WHEREid=1;

如果输入的几何体是三维的立方体或是多重立方体,那么SDO_VOLUME函数将一个几何体和一个容差值作为参数并返回体积。

程序9-34计算了city_buildings表中建筑物1的体积:

程序9-34

setnumwidth15

SELECTSDO_GEOM.SDO_VOLUME(

GEOM,--INPUTGEOMETRY

0.05--TOLERANCEVALUE

)VOLUME

FROMcity_buildings

WHEREid=1;

(2)MBR函数

SDO_MBR函数把SDO_GEOMETRY作为一个参数并且计算这个几何体的MBR(最小边界矩形)。

程序9-36展示了如何获得sales_regions表中的一个指定销售区域的MBR的范围:

程序9-36

SELECTSDO_GEOM.SDO_MBR(sr.geom)mbrFROMsales_regionssr

WHEREsr.id=1;

对于一个输入的三维对象,SDO_MBR函数返回一个范围,也就是这个三维几何体在三个维度上的最小值和最大值。

程序9-37展示了city_buildings表中建筑物1的例子:

程序9-37

SELECTSDO_GEOM.SDO_MBR(geom)extent

FROMcity_buildingscbldg

WHEREid=1;

可以通过SDO_MIN_MBR_ORDINATE和SDO_MAX_MBR_ORDINATE函数来获得指定的维数上的范围,这两个函数返回指定维数上几何体的最小和最大值坐标。

程序9-39展示了如何在第一个维数上获得范围:

程序9-39

SELECTSDO_GEOM.SDO_MIN_MBR_ORDINATE(sr.geom,1)min_extent,

SDO_GEOM.SDO_MAX_MBR_ORDINATE(sr.geom,1)max_extent

FROMsales_regionssrWHEREsr.id=1;

程序9-40展示了在city_buildings表中的三维建筑物1使用SDO_MIN_MBR_ORDINATE和SDO_MAX_MBR_ORDINATE函数的例子:

程序9-40

SELECTSDO_GEOM.SDO_MIN_MBR_ORDINATE(geom,3)min_extent,

SDO_GEOM.SDO_MAX_MBR_ORDINATE(geom,3)max_extent

FROMcity_buildingscbldg

WHEREid=1;

(3)各种几何分析函数

SDO_CONVEXHULL函数计算一个SDO_GEOMETRY的凸包。

程序9-41展示了计算美国新罕布什州的凸包:

程序9-41

SELECTSDO_GEOM.SDO_CONVEXHULL(st.geom,0.5)cvxhl

FROMus_statesst

WHEREst.state_abrv='NH';

SDO_CENTROID函数计算一个SDO_GEOMETRY对象的几何质心。

程序9-42展示了如何使用SDO_CENTROID函数计算美国新罕布什尔州的质心:

程序9-42

SELECTSDO_GEOM.SDO_CENTROID(st.geom,0.5)ctrd

FROMus_statesstWHEREst.state_abrv='NH';

SDO_POINTONSURFACE函数的唯一保证是返回的点在穿过的多边形的边界上或者在内部。

程序9-43展示了使用SDO_POINTONSURFACE函数获得马萨诸塞州几何体表面的一点:

程序9-43

SELECTSDO_GEOM.SDO_POINTONSURFACE(st.geom,0.5)pt

FROMus_statesst

WHEREstate_abrv='MA';

也可以在三维几何体上使用这个函数,如程序9-44:

程序9-44

SELECTSDO_GEOM.SDO_POINTONSURFACE(geom,0.05)pt

FROMcity_buildingscbldg

WHEREid=1;

5、聚合函数

(1)聚合MBR函数

可以使用SDO_AGGR_MBR函数计算一个集合的MBR。

程序9-45中通过计算在branches中的所有位置的聚合MBR:

程序9-45

SELECTSDO_AGGR_MBR(location)extentFROMbranches;

SDO_AGGR_MBR函数适用于三维几何体,程序9-46展示了如何计算city_buildings表中所有几何体的范围:

程序9-46

SELECTSDO_AGGR_MBR(geom)extentFROMcity_buildings;

(2)其他聚合函数

聚合函数SDO_AGGGR_UNION计算几何体集合的并,并以SDO_GEOMETRY对象返回。

程序9-47展示了如何使用SDO_AGGGR_UNION查找分支机构的覆盖范围:

程序9-47

SELECTSDO_AGGR_UNION(SDOAGGRTYPE(location,0.5))coverage

FROMbranches;

合并两个重叠的多边形销售区域51和43以及一个无关的区域2,返回两个多边形元素:

一个元素是合并重叠区域1和7后的值,另一个元素是无关的区域2,如程序9-48:

程序9-48

SELECTSDO_AGGR_UNION(SDOAGGRTYPE(geom,0.5))union_geom

FROMsales_regions

WHEREid=51orid=43orid=2;

函数SDO_AGGR_CONVEXHULL用来计算聚合体的凸包。

程序9-50展示了使用SDO_AGGR_CONVEXHULL函数计算销售区域覆盖范围的代码:

程序9-50

SELECTSDO_AGGR_CONVEXHULL(SDOAGGRTYPE(geom,0.5))coverage

FROMsales_regions;

SDO_AGGR_CENTROID函数可以计算点集合的质心,程序9-51展示了如何使用SDO_AGGR_CENTROID查找客户位置的质心:

程序9-51

SELECTSD

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1