几何函数和操作符

最近更新时间:2019-04-22 11:06:08

数据库支持的几何类型有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))