
| 数据类型 | 别名 | 说明 |
|---|---|---|
| point | 平面上的几何点 | |
| line | 平面上的无限线 | |
| lseg | 平面上的线段 | |
| box | 平面上的长方形盒子 | |
| path | 平面上的几何路径 | |
| polygon | 平面上的闭合几何路径 | |
| circle | 在平面上画圈 |

- point, 二维平面上的点,用(x, y)表示,x、y分别表示x轴、y轴的坐标值;
create table demo_point (name text, pt point);
INSERT INTO demo_point (name, pt) VALUES ('p1', '(1.1,22.0)');
INSERT INTO demo_point (name, pt) VALUES ('p2', '(10.1,22.0)');
INSERT INTO demo_point (name, pt) VALUES ('p3', '(1.1,2.0)');
SELECT * FROM demo_point;
SELECT * FROM demo_point WHERE pt ?- '(0,22)';
SELECT * FROM demo_point WHERE pt ?| '(1.1,0)';
# 操作符
# ?-:是否横向齐平(y坐标是否相同)
# ?|:是否纵向齐平(x坐标是否相同)

select '1,1'::point;
select '(1,1)'::point;

- circle, 圆,用圆心和半径表示,如 x, y, r,其中(x,y)为圆心,r为半径。
CREATE table demo_circle (name text, cc circle);
INSERT INTO demo_circle (name, cc) VALUES ('c1', '1,2,2');
INSERT INTO demo_circle (name, cc) VALUES ('c1', '10.2,-15,10');
SELECT * FROM demo_circle WHERE point '(1,2)' <@ cc;
SELECT * FROM demo_circle WHERE cc @> point '(1,2)';
SELECT * FROM demo_circle WHERE cc << circle '10,6,3';
SELECT * FROM demo_circle WHERE cc >> circle '0,0,0.1';
SELECT circle '((0,0),1)' <-> circle '((5,0),1)';
# 操作符
# <@ 点是否位于圆内
# @> 圆是否包含点
# << 圆是否严格在圆的左侧
# >> 圆是否严格在圆的右侧
# <-> 两个圆之间的距离

select '1,1,5'::circle;
select '((1,1),5)'::circle;
select '<(1,1),5>'::circle;
select circle'1,1,5';
select circle'((1,1),5)';
select circle'<(1,1),5>';

- line, 线,在坐标系上用Ax + By + C = 0表示,也就是一个二元一次方程,A、B表示斜率,C表示偏移量。
CREATE TABLE demo_line (name text, info line);
INSERT INTO demo_line VALUES ('c1', '(0,1), (2,3)');
INSERT INTO demo_line VALUES ('c2', '(-5,6), (3,7)');
SELECT * FROM demo_line;
SELECT * FROM demo_line WHERE info ?|| '{1,-1,10}';
SELECT * FROM demo_line WHERE info ?-| '{1,1,10}';
# 操作符
# ?|| 两条线是否平行
# ?-| 两条线是否垂直

select '1,1,2,2'::line;
select '(1,1),(2,2)'::line;
select '((1,1),(2,2))'::line;
select '[(1,1),(2,2)]'::line;
select line'1,1,2,2';
select line'(1,1),(2,2)';
select line'((1,1),(2,2))';
select line'[(1,1),(2,2)]';

- lseg, 线段,用一对线段的端点来表示。
select '1,1,2,2'::lseg;
select '(1,1),(2,2)'::lseg;
select '((1,1),(2,2))'::lseg;
select '[(1,1),(2,2)]'::lseg;
select lseg'1,1,2,2';
select lseg'(1,1),(2,2)';
select lseg'((1,1),(2,2))';
select lseg'[(1,1),(2,2)]';

- box, 矩形,用其对角的点对表示。
- 矩形类型不能使用中括号[]。
select '1,1,2,2'::box;
select '(1,1),(2,2)'::box;
select '((1,1),(2,2))'::box;
select box'1,1,2,2';
select box'(1,1),(2,2)';
select box'((1,1),(2,2))';

- path, 路径,路径由一系列连接的点组成。路径可能是开放的,也就是认为列表中第一个点和最后一个点没有被连接起来;也可能是封闭的,这时认为第一个和最后一个点被连接起来。
- 在路径中,使用方括号[]表示开放路径,而圆括号()表示闭合路径。闭合路径指最后一点与第一个点是连接在一起的。
select '1,1,2,2,3,3,4,4'::path;
select '(1,1),(2,2),(3,3),(4,4)'::path;
select '((1,1),(2,2),(3,3),(4,4))'::path;
select path'1,1,2,2,3,3,4,4';
select path'(1,1),(2,2),(3,3),(4,4)';
select path'((1,1),(2,2),(3,3),(4,4))';
select '[(1,1),(2,2),(3,3),(4,4)]'::path;
select path'[(1,1),(2,2),(3,3),(4,4)]';

- polygon, 多边形,由一系列点代表(多边形的顶点)。
- 多边形类型不能使用中括号[]。
select '1,1,2,2,3,3,4,4'::polygon;
select '(1,1),(2,2),(3,3),(4,4)'::polygon;
select '((1,1),(2,2),(3,3),(4,4))'::polygon;
select polygon'1,1,2,2,3,3,4,4';
select polygon'(1,1),(2,2),(3,3),(4,4)';
select polygon'((1,1),(2,2),(3,3),(4,4))';

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




