金仓数据库 KingbaseGIS 使用手册(6.10. 几何对象操作运算符)

6.10. 几何对象操作运算符

6.10.1. &&

&& — 如果输入对象A的2D bounding box与输入对象B的2D bounding box有交集,则返回TRUE

用法

boolean &&( geometry A , geometry B );
boolean &&( geography A , geography B );

描述

如果输入对象A的2D bounding box与输入对象B的2D bounding box有交集,则返回TRUE

注意

该操作符会利用几何对象上任何可用的索引

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 && tbl2.column2 AS
overlaps FROM ( VALUES
(1, 'LINESTRING(0 0, 3 3)'::geometry),
(2, 'LINESTRING(0 1, 0 5)'::geometry)) AS tbl1,
( VALUES
(3, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;

column1  | column1 | overlaps
---------+---------+----------
1        | 3       | t
2        | 3       | f
(2 rows)

参考

|&>,&>,&<|,&<, ~, @

6.10.2. &&&

&&& —如果输入对象A的n-D bounding box与输入对象B的n-D bounding box有交集,则返回TRUE。

用法

boolean &&&( geometry A , geometry B );

描述

如果输入对象A的n-D bounding box与输入对象B的n-D bounding box有交集,则返回TRUE.

注意

该运算符可以利用几何对象上的任何索引。

样例: 3D LineStrings

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS
overlaps_3d, tbl1.column2 && tbl2.column2 AS overlaps_2d
FROM ( VALUES
(1, 'LINESTRING Z(0 0 1, 3 3 2)'::geometry),
(2, 'LINESTRING Z(1 2 0, 0 5 -1)'::geometry)) AS tbl1,
( VALUES
(3, 'LINESTRING Z(1 2 1, 4 6 1)'::geometry)) AS tbl2;

column1  | column1 | overlaps_3d | overlaps_2d
---------+---------+-------------+-------------
1        | 3       | t           |  t
2        | 3       | f           |  t

样例: 3M LineStrings

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS
overlaps_3zm, tbl1.column2 && tbl2.column2 AS overlaps_2d
FROM ( VALUES
(1, 'LINESTRING M(0 0 1, 3 3 2)'::geometry),
(2, 'LINESTRING M(1 2 0, 0 5 -1)'::geometry)) AS tbl1,
( VALUES
(3, 'LINESTRING M(1 2 1, 4 6 1)'::geometry)) AS tbl2;

column1  | column1 | overlaps_3zm| overlaps_2d
---------+---------+-------------+-------------
1        | 3       | t           |  t
2        | 3       | f           |  t

参考

&&

6.10.3. &<

&< — 如果输入几何对象A的bounding box与输入几何对象B的bounding box重合或者在后者的右边,则返回TRUE

用法

boolean &<( geometry A , geometry B );

描述

如果输入几何对象A的bounding box与输入几何对象B的bounding box重合或者在后者的左边,则返回TRUE。或者更准确地说,覆盖或者不在输入几何对象B 的bounding box的右侧。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &< tbl2.column2 AS overleft
FROM
( VALUES
(1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2;

column1  | column1 | overleft
---------+---------+----------
1        | 2       | f
1        | 3       | f
1        | 4       | t
(3 rows)

参考

&&, |&>, &>, &<|

6.10.4. &<|

&<| — 如果A的bounding box覆盖或在B的bounding box的下侧,则返回TRUE。

用法

boolean &<|( geometry A , geometry B );

描述

如果A的bounding box覆盖或在B的bounding box的下侧,则返回TRUE,或者更准确地说覆盖或者不在输入几何对象B的 bounding box的上侧。

  • 该函数支持CircularString和Curve几何类型对象。

  • 该函数支持 Polyhedral Surface类型几何对象。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &<| tbl2.column2 AS overbelow FROM
( VALUES
(1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;

column1  | column1 | overbelow
---------+---------+-----------
1        | 2       | f
1        | 3       | t
1        | 4       | t
(3 rows)

参考

&&, |&>, &>, &<

6.10.5. &>

&> —如果A的bounding box覆盖或在B的bounding box的右侧,则返回TRUE。

用法

boolean &>( geometry A , geometry B );

描述

如果A的bounding box覆盖或在B的bounding box的右侧,则返回TRUE,或者更准确地说覆盖或者不在输入几何对象B的bounding box的左侧。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &> tbl2.column2 AS overright FROM
( VALUES
(1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2;

column1    | column1 | overright
-----------+---------+-----------
1          |2        | t
1          |3        | t
1          |4        | f
(3 rows)

参考

&&, |&>, &<|, &<

6.10.6. <<

<< — 如果A的bounding box严格地在B的bounding box左侧,则返回TRUE。

用法

boolean <<( geometry A , geometry B );

描述

如果A的bounding box严格地在B的bounding box左侧,则返回TRUE。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1,
FROM
( VALUES
(1, 'LINESTRING (1
( VALUES
(2, 'LINESTRING (0
(3, 'LINESTRING (6
(4, 'LINESTRING (2
tbl2.column1, tbl1.column2 << tbl2.column2 AS left
2, 1 5)'::geometry)) AS tbl1,
0, 4 3)'::geometry),
0, 6 5)'::geometry),
2, 5 6)'::geometry)) AS tbl2;

column1  | column1 | left
---------+---------+------
1        | 2       | f
1        | 3       | t
1        | 4       | t
(3 rows)

参考

>>, |>>, <<|

6.10.7. <<|

<<| —如果A的bounding box严格地在B的bounding box下侧,则返回TRUE

用法

boolean <<|( geometry A , geometry B );

描述

如果A的bounding box严格地在B的bounding box下侧,则返回TRUE

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1,
FROM
( VALUES
(1, 'LINESTRING (0
( VALUES
tbl2.column1, tbl1.column2 <<| tbl2.column2 AS below
0, 4 3)'::geometry)) AS tbl1,
(2, LINESTRING (1 4, 1 7)'::geometry),
(3, 'LINESTRING (6
(4, 'LINESTRING (2
1, 6 5)'::geometry),
3, 5 6)'::geometry)) AS tbl2;

column1  | column1 | below
---------+---------+-------
1        | 2       | t
1        | 3       | f
1        | 4       | f
(3 rows)

参考

<<, >>, |>>

6.10.8. =

= — 当 geometry/geography 类型的对象坐标点序列的值和顺序都相同时,返回 true。

用法

boolean =( geometry A , geometry B );
boolean =( geography A , geography B );

描述

当 geometry/geography 类型的对象坐标点序列的值和顺序都相同时,返回 true。 KingbaseES使用针对几何对象定义的运算符=,<和>来进行内部排序和几何对象的比较(例如在GROUP BY或ORDER BY这样的SQL子句中)。

注意

只有当 geometry/geography 类型的对象在所有方面都相同:相同的坐标点,相同的坐标点顺序,该操作符才会将它们判定为相等。 对于“空间等价性”,可能会忽略坐标点的顺序,将具有不同表示形式,但覆盖了相同空间范围的对象判定为等价。此时应考虑使用 ST_OrderingEquals 或 ST_Equals。

警告

该运算符不会利用几何对象上的索引。如果希望利用索引来检测等价性,请联合使用 = 和 && 操作符。

  • 该函数支持CircularString和Curve几何类型对象

  • 该函数支持 Polyhedral Surface类型几何对象.

样例

SELECT 'LINESTRING(0 0, 0 1, 1 0)'::geometry = 'LINESTRING(1 1, 0 0)'::geometry;

?column?
----------
t
(1 row)

SELECT ST_AsText(column1)FROM ( VALUES
('LINESTRING(0 0, 1 1)'::geometry),
('LINESTRING(1 1, 0 0)'::geometry)) AS foo;

st_astext
---------------------
LINESTRING(0 0,1 1)
LINESTRING(1 1,0 0)
(2 rows)


注意:此处的 GROUP BY 子句使用 = 号比较几何对象的相等性。
SELECT ST_AsText(column1)
FROM ( VALUES
('LINESTRING(0 0, 1 1)'::geometry),
('LINESTRING(1 1, 0 0)'::geometry)) AS foo
GROUP BY column1;

st_astext
---------------------
LINESTRING(0 0,1 1)(1 row)

SELECT ST_GeomFromText('POINT(1707296.37 4820536.77)') =
ST_GeomFromText('POINT(1707296.27 4820536.87)') As pt_intersect;

pt_intersect
-------------
f

参考

ST_Equals, ST_OrderingEquals

6.10.9. >>

>> — 如果几何对象A的bounding box严格在几何对象B的右边,则返回true。

用法

boolean >>( geometry A , geometry B );

描述

如果几何对象A的bounding box严格在几何对象B的右边,则返回true。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 >> tbl2.column2 AS right
FROM
( VALUES
(1, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (1 4, 1 7)'::geometry),
(3, 'LINESTRING (6 1, 6 5)'::geometry),
(4, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl2;

column1  | column1 | right
---------+---------+-------
1        | 2       | t
1        | 3       | f
1        | 4       | f
(3 rows)

参考

<<, |>>, <<|

6.10.10. @

@ —如果几何对象A的bounding box被几何对象B的bounding box严格包含,则返回true。

用法

boolean @( geometry A , geometry B );

描述

如果几何对象A的bounding box被几何对象B的bounding box严格包含,则返回true。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 @ tbl2.column2 AS contained
FROM
( VALUES
(1, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0, 4 4)'::geometry),
(3, 'LINESTRING (2 2, 4 4)'::geometry),
(4, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl2;

column1  | column1 | contained
---------+---------+-----------
1        | 2       | t
1        | 3       | f
1        | 4       | t
(3 rows)

参考

~, &&

6.10.11. |&>

|&> —如果几何对象A的bounding box覆盖B的bounding box或在B的bounding box上面,则返回true

用法

boolean |&>( geometry A , geometry B );

描述

如果几何对象A的bounding box覆盖B的bounding box或在B的bounding box上面,则返回true,或者更精确的说覆盖B的boundingbox或者不在B的bounding box下面。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 |&> tbl2.column2 AS overabove
FROM
( VALUES
(1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING(0 0, 3 3)'::geometry),
(3, 'LINESTRING(0 1, 0 5)'::geometry),
(4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;

column1  | column1 | overabove
---------+---------+-----------
1        | 2       | t
1        | 3       | f
1        | 4       | f
(3 rows)

参考

&&, &>, &<|, &<

6.10.12. |>>

|>> — 如果A的bounding box严格地在B的bounding box上面,则返回TRUE。

用法

boolean |>>( geometry A , geometry B );

描述

如果A的bounding box严格地在B的bounding box上面,则返回TRUE。

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 |>> tbl2.column2 AS above
FROM
( VALUES
(1, 'LINESTRING (1 4, 1 7)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0, 4 2)'::geometry),
(3, 'LINESTRING (6 1, 6 5)'::geometry),
(4, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl2;

column1  | column1 | above
---------+---------+-------
1        | 2       | t
1        | 3       | f
1        | 4       | f
(3 rows)

参考

<<, >>, <<|

6.10.13. ~

~ —如果A的bounding box包含B的bounding box,则返回TRUE

用法

boolean ~( geometry A , geometry B );

描述

如果A的bounding box包含B的bounding box,则返回TRUE

注意

该运算符可以利用几何对象上的任何索引。

样例

SELECT tbl1.column1, tbl2.column1, tbl1.column2 ~ tbl2.column2 AS contains
FROM
( VALUES
(1, 'LINESTRING (0 0, 3 3)'::geometry)) AS tbl1,
( VALUES
(2, 'LINESTRING (0 0, 4 4)'::geometry),
(3, 'LINESTRING (1 1, 2 2)'::geometry),
(4, 'LINESTRING (0 0, 3 3)'::geometry)) AS tbl2;


column1  | column1 | contains
---------+---------+----------
1        | 2       | f
1        | 3       | t
1        | 4       | t
(3 rows)

参考

@,&&

6.10.14. ~=

~= —如果A的bounding box和B的bounding box相同,则返回TRUE。

用法

boolean ~=( geometry A , geometry B );

描述

如果A的bounding box和B的bounding box相同,则返回TRUE。

注意

该运算符可以利用几何对象上的任何索引。

  • 该函数支持 Polyhedral Surface类型几何对象。

样例

select 'LINESTRING(0 0, 1 1)'::geometry ~= 'LINESTRING(0 1, 1 0)'::geometry as equality;
equality         |
-----------------+----------
t                |

参考

ST_Equals, ST_OrderingEquals, =

6.10.15. <->

<-> — 返回两个几何对象之间的 2D 距离。

用法

double precision <->( geometry A , geometry B );
double precision <->( geography A , geography B );

描述

返回两个几何对象之间的 2D 距离。 用于在 ORDER BY 子句中利用索引查找最近邻结果集。 对于 geography 类型,会返回椭球面上的距离。

注意

该运算符可以利用几何对象上任何 2D GiST 索引。该运算符和其他运算符不同的是,空间索引使用只能用于ORDER BY 子句的场景。

注意

如果输入参数的其中一个几何对象是一个常量(不在子查询中),例如'SRID=3005;POINT(1011102450541)'::geometry则使用索引,如果运算符左边或右边均为普通的geometry,那么不会使用索引

样例

  SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
  FROM va2005
  ORDER BY d limit 10;

  d                 | edabbr | vaabbr
  ------------------+--------+--------
  0                 | ALQ    | 128
  5541.57712511724  | ALQ    | 129A
  5579.67450712005  | ALQ    | 001
  6083.4207708641   | ALQ    | 131
  7691.2205404848   | ALQ    | 003
  7900.75451037313  | ALQ    | 122
  8694.20710669982  | ALQ    | 129B
  9564.24289057111  | ALQ    | 130
  12089.665931705   | ALQ    | 127
  18472.5531479404  | ALQ    | 002
  (10 rows)

KNN算法的原始结果:
SELECT st_distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10;

d                 | edabbr | vaabbr
------------------+--------+--------
0                 | ALQ    | 128
5579.67450712005  | ALQ    | 001
5541.57712511724  | ALQ    | 129A
8694.20710669982  | ALQ    | 129B
9564.24289057111  | ALQ    | 130
6083.4207708641   | ALQ    | 131
12089.665931705   | ALQ    | 127
24795.264503022   | ALQ    | 124
24587.6584922302  | ALQ    | 123
26764.2555463114  | ALQ    | 125
(10 rows)

注意在实际距离排序上排错的项,以及实际显示在前十位的不同的项。 最后,混合的结果为:

WITH index_query AS (
SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry LIMIT 100)
SELECT *
FROM index_query
ORDER BY d limit 10;

d                 | edabbr | vaabbr
------------------+--------+--------
0                 | ALQ    | 128
5541.57712511724  | ALQ    | 129A
5579.67450712005  | ALQ    | 001
6083.4207708641   | ALQ    | 131
7691.2205404848   | ALQ    | 003
7900.75451037313  | ALQ    | 122
8694.20710669982  | ALQ    | 129B
9564.24289057111  | ALQ    | 130
12089.665931705   | ALQ    | 127
18472.5531479404  | ALQ    | 002
(10 rows)

参考

ST_DWithin, ST_Distance,<#>

6.10.16. |=|

|=| — 返回两条轨迹之间的3D距离。

用法

double precision |=|( geometry A , geometry B );

描述

|=|运算符返回两条轨迹之间的3D距离(参见 ST_IsValidTrajectory)。

这与 ST_DistanceCPA 函数功能相同,但作为一个操作符,它可以被用来基于 N 维索引进行最近邻搜索。

注意

该运算符可以利用几何对象上的 N 维 GiST 索引。它与其它操作符的不同之处在于,只有用在 ORDER BY 子句中时才会利用空间索引。

注意

该运算符只有在几何对象之一是常量(不是在子查询或CTE中)的时候才会使用索引,例如:'SRID=3005;LINESTRINGM(0 0 0,0 0 1)'::geometry 。

样例

将一条查询产生的轨迹保存在 ksql 变量中。

\set qt 'ST_AddMeasure(ST_MakeLine(ST_MakePointM(-350,300,0),ST_MakePointM(-410,490,0)),10,20)'

SELECT track_id, dist FROM (
SELECT track_id, ST_DistanceCPA(tr,:qt) dist
FROM trajectories
ORDER BY tr |=| :qt
LIMIT 5
) foo;

track_id        dist
----------+-------------------
      395 | 0.576496831518066
      380 |  5.06797130410151
      390 |  7.72262293958322
      385 |   9.8004461358071
      405 |  10.9534397988433
(5 rows)

参考

ST_DistanceCPA, ST_ClosestPointOfApproach, ST_IsValidTrajectory

6.10.17. <#>

<#> —返回两个几何对象的bounding box之间的距离。该运算符会使用浮点精度(相对于基本的几点对象所使用的double双精度)。对于其他几何类型,返回的是bounding box的中心点之间的双精度输出距离。在距离排序和使用KNN 功能进行近邻限制输出对象个数时候很有用。

用法

double precision <#>( geometry A , geometry B );

描述

<#>运算符计算两个单精度的bounding box之间的距离,如果有空间索引,则使用空间索引。该函数对于使用近邻计算后距离排序很有用。

注意

该运算符可以利用几何对象上任意索引。该运算符和其他运算符不同的是,空间索引使用只能用于ORDER BY 子句的场景。

注意

该运算符只有在几何对象之一是常量的时候,例如ORDER BY (ST_GeomFromText('POINT(1 2)') <#> geom)会使用索引,如果是g1.geom<#>g2.geom则不使用索引。

样例

SELECT * FROM (
SELECT b.tlid, b.mtfcc,
b.geom <#> ST_GeomFromText('LINESTRING(746149 2948672,745954 2948576,
745787 2948499,745740 2948468,745712 2948438,
745690 2948384,745677 2948319)',2249) As b_dist,
ST_Distance(b.geom, ST_GeomFromText('LINESTRING(746149 2948672,745954
2948576,
745787 2948499,745740 2948468,745712 2948438,
745690 2948384,745677 2948319)',2249)) As act_dist
FROM bos_roads As b
ORDER BY b_dist, b.tlid LIMIT 100) As foo
ORDER BY act_dist, tlid LIMIT 10;

Tlid      | mtfcc  | b_dist           |act_dist
----------+--------+------------------+-------------------------
85732027  | S1400  | 0                | 0
85732029  | S1400  | 0                | 0
85732031  | S1400  | 0                | 0
85734335  | S1400  | 0                | 0
85736037  | S1400  | 0                | 0
624683742 | S1400  | 0                | 128.528874268666
85719343  | S1400  | 260.839270432962 | 260.839270432962
85741826  | S1400  | 164.759294123275 | 260.839270432962
85732032  | S1400  | 277.75           | 311.830282365264
85735592  | S1400  | 222.25           | 311.830282365264
(10 rows)

参考

ST_DWithin, ST_Distance, <->

6.10.18. <<->>

<<->> — 返回两个几何对象的边界框中心之间的3D距离。

用法

double precision <<->>( geometry A , geometry B );

描述

<#>运算符返回两个几何对象的边界框中心之间的3D距离。 它适用于做最近邻搜索时按近似距离对几何对象进行排序。

注意

该运算符可以利用几何对象上的 N 维空间索引。它与其它操作符的不同之处在于,只有用在 ORDER BY 子句中时才会利用空间索引。

注意

该运算符只有在几何对象之一是常量(不是在子查询或CTE中)的时候才会使用索引,例如:'SRID=3005;POINT(1011102 450541)'::geometry 。

参考

<<#>>, <->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值