数据库支持的几何类型有 point、box、lseg、line、path、polygon、circle,因此数据库也提供了一系列的几何函数,具体见下列表格。
几何操作符
操作符 | 功能描述 | 示例 | 结果 |
+ | 转换平移 | box '((0,0),(1,1))' + point '(2.0,0)' | (3,1),(2,0) |
- | 转换平移 | box '((0,0),(1,1))' - point '(2.0,0)' | (-1,1),(-2,0) |
* | 伸展/旋转 | box '((0,0),(1,1))' * point '(2.0,0)' | (2,2),(0,0) |
/ | 伸展/旋转 | box '((0,0),(2,2))' / point '(2.0,0)' | (1,1),(0,0) |
# | 两个图形交接面 | box '((1,-1),(-1,1))' # box '((1,1),(-1,-1))' | (1,1),(-1,-1) |
@-@ | 图形的长度或者周长 | @-@ path '((0,0),(1,0))' | 2 |
@@ | 中心 | @@ circle '((0,0),10)' | (0,0) |
## | 第一个图形与第二个图形最近的点 | point '(0,0)' ## lseg '((2,0),(0,2))' | (1,1) |
<-> | 图形之间的距离 | circle '((0,0),2)' <-> circle '((4,0),1)' | 1 |
&& | 两个图形是否相交 | box '((0,0),(1,2))' && box '((0,0),(2,3))' | t |
<< | 图形1是否严格在图形2的左边 | circle '((0,0),1)' << circle '((5,0),1)' | t |
>> | 图形1是否严格在图形2的右边 | circle '((5,0),1)' >> circle '((0,0),1)' | t |
&< | 图形1的最右边是否不超过图形2的最右边 | box '((0,0),(1,1))' &< box '((0,0),(2,2))' | t |
&> | 图形1的最右边是否不超过图形2的最左边 | box '((0,0),(3,3))' &> box '((0,0),(2,2))' | t |
<<| | 图形1是否严格在图形2下边 | box '((0,0),(2,2))' <<| box '((4,5),(6,6))' | t |
|>> | 图形1是否严格在图形2上边 | box '((5,6),(7,7))' |>> box '((0,0),(4,4))' | t |
<^ | 图形1是否低于图形2(允许接触) | box '((5,6),(7,7))' <^ box '((0,0),(4,4))' | f |
>^ | 图形1是否高于图形2(允许接触) | box '((5,6),(7,7))' >^ box '((0,0),(4,4))' | t |
?# | 相交 | lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))' | t |
?- | 是否水平 | ?- lseg '((-1,0),(1,0))' | t |
?- | 两个图形水平对齐 | point '(1,0)' ?- point '(0,0)' | t |
?| | 是否垂直 | ?| lseg '((-1,0),(1,0))' | f |
?| | 两个图形是否垂直对齐 | point '(1,2)' ?| point '(1,1)' | t |
?-| | 两条线是否垂直 | lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))' | t |
?|| | 两条线是否平行 | lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))' | t |
@> | 图形1是否包含图形2 | circle '((0,0),2)' @> circle '((0,0),1)'' | t |
<@ | 图形1是否被图形2包含 | point '(1,1)' <@ circle '((0,0),2)' | t |
~= | 是否相同 | polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' | t |
几何函数
函数 | 返回值类型 | 描述 | 示例 | 结果 |
area(object) | double precision | 面积 | area(box '((0,0),(1,2))') | 2 |
center(object) | point | 中心点 | center(box '((0,0),(1,2))') | (0.5,1) |
diameter(circle) | double precision | 圆的直径 | diameter(circle '((0,0),2.0)') | 4 |
height(box) | double precision | 高 | height(box '((0,0),(2,3))') | 3 |
isclosed(path) | boolean | 图形是否闭合 | isclosed(path '((0,0),(1,1),(2,0))') | t |
isopen(path) | boolean | 图形是否开放 | isopen(path '[(0,0),(1,1),(2,0)]') | t |
length(object) | double precision | 图形的长度 | length(path '((-1,0),(1,0))') | 2 |
npoints(path) | int | 图形的顶点数 | npoints(path '[(0,0),(1,1),(2,0)]') | 3 |
npoints(polygon) | int | 图形的顶点数 | npoints(polygon '((1,1),(0,0))') | 2 |
radius(circle) | double precision | 圆的半径 | radius(circle '((0,0),2.0)') | 2 |
width(box) | double precision | 水平长度 | width(box '((0,0),(3,2))') | 3 |
几何类型转换函数
函数 | 返回值类型 | 描述 | 示例 | 返回值 |
box(circle) | box | 圆转为矩形 | box(circle '((0,0),3.0)') | (2.12132034355964,2.12132034355964),(-2.12132034355964,-2.12132034355964) (1 row) |
box(point, point) | box | 点转为矩形 | box(point '(0,0)', point '(2,2)') | (2,2),(0,0) |
box(polygon) | box | 多边形转为矩形 | box(polygon '((0,0),(1,1),(2,0))') | (2,1),(0,0) |
circle(box) | circle | 矩形转为圆 | circle(box '((0,0),(2,2))') | <(1,1),1.4142135623731> |
circle(point, double precision) | circle | 中心和半径转为圆 | circle(point '(0,0)', 3.0) | <(0,0),3> |
circle(polygon) | circle | 多边形转为圆 | circle(polygon '((0,0),(1,1),(2,0))') | <(1,0.333333333333333),0.924950591148529> |
lseg(box) | lseg | 矩形转为线段 | lseg(box'((-1,0),(1,0))') | [(1,0),(-1,0)] |
lseg(point, point) | lseg | 多点转为线段 | lseg(point '(-1,0)', point '(1,0)') | [(-1,0),(1,0)] |
path(polygon) | path | polygon to path | path(polygon '((0,0),(1,1),(2,0))') | ((0,0),(1,1),(2,0)) |
point(double precision, double precision) | point | construct point | point(23.4, -44.5) | (23.4,-44.5) |
point(box) | point | 图形中心 | point(box '((-1,0),(1,0))') | (0,0) |
point(circle) | point | 圆的中心 | point(circle '((0,0),2.0)') | (0,0) |
point(lseg) | point | 线段的中心 | point(lseg '((-2,0),(2,0))') | (0,0) |
point(polygon) | point | 多边形的中心 | point(polygon '((0,0),(1,1),(2,0))') | (1,0.333333333333333) |
polygon(box) | polygon | 矩形转为四个点的多边形 | polygon(box '((0,0),(1,1))') | ((0,0),(0,1),(1,1),(1,0)) |
polygon(circle) | polygon | 圆形转为12个点的多边形 | polygon(circle '((0,0),2.0)') | - |
polygon(npts, circle) | polygon | 圆形转为 n 个点的多边形 | polygon(12, circle '((0,0),2.0)') | ((-2,0),(-0.618033988749895,1.90211303259031),(1.61803398874989,1.17557050458495),(1.6180339887499,-1.17557050458495),(-0.618033988749894,-1.90211303259031)) |
polygon(path) | polygon | 路径转为多边形 | polygon(path '((0,0),(1,1),(2,0))') | ((0,0),(1,1),(2,0)) |