1、第七章第七章 Oracle Spatial的几何处理函数的几何处理函数基本要求:基本要求:1.了解空间函数2.使用空间函数对SDO_GEOMETRY对象进行复杂的分析在第六章,我们讨论了如何使用空间索引和相关空间操作符进行邻近分析(proximity analysis)。本章,我们描述几何处理函数,也叫做空间函数(只要是无歧义)来实现这个功能。与空间操作符相比,这些几何处理函数具有如下特点:l 不需要空间索引,l 与带空间索引的空间操作符相比,提供更详细的分析,l 可出现在SQL语句中的select列表中(以及带where子句的select列表中)7.1 缓冲函数缓冲函数 缓冲函数(SDO_B
2、UFFER):在一个特定的几何体或几何体集合周围创建一个缓冲。 图7-1 展示了为不同类型的几何体构建缓冲的例子,附带显示了缓冲之前的的几何体,这里只展示了简单的几何体。图7-1 一些简单类型的几何体对象和缓冲几何体 SDO_BUFFER函数有如下的语法:SDO_BUFFER(geometry IN SDO_GEOMETRY,distance IN NUMBER,tolerance IN NUMBER, params IN VARCHAR2)返回一个SDO_GEOMETRY,满足以下条件:Geometry,表示被缓冲的SDO_GEOMETRY对象。Distance,表示缓冲输入的几何体的数值距
3、离。Tolerance,表示容差。Params,是一个可选的的第四个参数,表示两个参数unit=和arc_tolerance=。 使用SDO_BUFFER函数,可以在branches表中的每一个分支机构位置周围构建一个1/4英里的缓冲,如程序清单7-1所示。我们在sales_regions表中存储这些缓冲以便于接下来的分析。SQLCREATE TABLE sales_regions AS SELECT id,SDO_GEOM.SDO_BUFFER(b.location, 0.25, 0.5, arc_tolerance=0.005 unit=mile) geomFROM branches b程
4、序清单程序清单7-1 在分支机构周围创建缓冲在分支机构周围创建缓冲同样可以创建竞争对手商店周围的缓冲 程序清单程序清单7-2 在竞争对手位置周围创建缓冲在竞争对手位置周围创建缓冲SQLCREATE TABLE competitors_sales_regions AS SELECT id,SDO_GEOM.SDO_BUFFER(cmp.location, 0.25, 0.5, arc_tolerance=0.005 unit=mile) geomFROM competitors cmp注意,你需要为两个表都创建空间索引。关于如何创建元数据和空间索引的详细细节,你可以查阅第6章。脚本如下:Sale
5、s_regions表的命令行元数据SQL INSERT INTO user_sdo_geom_metadataSELECT SALES_REGIONS,GEOM, diminfo, srid FROM user_sdo_geom_metadataWHERE table_name=BRANCHES;Competitors_sales_regions表的命令行元数据SQL INSERT INTO user_sdo_geom_metadataSELECT COMPETITORS_SALES_REGIONS,GEOM, diminfo, srid FROM user_sdo_geom_metadata
6、WHERE table_name=COMPETITORS;Sales_regions表的命令行索引创建SQL CREATE INDEX sr_sidx ON sales_regions(geom)INDEXTYPE IS mdsys.spatial_index;Competitors_sales_regions表的命令行索引创建SQL CREATE INDEX cr_sidx ON competitors_sales_regions(geom)INDEXTYPE IS mdsys.spatial_index;7.2 关系分析函数关系分析函数本节我们将介绍用于分析两个SDO_GEOMETRY对象
7、关系的两个函数。第一个函数是SDO_DISTANCE。这个函数用于确定两个几何体之间的距离的长度。第二个函数是RELATE。这个函数用于确定两个几何体是否以任一指定形式相交。 7.2.1 SOD_DISTANCE7.2.1 SOD_DISTANCESDO_DISTANCE函数有以下的语法:SDO_DISTANCE(geometry1 IN SDO_GEOMETRY,geometry2 IN SDO_GEOMETRY,tolerance IN NUMBER, params IN VARCHAR2)返回几何体1和几何体2之间以指定单位测量的最小距离。 满足以下条件: geometry1和geome
8、try2是起始的两个参数,它们表示SDO_GEOMETRY对象。 tolerance表示数据集的容差。对于大地测量的数据,它们通常是0.5或者0.1(0.5米或者是0.1米)。对于非大地测量的数据,它将被设置为合适的值,来避免四舍五入引起的错误(详情请见第八章)。 params是可选的第四个参数,是形如unit= 的字符串。这个参数说明了返回距离的单位。你可以通过查看MDSYS.SDO_DIST_UNITS表获得可能的单位值。使用这个函数,你可以确定在竞争对手位置周围四分之一英里半径范围内的客户,如程序清单7-3所示:程序清单程序清单7-3. 确定在竞争对手位置周围四分之一英里半径范围内的客户
9、确定在竞争对手位置周围四分之一英里半径范围内的客户SQLSELECT ct.id, ct.nameFROM competitors comp, customers ctWHERE comp.id=1 AND SDO_GEOM.SDO_DISTANCE(comp.location, ct.location, 0.5 unit=mile)SELECT ct.id, ct.name,SDO_GEOM.SDO_DISTANCE(ct.location, comp.location, 0.5, unit=yard) distanceFROM competitors comp, customers ctW
10、HERE comp.id=1AND SDO_WITHIN_DISTANCE(ct.location, comp.location, distance=0.25 unit=mile)=TRUEORDER BY ct.id;ID NAME DISTANCE- - -25 BLAKE CONSTRUCTION 319.03852628 COLONIAL PARKING 398.262506(此处省略20行)8792 DESTINATION HOTEL & RESORTS 159.23484323 rows selected.也可以在三维的物体上使用SDO_DISTANCE函数。程序清单7-5所示的S
11、QL用于确定一个直升机轨线和最近的建筑物之间的距离,这是一个三维距离。程序清单程序清单7-5. 使用使用SDO_DISTANCE函数函数确定最近建筑物确定最近建筑物和直升和直升机轨线之间的距离机轨线之间的距离 SQLSELECT cbldg.id,SDO_GEOM.SDO_DISTANCE(cbldg.geom, tr.trajectory, 0.05, UNIT=foot) distFROM trip_route tr, city_buildings cbldgWHERE cbldg.id=16;运行结果如下表所示,可以看出最近建筑物距离直升机轨线的距离是187.258607英尺ID DIS
12、T- -16 187.2586077.2.2 RELATE 7.2.2 RELATE 在程序清单7-2中,我们创建了分支机构和竞争对手位置周围的缓冲,用这些缓冲来干什么呢?我们可以进行关系分析,确定在这些销售区域和竞争对手区域内的客户。可以使用第六章讲述的SDO_RELATE操作符或者SDO_GEOM包中的RELATE函数做到这一点。RELATE函数的语法如右表所示:RELATE(Geometry_A IN SDO_GEOMETRY,mask, IN VARCHAR2,Geometry_Q, IN SDO_GEOMETRY,Tolerance IN NUMBER)满足下列条件:Geometry
13、_A和Geometry_Q代表两个几何体。mask可取如下的几种值: DETERMINE,确定Geometry_A和Geometry_Q之间的关系或者相互作用 任何一个关系,包括:INSIDE(在内部), COVEREDBY(被覆盖),COVERS(覆盖), CONTAINS(包含), EQUAL(等价), OVERLAPBDY- DISJOINT, OVERLAPBDYINTERSECT, ON(在上), and TOUCH(接触) ANYINTERACT 如果先前的任何一个关系存在 DISJOINT 如果先前的关系不存在RELATE函数的返回值如下: 如果几何体相交并且指定了ANYINTE
14、RACT mask,返回TRUE 如果Geometry_A和Geometry_Q满足指定的mask类型关系,返回mask值 如果几何体之间的关系不符合第二个参数 mask指定的关系,返回FALSE 如果mask被设置为DETERMINE,返回关系的类型使用RELATE函数,可以确认在竞争对手周围的缓冲区域(competitors_sales_regions)中的所有客户,如程序清单7-9所示。SQLSELECT ct.id, ct.nameFROM customers ct, competitors_sales_regions compWHERE SDO_GEOM.RELATE(ct.loca
15、tion, INSIDE, comp.geom, 0.5)= INSIDEAND comp.id=1ORDER BY ct.id;程序清单程序清单7-9 确认竞争对手销售区域里的客户确认竞争对手销售区域里的客户运行结果如下:ID NAME- -25 BLAKE CONSTRUCTION28 COLONIAL PARKING34 HEWLETT-PACKARD DC GOV AFFAIRS8792 DESTINATION HOTEL & RESORTS23 rows selected.对于三维的几何体,可以指定ANYINTERACT作为RELATE函数的第二个参数。在程序清单7-11的SQL语句
16、中,你可以通过SDO_GEOM.RELATE函数得知那些建筑与直升机轨线相交。程序清单程序清单7-11 确定与直升机轨线相交的建筑确定与直升机轨线相交的建筑SQLSELECT cbldg.idFROM city_buildings cbldg, trip_route trWHERE SDO_GEOM.RELATE(cbldg.geom, ANYINTERACT, tr.trajectory, 0.5)= TRUE;运行结果:ID-14注意注意:对于三维的几何体,RELATE函数 的 第 二 个 参 数 只 能 指 定 为ANYINTERACT。如果指定了其他任何参数,它将返回“没有符合条件的元
17、组”(在将来的版本中这一点可能会改变)。什么时候使用RELATE函数?使用SDO_GEOM.RELATE函数可以与第六章我们学到的SDO_RELATE操作符达到相同的分析效果。并且SDO_RELATE操作符使用了空间索引,所以执行的更快一些,而SDO_GEOM.RELATE函数没有使用任何索引,计算了customers表中的每一个元组。这可能导致非常慢的计算。因此如果SDO_RELATE操作符能达到同样的目的,那么RELATE函数是不会被使 用 的 。 然 而 , 在 一 定 的 场 景 下 可 以 使 用SDO_GEOM.RELATE函数例如,操作一个没有加索引的表或者几何体的子集,如程序清
18、单7-13的供应商表。注意供应商表是没有空间索引的。程序清单程序清单7-13. 在竞争对手周围四分之一范围内确定供应商在竞争对手周围四分之一范围内确定供应商SQLSELECT s.idFROM suppliers s, competitors_sales_regions csWHERE SDO_GEOM.RELATE(s.location, ANYINTERACT, cs.geom, 0.5)= TRUEAND cs.id=1;SQLSELECT ct.id, ct.name,SDO_GEOM.RELATE(ct.location, DETERMINE, comp.geom, 0.5) rel
19、ationshipFROM customers ct, competitors_sales_regions compWHERE comp.id=1AND SDO_RELATE(ct.loacation, comp.geom, mask=anyinteract)= TRUE;运行结果:ID NAME RELATIONSHIP- - -25 BLAKE CONSTRUCTION INSIDE7821 RENAISSANCE MAYFLOWER HOTEL INSIDE8138 ST GREGORY HOTEL INSIDE8382 EXXON INSIDE7789 SEVEN BUILDINGS
20、INSIDE23 rows selected.也可以使用SDO_GEOM.RELATESDO_GEOM.RELATE函数来补足SDO_RELATE操作符。例如可以使用带有ANYINTERACT参数的SDO_RELATE来确定一个候选的元组集合。然后使用SDO_GEOM.RELATE函数来确定返回的每一个元组的关系,如程序清单7-14所示。程序清单程序清单7-14.在竞争对手周围四分之一范围内确定客户在竞争对手周围四分之一范围内确定客户另一个商务应用的例子是识别彼此相交的销售区域。我们可以使用SDO_RELATE操作符来识别相交的销售区域对,然后执行SDO_GEOM.RELATE来判断它们之间是
21、否正好接触或者重叠。用于查找与id号为51的销售区域相交的所有销售区域的SQL语句如程序清单7-15所示。程序清单程序清单7-15. RELATE函数补充函数补充SDO_RELATE操作符操作符SQLSELECT sra.id,SDO_GEOM.RELATE(sra.geom, DETERMINE, srb.geom, 0.5) relationshipFROM sales_regions srb, sales_regions sraWHERE srb.id=51 AND sra.id51 AND SDO_RELATE(sra.geom, srb.geom,mask=TOUCH+OVERLAP
22、BDYDISJIONT+OVERLAPBDYINTERSECT)=TRUEORDER BY sra.id;运行结果:ID RELATIONSHIP- -43 OVERLAPBDYINTERSECT75 OVERLAPBDYINTERSECT76 TOUCH9 rows selected.7.3 几何组合函数几何组合函数A SDO_INTERSECTION B:返回A和B共有的区域A SDO_UNION B:返回A和B的区域A SDO_DIFFERENCE B:返回被A覆盖的但是不被B覆盖的区域。A SDO_XOR B:返回A和不相交的区域。 每一组几何组合函数的语义如图7-4所示:图7-4.
23、用于八边形几何体A和B的几何组合函数的语义。阴影区域是每个指定函数的结果。每一个函数都有如下的语法:返回SDO_GEOMETRY,满足以下条件:Geometry_A 和Geometry_是SDO_GEOMETRY对象(拥有相同的SRIDs)Tolerance是几何对象的容差值该函数返回一个SDO_GEOMETRY,它是在Geometry_A上针对Geometry_进行了合适的几何体组合函数计算所得的结果。 SDO_(Geometry_A IN SDO_GEOMETRY,Geometry_B IN SDO_GEOMETRY,Tolerance IN NUMBER)程序清单程序清单7-16 7-1
24、6 两个几何体的两个几何体的SDO_INTERSECTIONSDO_INTERSECTION操作操作程序清单程序清单7-17 7-17 与与idid号为号为5151的销售区域相交的销售区域的销售区域相交的销售区域SQL CREATE TABLE sales_intersection_zones ASSELECT sra.id id1, srb.id id2,SDO_GEOM.SDO_INTERSECTION(a.geom, b.geom, 0.5) intsxn_geomFROM sales_regions srb, sales_regions sraWHERE sra.id srb.idAN
25、D SDO_RELATE(sra.geom, srb.geom, mask=anyinteract )=TRUE ;SQL SELECT id2 FROM sales_intersection_zones WHERE id1=51;ID2-4350546366697275769 rows selected. 你可以将存储在sales_intersection_zones表中的intersection geometry (intsxn_geom列)用于对销售区域接下来的分析中。对Id号为51和43的销售区域,程序清单7-18展示了如何使用上述的几何体来确认在它们相交区域内的客户。这个SQL语句的
26、结果表明在两个销售区域内只有两个共有的客户。SQL SELECT count(*)FROM sales_intersection_zones siz, customers ctWHERE siz.id1=51 AND siz.id2=43AND SDO_RELATE(ct.location, siz.intsxn_geom, mask=anyinteract)=TRUE;COUNT(*)-2程序清单程序清单7-18 在在sales_ intersection_zones表中确认客户表中确认客户 SQL SELECT COUNT(*)FROM customers ctWHERE SDO_RELA
27、TE(ct.location,(SELECT SDO_GEOM.SDO_INTERSECTION(sra.geom, srb.geom, 0.5)FROM sales_regions sra, sales_regions srbWHERE sra.id = 51 and srb.id = 43),mask=anyinteract)=TRUE;COUNT(*)-2列表列表7-19. 确定在销售区域确定在销售区域51和和43的相交区域内的客户的相交区域内的客户7.3.2 SDO_UNION 你可以使用SDO_UNION函数来计算被两个销售区域覆盖的几何体。之后你可以利用最终的合并几何体来确定客户的
28、总数量。程序清单7-20所示的SQL语句用于确定销售区域43和51的客户数量。SQL SELECT count(*)FROM(SELECT SDO_GEOM.SDO_UNION (sra.geom, srb.geom, 0.5) geomFROM sales_regions srb, sales_regions sraWHERE sra.id=51 and srb.id=43) srb, customers sraWHERE SDO_RELATE(sra.location, srb.geom, mask=anyinteract)=TRUE;COUNT(*)-1241 row selected.
29、程序清单程序清单7-20. 两个几何体的两个几何体的SDO_UNION操作操作 如果你想知道你的业务在Washington, D.C.的覆盖面,你该怎么办呢?这个问题涉及到的不仅仅是两个销售区域,而是在sales_regions表中的所有的几何体。你可以用迭代的方式重复执行并操作,如程序清单7-21所示的PL/SQ程序.CREATE TABLE sales_region_coverage (coverage SDO_GEOMETRY);DECLAREcoverage SDO_GEOMETRY := NULL;BEGINFOR g IN (SELECT geom FROM sales_regio
30、ns) LOOPcoverage := SDO_GEOM.SDO_UNION(coverage, g.geom, 0.5);END LOOP;INSERT INTO sales_region_coverage values (coverage);COMMIT;END;/程序清单程序清单7-21. 销售区域的覆盖范围:对所有的销售区域执行并操作销售区域的覆盖范围:对所有的销售区域执行并操作 7.3.3 SDO_DIFFERENCESDO_DIFFERENCESDO_DIFFERENCE函数是从第一个几何体中减去第二个几何体。结果,它返回的是只属于第一个几何体的区域。使用SDO_DIFFERENC
31、ESDO_DIFFERENCE函数,你可以将销售区域与竞争对手区域进行对比,如程序清单7-22所示。SQL CREATE TABLE exclusive_region_for_comp_2 ASSELECT SDO_GEOM.SDO_DIFFERENCE(csr.geom, sr.geom, 0.5) geomFROM sales_regions sr, competitors_sales_regions csrWHERE csr.id=2 and sr.id=6 ;程序清单程序清单7-22. 竞争对手区域竞争对手区域2和销售区域和销售区域6的的SDO_DIFFERENCE操作操作 程序清单程
32、序清单7-23. 在竞争对手的独属区域内确定客户在竞争对手的独属区域内确定客户 SQL SELECT ct.id, ct.nameFROM exclusive_region_for_comp_2 excl, customers ctWHERE SDO_RELATE(ct.location, excl.geom, mask=anyinteract)=TRUEORDER BY ct.id; 注意你可以把程序清单7-22和程序清单7-23中的SQL语句整合为一个单个的SQL语句,如程序清单7-24所示。 SQL SELECT ct.id, ct.nameFROM sales_regions sr,
33、competitors_sales_regions csr, customers ctWHERE csr.id=2 AND sr.id=6AND SDO_RELATE(ct.location,SDO_GEOM.SDO_DIFFERENCE(csr.geom, sr.geom, 0.5),mask=anyinteract)=TRUEORDER BY ct.id;程序清单程序清单7-24. 组合程序清单组合程序清单7-22和和7-237.3.4 SDO_XOR你可以使用这个函数作为一个可替代机制来确认两个重叠区域是否有必要合并。例如,如果销售区域1和2重叠,你可以把这些区域的SDO_XOR中客户的
34、数量比作这些区域的SDO_UNION中的客户数量。如果SDO_XOR中的客户数量与SDO_UNION中的客户数量是接近的,那么这两个销售区域,虽然重叠,但是几乎没有共同的客户。程序清单7-25说明了这个问题。 程序清单程序清单7-25. 销售区域销售区域43和和51上的上的SDO_XOR操作以识别不被它们共享的客户操作以识别不被它们共享的客户SQL SELECT count(*)FROM(SELECT SDO_GEOM.SDO_XOR (a.geom, b.geom, 0.5) geomFROM sales_regions srb, sales_regions sraWHERE sra.id=
35、51 and srb.id=43) srb, customers sraWHERE SDO_RELATE(sra.location, srb.geom, mask=anyinteract)=TRUE;COUNT(*)-1221 rows selected.7.4 几何分析函数 其中其中: Geometry表示将被分析的几何体。 Tolerance表示在这个分析中的容差。 Units_params是可选的第三个参数,表示返回的面积、长度和体积的单位。Function_name(Geometry IN SDO_GEOMETRY,Tolerance IN NUMBER, units_params I
36、N VARCHAR2)RETURN NUMBER7.4.1 面积,长度和体积函数1大地测量数据的面积和长度计算的准确性大地测量数据的面积和长度计算的准确性面积和长度函数在计算过程中考虑了地球的曲率。对于一个大地测量的几何体,基于几何体的大小和在纬度上不同的程度,面积函数的准确性是不同的:对于一些小的几何体比如美国新罕布什尔州,面积函数精确到百分之0.0001.对于一些尺寸比较大的几何体如印度,精确度是百分之0.001。对于一些更大的几何体,精确度是百分之0.1。另一方面,长度函数,精确到百分之0.00000001。在使用SDO_DISTANCE函数进行两个点几何体之间的距离计算时也是如此。2S
37、DO_AREA这个函数计算了SDO_GEOMETRY对象的面积。程序清单7-26表示了如何计算sales_regions表中销售区域51和43的相交区域的面积注意:单位是sq_yard表示的平方码。SQL SELECT SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(sra.geom, srb.geom, 0.5), 0.5, unit=sq_yard ) areaFROM sales_regions srb, sales_regions sraWHERE sra.id=51 and srb.id=43;AREA-26243.3702程序清单程序清单7-
38、26. 销售区域销售区域43和销售区域和销售区域51的相交区域的面积的相交区域的面积这个面积函数只对多边形、表面或者立方体(或者组合)的几何体有意义。对一个点或者线,面积将为0。对于一个立方体,你可以使用面积函数来计算这个立方体的表面积。为了便于说明,我们将在city_buildings表中插入一个尺寸为200英尺*200英尺*400英尺的新的建筑物。这将更容易理解在这个建筑上进行的面积、长度和体积的计算。程序清单7-27展示了如何把这个建筑插入到city_buildings表中。程序清单程序清单7-27. 在表在表city_buildings中插入一个中插入一个200英尺英尺*200英尺英尺
39、*400英尺的新的建筑物英尺的新的建筑物 SQL insert into city_buildings (id, geom) values (1, - ID of the buildingsdo_geometry(3008, 7407, null,sdo_elem_info_array(1,1007,3), - 3 represents a Solid Box representation- using just the corner pointssdo_ordinate_array(27731202, 42239124, 0, - Min values for x, y, z27731402
40、, 42239324, 400 - Max values for x, y, z);commit; 程序清单7-28举例说明了city_buildings表中建筑物1的表面积的计算。面积函数把立方体的六个面的面积加起来。SQL SELECT id, SDO_GEOM.SDO_AREA(geom, 0.05) SURFACE_AREAFROM city_buildingsWHERE id=1;ID SURFACE_AREA- -1 400000程序清单程序清单7-28. 建筑物建筑物1的表面积(缺省单位是平方英尺)的表面积(缺省单位是平方英尺) 3SDO_LENGTH此函数返回一条线的长度和多边
41、形、平面和立方体的周长。对于点,这个函数返回0。可以使用这个函数来确定多个州际公路的连接路段。通常,这些连接路段在长度上是很短的,通常是1或2英里。在这些连接路段附近开一个新的商店是理想的,因为这个地理位置接近于大多数主要的州际公路。程序清单7-30展示了长度小于1英里的州际公路。这些州际公路通常是连接大多主要的州际公路而且是新业务的理想之地。 程序清单程序清单7-30 确定小于确定小于1英里的州际公路英里的州际公路SQL SELECT interstateFROM us_interstatesWHERE SDO_GEOM.SDO_LENGTH(geom, 0.5, unit=mile) SE
42、LECT SDO_GEOM.SDO_LENGTH(geom, - input geometry0.05, - tolerance valueUNIT=FOOT, - units parameter1 - count_shared_edges only once) LENGTHFROM city_buildingsWHERE id=1;LENGTH-3200.0064000126程序清单程序清单7-32. count_shared_edges设为设为2的建筑物的建筑物1的长度(单位是英尺)的长度(单位是英尺)SQL SELECT SDO_GEOM.SDO_LENGTH(geom, - input
43、 geometry0.05, - tolerance valueUNIT=FOOT, - units parameter2 - count_shared_edges only once) LENGTHFROM city_buildingsWHERE id=1;LENGTH-6400.01280002524SDO_VOLUME如果输入的几何体是三维的立方体或者是多重立方体,那么这个函数将一个几何体和一个容差值作为参数并且返回体积。对所有其他的几何体类型,这个函数返回0。程序清单7-34计算了city_buildings表中建筑物1的体积(缺省单位为立方英尺)。正如先前所提到的,这个建筑的尺寸是2
44、00英尺*200英尺*400英尺,因此体积是200*200*400=16000000立方英尺。程序清单程序清单7-34. 建筑物建筑物1的体积(缺省单位为立方英尺)的体积(缺省单位为立方英尺)SQL set numwidth 15SQL SELECT SDO_GEOM.SDO_VOLUME(GEOM, - INPUT GEOMETRY0.05 - TOLERANCE VALUE) VOLUMEFROM city_buildingsWHERE id=1;VOLUME-160000007.4.2 MBR 函数 如果你想在地图上显示一个几何体,你通常需要确定一个范围也就是,在每一个维度上的下界和上界
45、。你可以使用最小边界矩形(MBR)来达到这个目的。这个矩形通常是由左下角点(所有最小值)和右上角点(所有最大值)确定的。图7-5所示的是一个不同几何体的MBR的例子。图7-5. 不同几何体的SDO_MBR(星花表示MBR的左下角和右上角点) 1SDO_MBRSDO_MBR函数把SDO_GEOMETRY作为一个参数并且计算这个几何体的MBR。它返回的是一个SDO_GEOMETRY对象。程序清单7-36展示了如何获得sales_regions表中的一个指定销售区域的MBR的范围。SQL SELECT SDO_GEOM.SDO_MBR(sr.geom) mbr FROM sales_regions
46、srWHERE sr.id=1;MBR(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO,SDO_ORDINATES)-SDO_GEOMETRY(2003, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),SDO_ORDINATE_ARRAY(-77.049535, 38.8970816, -77.040259, 38.90433)1 row selected.程序清单程序清单7-36. 计算一个几何体的计算一个几何体的MBR 对于一个输入的三维对象,SDO_MBR函数返回一个范围,也就是说,返
47、回这个三维几何体在三个维度上的最小和最大值。程序清单7-37展示了city_buildings表中建筑物1的例子。 程序清单程序清单7-37. 计算一个三维对象的范围计算一个三维对象的范围SQL SELECT SDO_GEOM.SDO_MBR(geom) extentFROM city_buildings cbldgWHERE id=1;EXTENT(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)-SDO_GEOMETRY(3008, 7407, NULL,SDO_ELEM_INFO_ARRAY(1,
48、 1007, 3),SDO_ORDINATE_ARRAY(27731202, 42239124, 0, 27731402, 42239324, 400) SDO_MIN_MBR_ORDINATE和SDO_MAX_MBR_ORDINATE除了获得两个维数上的范围,有时你可能对获得指定的维数上的范围感兴趣。你可以通过SDO_MIN_MBR_ORDINATE和SDO_MAX_MBR_ORDINATE函数来获得指定的维数上的范围,这两个函数返回指定维数上几何体的最小和最大坐标值。程序清单7-39展示了如何在第一个维数上获得范围。你也可以在三维对象上使用这些函数。程序清单7-40展示了在city_bui
49、ldings表中的建筑物1的一个例子。程序清单程序清单7-39.在一个指定维数上获得在一个指定维数上获得MIN_ORDINATE和和MAX_ORDINATESQL SELECT SDO_GEOM.SDO_MIN_MBR_ORDINATE(sr.geom, 1) min_extent,SDO_GEOM.SDO_MAX_MBR_ORDINATE(sr.geom, 1) max_extentFROM sales_regions sr WHERE sr.id=1;MIN_EXTENT MAX_EXTENT- -77.049535 -77.0402591 row selected.程序清单程序清单7-4
50、0. 在第三维上获得在第三维上获得MIN_ORDINATE和和MAX_ORDINATESQL SELECT SDO_GEOM.SDO_MIN_MBR_ORDINATE(geom, 3) min_extent,SDO_GEOM.SDO_MAX_MBR_ORDINATE(geom, 3) max_extentFROM city_buildings cbldgWHERE id=1;MIN_EXTENT MAX_EXTENT- -0 4007.4.3 各种几何分析函数其中: 第一个参数表示一个SDO_GEOMETRY对象; 第二个参数表示这个几何体的容差。(Geometry IN SDO_GEOMET