9.11. 几何函数和运算符

几何类型pointboxlseglinepathpolygoncircle具有大量本机支持功能和运算符,如Table 9.33Table 9.34Table 9.35所示。

Caution

请注意,“相同”运算符~=代表pointboxpolygoncircle类型的通常的相等概念。其中一些类型也具有=运算符,但是=仅比较相等的* area *。其他标量比较运算符(<=等)同样比较这些类型的面积。

表 9.33. 几何运算符

OperatorDescriptionExample
+Translationbox '((0,0),(1,1))' + point '(2.0,0)'
-Translationbox '((0,0),(1,1))' - point '(2.0,0)'
*Scaling/rotationbox '((0,0),(1,1))' * point '(2.0,0)'
/Scaling/rotationbox '((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))'
@@Center@@ circle '((0,0),10)'
##最接近第二个操作数上第一个操作数的点point '(0,0)' ## lseg '((2,0),(0,2))'
<->Distance betweencircle '((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)'
?#Intersects?lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?-Is horizontal??- lseg '((-1,0),(1,0))'
?-水平对齐?point '(1,0)' ?- point '(0,0)'
?|Is vertical??| lseg '((-1,0),(1,0))'
?|垂直对齐?point '(0,1)' ?| point '(0,0)'
?-|Is perpendicular?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?||Are parallel?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@>Contains?circle '((0,0),2)' @> point '(1,1)'
<@包含在里面还是上面?point '(1,1)' <@ circle '((0,0),2)'
~=Same as?polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

Note

在 PostgreSQL 8.2 之前,包含运算符@><@分别称为~@。这些名称仍然可用,但已过时,最终将被删除。

表 9.34. 几何函数

FunctionReturn TypeDescriptionExample
area(object)double precisionareaarea(box '((0,0),(1,1))')
center(object)pointcentercenter(box '((0,0),(1,2))')
diameter(circle)double precision圆直径diameter(circle '((0,0),2.0)')
height(box)double precision箱体垂直尺寸height(box '((0,0),(1,1))')
isclosed(path)boolean封闭的道路?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)boolean开放的道路?isopen(path '[(0,0),(1,1),(2,0)]')
length(object)double precisionlengthlength(path '((-1,0),(1,0))')
npoints(path)int点数npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)int点数npoints(polygon '((1,1),(0,0))')
pclose(path)path将路径转换为封闭pclose(path '[(0,0),(1,1),(2,0)]')
popen(path)path转换路径以打开popen(path '((0,0),(1,1),(2,0))')
radius(circle)double precision圆半径radius(circle '((0,0),2.0)')
width(box)double precision盒子的水平尺寸width(box '((0,0),(1,1))')

表 9.35. 几何类型转换函数

FunctionReturn TypeDescriptionExample
box(circle)box圈到盒子box(circle '((0,0),2.0)')
box(point)box指向空盒子box(point '(0,0)')
box(point, point)box指向盒子box(point '(0,0)', point '(1,1)')
box(polygon)box多边形到盒子box(polygon '((0,0),(1,1),(2,0))')
bound_box(box, box)box框到边界框bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))')
circle(box)circle框圈circle(box '((0,0),(1,1))')
circle(point, double precision)circle圆心和半径circle(point '(0,0)', 2.0)
circle(polygon)circle多边形到圆circle(polygon '((0,0),(1,1),(2,0))')
line(point, point)line点到线line(point '(-1,0)', point '(1,0)')
lseg(box)lseg框对角线到线段lseg(box '((-1,0),(1,0))')
lseg(point, point)lseg点到线段lseg(point '(-1,0)', point '(1,0)')
path(polygon)path多边形到路径path(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision)pointconstruct pointpoint(23.4, -44.5)
point(box)point盒子中心point(box '((-1,0),(1,0))')
point(circle)point圆心point(circle '((0,0),2.0)')
point(lseg)point线段中心point(lseg '((-1,0),(1,0))')
point(polygon)point多边形中心point(polygon '((0,0),(1,1),(2,0))')
polygon(box)polygon框到 4 点多边形polygon(box '((0,0),(1,1))')
polygon(circle)polygon圆到 12 点多边形polygon(circle '((0,0),2.0)')
polygon(npts, circle)polygon圈到* npts *-点多边形polygon(12, circle '((0,0),2.0)')
polygon(path)polygon多边形的路径polygon(path '((0,0),(1,1),(2,0))')

可以访问point的两个组件号,就好像该点是具有索引 0 和 1 的数组一样。例如,如果t.ppoint列,则SELECT p[0] FROM t检索 X 坐标,而UPDATE t SET p[1] = ...更改 Y 坐标。以相同的方式,类型boxlseg的值可以视为两个point值的数组。

area函数适用于boxcirclepath类型。如果path中的点不相交,则area函数仅适用于path数据类型。例如,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的内容。