polygon.out 4.04 KB
--
-- POLYGON
--
-- polygon logic
--
-- 3	      o
--	      |
-- 2	    + |
--	   /  |
-- 1	  # o +
--       /    |
-- 0	#-----o-+
--
--	0 1 2 3 4
--
CREATE TABLE POLYGON_TBL(f1 polygon);
INSERT INTO POLYGON_TBL(f1) VALUES ('(2.0,0.0),(2.0,4.0),(0.0,0.0)');
INSERT INTO POLYGON_TBL(f1) VALUES ('(3.0,1.0),(3.0,3.0),(1.0,0.0)');
-- degenerate polygons 
INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,0.0)');
INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0,1.0),(0.0,1.0)');
-- bad polygon input strings 
INSERT INTO POLYGON_TBL(f1) VALUES ('0.0');
ERROR:  invalid input syntax for polygon: "0.0"
INSERT INTO POLYGON_TBL(f1) VALUES ('(0.0 0.0');
ERROR:  invalid input syntax for polygon: "(0.0 0.0"
INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2)');
ERROR:  invalid input syntax for polygon: "(0,1,2)"
INSERT INTO POLYGON_TBL(f1) VALUES ('(0,1,2,3');
ERROR:  invalid input syntax for polygon: "(0,1,2,3"
INSERT INTO POLYGON_TBL(f1) VALUES ('asdf');
ERROR:  invalid input syntax for polygon: "asdf"
SELECT '' AS four, POLYGON_TBL.*;
 four |         f1          
------+---------------------
      | ((2,0),(2,4),(0,0))
      | ((3,1),(3,3),(1,0))
      | ((0,0))
      | ((0,1),(0,1))
(4 rows)

-- overlap 
SELECT '' AS three, p.*
   FROM POLYGON_TBL p
   WHERE p.f1 && '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 three |         f1          
-------+---------------------
       | ((2,0),(2,4),(0,0))
       | ((3,1),(3,3),(1,0))
(2 rows)

-- left overlap 
SELECT '' AS four, p.* 
   FROM POLYGON_TBL p
   WHERE p.f1 &< '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 four |         f1          
------+---------------------
      | ((2,0),(2,4),(0,0))
      | ((3,1),(3,3),(1,0))
      | ((0,0))
      | ((0,1),(0,1))
(4 rows)

-- right overlap 
SELECT '' AS two, p.* 
   FROM POLYGON_TBL p
   WHERE p.f1 &> '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 two |         f1          
-----+---------------------
     | ((2,0),(2,4),(0,0))
     | ((3,1),(3,3),(1,0))
(2 rows)

-- left of 
SELECT '' AS one, p.*
   FROM POLYGON_TBL p
   WHERE p.f1 << '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 one |      f1       
-----+---------------
     | ((0,0))
     | ((0,1),(0,1))
(2 rows)

-- right of 
SELECT '' AS zero, p.*
   FROM POLYGON_TBL p
   WHERE p.f1 >> '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 zero | f1 
------+----
(0 rows)

-- contained 
SELECT '' AS one, p.* 
   FROM POLYGON_TBL p
   WHERE p.f1 @ polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 one |         f1          
-----+---------------------
     | ((3,1),(3,3),(1,0))
(1 row)

-- same 
SELECT '' AS one, p.*
   FROM POLYGON_TBL p
   WHERE p.f1 ~= polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 one |         f1          
-----+---------------------
     | ((3,1),(3,3),(1,0))
(1 row)

-- contains 
SELECT '' AS one, p.*
   FROM POLYGON_TBL p
   WHERE p.f1 ~ polygon '(3.0,1.0),(3.0,3.0),(1.0,0.0)';
 one |         f1          
-----+---------------------
     | ((3,1),(3,3),(1,0))
(1 row)

--
-- polygon logic
--
-- 3	      o
--	      |
-- 2	    + |
--	   /  |
-- 1	  / o +
--       /    |
-- 0	+-----o-+
--
--	0 1 2 3 4
--
-- left of 
SELECT 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;
 false 
-------
 f
(1 row)

-- left overlap 
SELECT 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;
 true 
------
 f
(1 row)

-- right overlap 
SELECT 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;
 true 
------
 t
(1 row)

-- right of 
SELECT 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;
 false 
-------
 f
(1 row)

-- contained in 
SELECT 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;
 false 
-------
 f
(1 row)

-- contains 
SELECT 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;
 false 
-------
 f
(1 row)

-- same 
SELECT 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;
 false 
-------
 f
(1 row)

-- overlap 
SELECT 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;
 true 
------
 t
(1 row)