几何类型point、box、 lseg、line、path、 polygon和circle有一大堆本地支持函数和操作符,如Table 9.33、Table 9.34和Table 9.35中所示。
注意,“相同”操作符 ~= 表示 point、box、polygon 和 circle 类型通常意义上的相等。其中一些类型也有 = 操作符,但 = 仅比较面积是否相等。这些类型的其他标量比较操作符(<= 等)同样比较面积。
Table 9.33. 几何操作符
| 操作符 | 描述 | 示例 |
|---|---|---|
+ |
平移 | box '((0,0),(1,1))' + point '(2.0,0)' |
- |
平移 | box '((0,0),(1,1))' - point '(2.0,0)' |
* |
缩放/旋转 | box '((0,0),(1,1))' * point '(2.0,0)' |
/ |
缩放/旋转 | box '((0,0),(2,2))' / point '(2.0,0)' |
# |
相交的点或盒子 | box '((1,-1),(-1,1))' # box '((1,1),(-2,-2))' |
# |
路径或多边形中的点数 | # path '((1,0),(0,1),(-1,0))' |
@-@ |
长度或周长 | @-@ path '((0,0),(1,0))' |
@@ |
中心 | @@ circle '((0,0),10)' |
## |
第二个操作数上距离第一个操作数最近的点 | point '(0,0)' ## lseg '((2,0),(0,2))' |
<-> |
两者之间的距离 | circle '((0,0),1)' <-> circle '((5,0),1)' |
&& |
是否重叠?(有一个公共点即为真。) | box '((0,0),(1,1))' && box '((0,0),(2,2))' |
<< |
是否严格位于左侧? | circle '((0,0),1)' << circle '((5,0),1)' |
>> |
是否严格位于右侧? | circle '((5,0),1)' >> circle '((0,0),1)' |
&< |
是否未超出对方的右边界? | box '((0,0),(1,1))' &< box '((0,0),(2,2))' |
&> |
是否未超出对方的左边界? | box '((0,0),(3,3))' &> box '((0,0),(2,2))' |
<<| |
是否严格位于下方? | box '((0,0),(3,3))' <<| box '((3,4),(5,5))' |
|>> |
是否严格位于上方? | box '((3,4),(5,5))' |>> box '((0,0),(3,3))' |
&<| |
是否未超出对方的上边界? | box '((0,0),(1,1))' &<| box '((0,0),(2,2))' |
|&> |
是否未超出对方的下边界? | box '((0,0),(3,3))' |&> box '((0,0),(2,2))' |
<^ |
是否位于下方(允许接触)? | circle '((0,0),1)' <^ circle '((0,5),1)' |
>^ |
是否位于上方(允许接触)? | circle '((0,5),1)' >^ circle '((0,0),1)' |
?# |
是否相交? | lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))' |
?- |
是否水平? | ?- lseg '((-1,0),(1,0))' |
?- |
是否水平对齐? | point '(1,0)' ?- point '(0,0)' |
?| |
是否竖直? | ?| lseg '((-1,0),(1,0))' |
?| |
是否竖直对齐? | point '(0,1)' ?| point '(0,0)' |
?-| |
是否垂直? | lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))' |
?|| |
是否平行? | lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))' |
@> |
是否包含? | circle '((0,0),2)' @> point '(1,1)' |
<@ |
是否位于内部或边界上? | point '(1,1)' <@ circle '((0,0),2)' |
~= |
是否相同? | polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' |
在 PostgreSQL 8.2 之前,包含操作符 @> 和 <@ 分别称为 ~ 和 @。这些名称仍然可用,但已被弃用,最终将被移除。
Table 9.34. 几何函数
| 函数 | 返回类型 | 描述 | 示例 |
|---|---|---|---|
|
double precision |
area | area(box '((0,0),(1,1))') |
|
point |
center | center(box '((0,0),(1,2))') |
|
double precision |
圆的直径 | diameter(circle '((0,0),2.0)') |
|
double precision |
盒子的竖直尺寸 | height(box '((0,0),(1,1))') |
|
boolean |
是否为闭合路径? | isclosed(path '((0,0),(1,1),(2,0))') |
|
boolean |
是否为开放路径? | isopen(path '[(0,0),(1,1),(2,0)]') |
|
double precision |
length | length(path '((-1,0),(1,0))') |
|
int |
点数 | npoints(path '[(0,0),(1,1),(2,0)]') |
|
int |
点数 | npoints(polygon '((1,1),(0,0))') |
|
path |
将路径转换为闭合路径 | pclose(path '[(0,0),(1,1),(2,0)]') |
|
path |
将路径转换为开放路径 | popen(path '((0,0),(1,1),(2,0))') |
|
double precision |
圆的半径 | radius(circle '((0,0),2.0)') |
|
double precision |
盒子的水平尺寸 | width(box '((0,0),(1,1))') |
Table 9.35. 几何类型转换函数
我们可以把一个point的两个组成数字当作具有索引 0 和 1 的数组访问。例如,如果t.p是一个point列,那么SELECT p[0] FROM t检索 X 坐标而 UPDATE t SET p[1] = ...改变 Y 坐标。同样,box或者lseg类型的值可以当作两个point值的数组值看待。
area 函数适用于 box、circle 和 path 类型。对于 path 数据类型,只有当 path 中的点构成的路径不自相交时,area 函数才能工作。例如,path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH 无法使用;但下面这个视觉上相同的 path '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH 可以使用。如果难以理解自相交与非自相交 path 的区别,可以把上述两条 path 并排画在方格纸上。