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