其他数据类型能保存多个值:MULTIPOINT、MULTILINESTRING 、MULTIPOLYGON 、GEOMETRYCOLLECTION 。GEOMETRYCOLLECTION能保存任意类型的对象集合。对于其他集合类型,MULTIPOINT、MULTILINESTRING、MULTIPOLYGON和GEOMETRYCOLLECTION,仅限于具有特定几何类型的集合成员。
2.3.2.2 MySQL创建几何值的函数:
? GeometryCollection(g1,g2,...)构造WKB GeometryCollection。如果任何参量不是构造良好的几何对象WKB表达式,返回值为NULL。
? LineString(pt1,pt2,...)从多个WKB Point参量构造WKB LineString值。如果任何参量不是WKB Point,返回值为NULL。如果Point参量的数目小于2,返回值为NULL。 ? MultiLineString(ls1,ls2,...)使用WKB LineString参量构造WKB MultiLineString值。如果任何参量不是WKB LineString,返回值为NULL。
? MultiPoint(pt1,pt2,...)使用WKB Point参量构造WKB MultiPoint值。如果任何参量不是WKB Point,返回值为NULL。
? MultiPolygon(poly1,poly2,...)从一组WKB Polygon参量构造WKB MultiPolygon值。如果任何参量不是WKB Polygon,返回值为NULL。 ? Point(x,y)使用其坐标构造WKB Point。
? Polygon(ls1,ls2,...)从多个WKB LineString参量构造WKB Polygon值。如果任何参量未表示为LinearRing的WKB形式(即,非封闭和简单LineString),返回值为NULL。 2.3.2.3 Geometry格式转换函数
? AsBinary(g)将采用内部几何格式的值转换为其WKB表示,并返回二进制结果。 ? AsText(g)将采用内部几何格式的值转换为其WKT表示,并返回字符串结果。 ? GeomFromText(wkt[,srid])将字符串值从其WKT表示转换为内部几何格式,并返回结果。
? GeomFromWKB(wkb[,srid])将二进制值从其WKB表示转换为内部几何格式,并返回结果。 19.5.2.1. 通用几何函数
? Dimension(g) 返回几何值g的固有维数。结果可以是-1、0、1或2。
? Envelope(g)返回几何值g的最小边界矩形(MBR)。结果以Polygon值的形式返
18
回。
? 多边形(polygon)是由边界框的顶点定义的:POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
? GeometryType(g)以字符串形式返回几何类型的名称,几何实例g是几何类型的成员。该名称与可实例化几何子类之一对应。
? SRID(g)返回指明了几何值g的空间参考系统ID的整数。 2.3.2.4 Point函数
? X(p)以双精度数值返回点p的X坐标值。 ? Y(p)以双精度数值返回点p的Y坐标值。 2.3.2.5 LineString函数
? EndPoint(ls)返回LineString值1s的最后一个点的Point。
? GLength(ls)以双精度数值返回LineString值1s在相关的空间参考系中的长度。 ? NumPoints(ls)返回LineString值1s中的点数。
? PointN(ls,n)返回LineString值1s中的第n个点。点编号从1开始。 ? StartPoint(ls)返回LineString值1s的第一个点的Point。 2.3.2.6 MultiLineString函数
? GLength(mls)以双精度数值形式返回MultiLineString值m1s的长度。mls的长度等于其元素的长度之和。
? IsClosed(mls)如果MultiLineString值m1s是封闭的(即StartPoint()和EndPoint()值对m1s中的每个LineString是相同的)返回1。如果mls是非封闭的,返回0,如果它是NULL,返回-1。 2.3.2.7 Polygon函数
? Area(poly)以双精度数值形式返回Polygon值poly的面积,根据在其空间参考系中的测量值。
? ExteriorRing(poly)以LineString形式返回Polygon值poly的外环。
? InteriorRingN(poly,n)以LineString形式返回Polygon值poly的第n个内环。环编号从1开始。
? NumInteriorRings(poly)返回Polygon值poly的内环的数目。
19
2.3.2.8 MultiPolygon函数
? Area(mpoly)以双精度数值形式返回MultiPolygon值mpoly的面积,根据在其空间参考系中的测量结果。 2.3.2.9 GeometryCollection函数
? GeometryN(gc,n)返回GeometryCollection值gc中第n个几何对象。几何对象的编号从1开始。
? NumGeometries(gc)返回GeometryCollection值gc中几何对象的数目。 2.3.2.10 关于几何最小边界矩形(MBR)的关系
MySQL提供了一些可测试两个几何对象g1和g2最小边界矩形之间关系的函数。它们包括:
? MBRContains(g1,g2)返回1或0以指明g1的最小边界矩形是否包含g2的最小边界矩形。
? MBRDisjoint(g1,g2)返回1或0以指明两个几何变量g1和g2的最小边界矩形是否不相交。
? MBREqual(g1,g2)返回1或0以指明两个几何变量g1和g2的最小边界矩形是否相同。
? MBRIntersects(g1,g2)返回1或0以指明两个几何变量g1和g2的最小边界矩形是否相交。
? MBROverlaps(g1,g2)返回1或0以指明两个几何变量g1和g2的最小边界矩形是否交迭。
? MBRTouches(g1,g2)返回1或0以指明两个几何变量g1和g2的最小边界矩形是否接触。
? MBRWithin(g1,g2)返回1或0以指明g1的最小边界矩形是否位于g2的最小边界矩形内。
2.4 相关设计模式概述
2.4.1 设计模式的发展历史
模式的核心思想是总结和积累前人成功的设计经验,通过对这些经验的学习使得人们在面对新的设计问题时不用一切都从零开始,而是尽量套用己有的模式以提高生产效率。模式
20
体现了复用的思想。
模式的研究起源于20世纪70年代建筑工程设计大师ChristopherAlexander,他发表了很多关于城市规划和建筑设计的著作,其中明确提出了模式概念。发人员的青睐;进入90年代,面向对象的重点已经从语言转移到设计方法学方面,尽管还不成熟,但陆续提出了一些面向对象的开发方法和设计技术。随之面向对象设计模式才初露端倪。1995年由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四人合著的《设计模式——可复用面向对象软件的基础》(简称GoF设计模式)书出版,他们对大量项目中的可重用思想进行了收集、分析并加以概括整理,最终形成了23个经典模式。GoF的“设计模式”是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。
2.4.2 设计模式的定义与基本要素
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
1. 模式名称(pattern name)
一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当的模式名也是我们设计模式编目工作的难点之一。
2. 问题(problem)
描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
3. 解决方案(solution)
描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,
21
而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
4. 效果(consequences)
描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
2.4.3 设计模式的作用
面向对象设计者在软件开发时经常遇到一些问题,比如将系统分解成对象集合,同时要考虑许多因素:封装、粒度、依赖关系、性能、复用等等,有时这些因素通常还是相互冲突的。再比如,一些Java程序员在实际开发中,很少使用到面向对象的接口或抽象类,经常以那些技术只适合大型项目为由,避开或忽略它们,其实,Java的接口和抽象类是真正体现面向对象思想的核心所在。这些类似问题的原因是,开发人员对于面向对象的理解只停留在了语言层,而没有深入到设计模式中去。
设计模式并不是一种具体“技术”,它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,GoF的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
需要指出的是,设计模式并不保证成功。一个设计模式的描述表明该模式什么时候是可适用的,但是只有经验的积累才能更好地确保何时一个特定的设计模式能够改良一个设计。
2.4.4 Gof设计模式的简介
GoF在《Design Pattern》中总结出23种经典模式,各种设计模式在粒度和抽象层次上各有不同,对它们进行分类有助于更快的学习和使用模式,主要使用下面两条准则对模式进行分类。
依据其目的可分为:创建型(Creational)、结构型(Structural)、和行为型(Behavioral)三种。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互作用和怎样分配职责进行描述。
依据应用范围可分为:类模式和对象模式。指定模式主要是用于类还是用于对象。类模
22