1--
2-- POLYGON
3--
4-- polygon logic
5--
6
7CREATE TABLE POLYGON_TBL(f1 polygon);
8
9
10INSERT INTO POLYGON_TBL(f1) VALUES ('(2.0,0.0),(2.0,4.0),(0.0,0.0)');
11
12INSERT INTO POLYGON_TBL(f1) VALUES ('(3.0,1.0),(3.0,3.0),(1.0,0.0)');
13
14-- degenerate polygons
15INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,0.0)');
16
17INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,1.0),(0.0,1.0)');
18
19-- bad polygon input strings
20INSERT INTO POLYGON_TBL(f1) VALUES ('0.0');
21
22INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0 0.0');
23
24INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2)');
25
26INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2,3');
27
28INSERT INTO POLYGON_TBL(f1) VALUES ('asdf');
29
30
31SELECT '' AS four, * FROM POLYGON_TBL;
32
33-- overlap
34SELECT '' AS three, p.*
35   FROM POLYGON_TBL p
36   WHERE p.f1 && '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
37
38-- left overlap
39SELECT '' AS four, p.*
40   FROM POLYGON_TBL p
41   WHERE p.f1 &< '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
42
43-- right overlap
44SELECT '' AS two, p.*
45   FROM POLYGON_TBL p
46   WHERE p.f1 &> '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
47
48-- left of
49SELECT '' AS one, p.*
50   FROM POLYGON_TBL p
51   WHERE p.f1 << '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
52
53-- right of
54SELECT '' AS zero, p.*
55   FROM POLYGON_TBL p
56   WHERE p.f1 >> '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
57
58-- contained
59SELECT '' AS one, p.*
60   FROM POLYGON_TBL p
61   WHERE p.f1 <@ polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
62
63-- same
64SELECT '' AS one, p.*
65   FROM POLYGON_TBL p
66   WHERE p.f1 ~= polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
67
68-- contains
69SELECT '' AS one, p.*
70   FROM POLYGON_TBL p
71   WHERE p.f1 @> polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
72
73--
74-- polygon logic
75--
76-- left of
77SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' << polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS false;
78
79-- left overlap
80SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' << polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS true;
81
82-- right overlap
83SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' &> polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS false;
84
85-- right of
86SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' >> polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS false;
87
88-- contained in
89SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' <@ polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS false;
90
91-- contains
92SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' @> polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS false;
93
94SELECT '((0,4),(6,4),(1,2),(6,0),(0,0))'::polygon @> '((2,1),(2,3),(3,3),(3,1))'::polygon AS "false";
95
96SELECT '((0,4),(6,4),(3,2),(6,0),(0,0))'::polygon @> '((2,1),(2,3),(3,3),(3,1))'::polygon AS "true";
97
98SELECT '((1,1),(1,4),(5,4),(5,3),(2,3),(2,2),(5,2),(5,1))'::polygon @> '((3,2),(3,3),(4,3),(4,2))'::polygon AS "false";
99
100SELECT '((0,0),(0,3),(3,3),(3,0))'::polygon @> '((2,1),(2,2),(3,2),(3,1))'::polygon AS "true";
101
102-- same
103SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' ~= polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS false;
104
105-- overlap
106SELECT polygon '(2.0,0.0),(2.0,4.0),(0.0,0.0)' && polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)' AS true;
107
108SELECT '((0,4),(6,4),(1,2),(6,0),(0,0))'::polygon && '((2,1),(2,3),(3,3),(3,1))'::polygon AS "true";
109
110SELECT '((1,4),(1,1),(4,1),(4,2),(2,2),(2,4),(1,4))'::polygon && '((3,3),(4,3),(4,4),(3,4),(3,3))'::polygon AS "false";
111SELECT '((200,800),(800,800),(800,200),(200,200))' &&  '(1000,1000,0,0)'::polygon AS "true";
112
113-- distance from a point
114SELECT	'(0,0)'::point <-> '((0,0),(1,2),(2,1))'::polygon as on_corner,
115	'(1,1)'::point <-> '((0,0),(2,2),(1,3))'::polygon as on_segment,
116	'(2,2)'::point <-> '((0,0),(1,4),(3,1))'::polygon as inside,
117	'(3,3)'::point <-> '((0,2),(2,0),(2,2))'::polygon as near_corner,
118	'(4,4)'::point <-> '((0,0),(0,3),(4,0))'::polygon as near_segment;
119