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