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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第9章几何处理函数

一、缓冲函数

SDO_BUFFER函数可以在一个特定的几何体或几何体周围创建一个缓冲。这个函数有如下语法:

SDO_BUFFER

(

geometry IN SDO_GEOMETRY,

distance IN NUMBER,

tolerance IN NUMBER,

[,params IN V ARCHAR2]

)

RETURNS an SDO_GEOMETRY

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

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

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

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

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

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

程序9-1

CREATE TABLE sales_regions AS

SELECT id,

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

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

程序9-2

CREATE TABLE COMPETITORS_SALES_REGIONS AS

SELECT id,

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

二、关系分析函数

SDO_DISTANCE函数用于确定两个几何体之间的距离的长度。使用这个函数,可以确定在竞争对手位置周围0.25英里半径范围内的客户,如程序9-3:

程序9-3

SELECT ct.id,

FROM competitors comp, customers ct

WHERE comp.id=1

AND SDO_GEOM.SDO_DISTANCE(ct.location, comp.location, 0.5, 'unit=mile') < 0.25 ORDER BY ct.id;

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

程序9-4

SELECT ct.id, ,

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

FROM competitors comp, customers ct

WHERE comp.id=1

AND SDO_WITHIN_DISTANCE (ct.location, comp.location, 'distance=0.25 unit=mile')='TRUE' ORDER BY ct.id;

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

程序9-5

SELECT cbldg.id,

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

FROM trip_route tr, city_buildings cbldg

WHERE cbldg.id=16;

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

程序9-7

set serverout on

declare

traj sdo_geometry;

bldg16 sdo_geometry;

dist number;

trajpt sdo_geometry;

bldg16pt sdo_geometry;

begin

select geom INTO bldg16 from city_buildings where id=16;

select trajectory into traj from trip_route where rownum<=1;

bldg16.sdo_srid:=null; -- Workaround for Bug 6201938

traj.sdo_srid:=null; -- Workaround for Bug 6201938

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('Pt on Trajectory:' ||

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

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

TO_CHAR(trajpt.sdo_point.z));

dbms_output.put_line('Pt on Bldg16:' ||

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

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

TO_CHAR(bldg16pt.sdo_point.z));

end;

/

相关文档
最新文档