PostgreSQL 几何函数和操作符
几何类型point
、box
、 lseg
、line
、path
、 polygon
和circle
有一大堆本地支持函数和操作符,如表 9.35、表 9.36和表 9.37中所示。
表 9.35. 几何操作符
操作符 描述 例子 |
---|
将第二个 |
连接两个打开的路径(如果其中一个路径是关闭的,则返回NULL)。 |
从第一个参数的每个点的坐标中减去第二个 |
将第一个参数的每个点乘上第二个point(将点视为由实部和虚部表示的复数,并执行标准的复数乘法)。 如果将第二个 |
将第一个参数的每个点除以第二个 |
计算总长度。适用于 |
计算中心点。适用于 |
返回点的数量。适用于 |
计算交点,如果没有则为NULL。适用于 |
计算两个方框的交集,如果没有则为NULL。 |
计算第二个对象上离第一个对象最近的点。适用于这些类型对: ( |
计算对象之间的距离。适用于所有七种几何类型,适用于 |
第一个对象包含第二个对象吗? 适用于这些类型对: ( |
第一个对象包含在第二个对象之中还是在第二个对象之上? 适用于这些类型对: ( |
这些对象有重叠吗?(一个共同点使之为真。) 适用于 |
第一个对象完全位于第二个对象的左边吗? 适用于 |
第一个对象完全位于第二个对象的右边吗? 适用于 |
第一个对象没有延伸到第二个对象的右侧吗? 适用于 |
第一个对象没有延伸到第二个对象的左侧吗? 适用于 |
第一个对象是否确定位于第二个对象下面? 适用于 |
第一个对象是否确定位于第二个对象上面? 适用于 |
第一个对象是否没有扩展到第二个对象上面? 适用于 |
第一个对象是否没有扩展到第二个对象下面? 适用于 |
第一个对象是否位于第二个对象下面(允许边缘相切)? |
第一个对象是否确定位于第二个对象下面? (这个操作符命名错误; 它应该是 |
第一个对象是否位于第二个对象上面(允许边缘相切)? |
第一个对象是否确定位于第二个对象上面? (这个操作符命名错误; 它应该是 |
这些对象是否相交? 适用于这些类型对: ( |
线是水平的? |
点是否水平对齐(即具有相同的y坐标)? |
线是纵向的的? |
点是否垂直对齐(即具有相同的x坐标)? |
线是垂直的? |
线是平行的? |
这些对象是相同的吗? 适用于 |
[a] “Rotating”用这些操作符“旋转”一个盒子,只会移动它的角点:这个盒子仍然被认为有平行于轴的边。 因此,盒子的大小并没有像真正的旋转那样得到保留。 |
小心
请注意“same as”操作符(~=
),表示point
、box
、polygon
和circle
类型的一般相等概念。 这些类型中的某些还有一个
=
操作符,但是=
只比较相同的面积。 其它的标量比较操作符 (<=
等等),在这些类型可用的地方,同样比较区域。
注意
在PostgreSQL之前,包含操作符@>
和<@
被分别称为~
和@
。 这些名字仍然可以使用,但是已被废除并且最终将被移除。
表 9.36. 几何函数
表 9.37. 几何类型转换函数
我们可以把一个point
的两个组成数字当作具有索引 0 和 1 的数组访问。例如,如果t.p
是一个point
列,那么SELECT p[0] FROM t
检索 X 座标而 UPDATE t SET p[1] = ...
改变 Y
座标。同样,box
或者lseg
类型的值可以当作两个point
值的数组值看待。