Skip to content

Commit 34132d3

Browse files
committed
Add spoly(spoint[]) constructor function
1 parent 126ad72 commit 34132d3

File tree

5 files changed

+149
-67
lines changed

5 files changed

+149
-67
lines changed

Diff for: expected/poly.out

+50-26
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,25 @@ SELECT spoint '(0.15,0.10)' @ :poly; -- point inside polygon
1212
t
1313
(1 row)
1414

15-
SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon
15+
SELECT spoint '(0.20,0.00)' @ :poly; -- point contained polygon
1616
?column?
1717
----------
1818
t
1919
(1 row)
2020

21-
SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon
21+
SELECT spoint '(0.10,0.10)' @ :poly; -- point contained polygon
2222
?column?
2323
----------
2424
t
2525
(1 row)
2626

27-
SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon
27+
SELECT spoint '(0.25,0.50)' @ :poly; -- point outside polygon
2828
?column?
2929
----------
3030
f
3131
(1 row)
3232

33-
SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon
33+
SELECT spoint '(0.25,0.00)' @ :poly; -- point outside polygon
3434
?column?
3535
----------
3636
f
@@ -42,13 +42,13 @@ SELECT scircle '<(0.15,0.10),0.03>' @ :poly; -- circle inside polygon
4242
t
4343
(1 row)
4444

45-
SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon
45+
SELECT scircle '<(0.20,0.00),0.00>' @ :poly; -- circle contained polygon
4646
?column?
4747
----------
4848
t
4949
(1 row)
5050

51-
SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon
51+
SELECT scircle '<(0.20,0.30),0.05>' @ :poly; -- circle outside polygon
5252
?column?
5353
----------
5454
f
@@ -72,13 +72,13 @@ SELECT scircle '<(0.15,0.10),0.03>' && :poly; -- circle inside polygon
7272
t
7373
(1 row)
7474

75-
SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon
75+
SELECT scircle '<(0.20,0.00),0.00>' && :poly; -- circle contained polygon
7676
?column?
7777
----------
7878
t
7979
(1 row)
8080

81-
SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon
81+
SELECT scircle '<(0.20,0.30),0.05>' && :poly; -- circle outside polygon
8282
?column?
8383
----------
8484
f
@@ -96,13 +96,13 @@ SELECT scircle '<(0.25,0.00),0.10>' && :poly; -- circle overlaps polyg
9696
t
9797
(1 row)
9898

99-
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon
99+
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) @ :poly; -- line touches polygon
100100
?column?
101101
----------
102102
f
103103
(1 row)
104104

105-
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon
105+
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) @ :poly; -- line touches polygon
106106
?column?
107107
----------
108108
f
@@ -114,7 +114,7 @@ SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) @ :poly; -- line
114114
f
115115
(1 row)
116116

117-
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon
117+
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) @ :poly; -- line touches and inside polygon
118118
?column?
119119
----------
120120
t
@@ -138,13 +138,13 @@ SELECT sline ( spoint '(0.24, 0.17)', spoint '(0.25,0.14)' ) @ :poly; -- line
138138
t
139139
(1 row)
140140

141-
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon
141+
SELECT sline ( spoint '(0.00, 0.00)', spoint '(0.10,0.20)' ) && :poly; -- line touches polygon
142142
?column?
143143
----------
144144
t
145145
(1 row)
146146

147-
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon
147+
SELECT sline ( spoint '(0.00, 0.10)', spoint '(0.10,0.10)' ) && :poly; -- line touches polygon
148148
?column?
149149
----------
150150
t
@@ -156,7 +156,7 @@ SELECT sline ( spoint '(0.50, 0.00)', spoint '(0.50,0.20)' ) && :poly; -- line
156156
t
157157
(1 row)
158158

159-
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon
159+
SELECT sline ( spoint '(0.10, 0.20)', spoint '(0.20,0.00)' ) && :poly; -- line touches and inside polygon
160160
?column?
161161
----------
162162
t
@@ -330,7 +330,32 @@ SELECT spoly_deg(ARRAY[10.0, 0.0, 10.0, 1.0, 15.0, 0.0]);
330330
{(10d , 0d),(10d , 1d),(15d , 0d)}
331331
(1 row)
332332

333-
-- incorrect input -----
333+
--- Constructors
334+
SELECT spoly(NULL::spoint[]);
335+
spoly
336+
-------
337+
338+
(1 row)
339+
340+
SELECT spoly(ARRAY[]::spoint[]);
341+
ERROR: spoly_deg: invalid number of arguments (must be >= 3)
342+
SELECT spoly(ARRAY[spoint_deg(0, 0)]);
343+
ERROR: spoly_deg: invalid number of arguments (must be >= 3)
344+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0)]);
345+
ERROR: spoly_deg: invalid number of arguments (must be >= 3)
346+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10,10)]);
347+
spoly
348+
------------------------------------
349+
{(0d , 0d),(10d , 0d),(10d , 10d)}
350+
(1 row)
351+
352+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10,10), spoint_deg(0, 10)]);
353+
spoly
354+
-----------------------------------------------
355+
{(0d , 0d),(10d , 0d),(10d , 10d),(0d , 10d)}
356+
(1 row)
357+
358+
--- incorrect input -----
334359
SELECT spoly '{(10d,0d),(10d,1d)}';
335360
ERROR: spherepoly_in: more than two points needed
336361
LINE 1: SELECT spoly '{(10d,0d),(10d,1d)}';
@@ -1185,7 +1210,7 @@ SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d)
11851210
(1 row)
11861211

11871212
--- spoly ~ spoly
1188-
--- should be true
1213+
--- should be true
11891214
SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}';
11901215
?column?
11911216
----------
@@ -1254,7 +1279,7 @@ SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(9
12541279
(1 row)
12551280

12561281
--- spoly && spoly
1257-
--- should be true
1282+
--- should be true
12581283
SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}';
12591284
?column?
12601285
----------
@@ -1391,7 +1416,6 @@ SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d
13911416
--
13921417
-- ellipse and polygon
13931418
--
1394-
13951419
-- negators , commutator @,&&
13961420
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>';
13971421
?column?
@@ -1538,49 +1562,49 @@ SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12
15381562
(1 row)
15391563

15401564
-- ellipse is point
1541-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
1565+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
15421566
?column?
15431567
----------
15441568
f
15451569
(1 row)
15461570

1547-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
1571+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
15481572
?column?
15491573
----------
15501574
f
15511575
(1 row)
15521576

1553-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
1577+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
15541578
?column?
15551579
----------
15561580
f
15571581
(1 row)
15581582

1559-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
1583+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
15601584
?column?
15611585
----------
15621586
t
15631587
(1 row)
15641588

1565-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
1589+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
15661590
?column?
15671591
----------
15681592
f
15691593
(1 row)
15701594

1571-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
1595+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
15721596
?column?
15731597
----------
15741598
t
15751599
(1 row)
15761600

1577-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
1601+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
15781602
?column?
15791603
----------
15801604
f
15811605
(1 row)
15821606

1583-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
1607+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
15841608
?column?
15851609
----------
15861610
t

Diff for: pgs_polygon.sql.in

+23-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,28 @@
11

2-
-- spherical polygon functions
2+
-- Constructors
3+
4+
CREATE FUNCTION spoly(spoint[])
5+
RETURNS spoly
6+
AS 'MODULE_PATHNAME', 'spherepoly_from_point_array'
7+
LANGUAGE 'c'
8+
IMMUTABLE STRICT PARALLEL SAFE;
9+
10+
COMMENT ON FUNCTION spoly(spoint[]) IS
11+
'Create spoly from an array of points.';
12+
13+
CREATE FUNCTION spoly_deg(float8[])
14+
RETURNS spoly
15+
AS 'MODULE_PATHNAME', 'spherepoly_deg'
16+
LANGUAGE 'c'
17+
IMMUTABLE STRICT;
18+
19+
COMMENT ON FUNCTION spoly_deg(float8[]) IS
20+
'Create spoly from array of points.
21+
Two consecutive numbers among those present
22+
refer to the same occurrence and cover its
23+
latitude and longitude, respectively.';
324

25+
-- spherical polygon functions
426

527
CREATE FUNCTION npoints(spoly)
628
RETURNS INT4
@@ -946,18 +968,6 @@ CREATE FUNCTION spoly_add_point_aggr (spoly, spoint)
946968
COMMENT ON FUNCTION spoly_add_point_aggr (spoly, spoint) IS
947969
'adds a spherical point to spherical polygon. Do not use it standalone!';
948970

949-
CREATE FUNCTION spoly_deg(float8[])
950-
RETURNS spoly
951-
AS 'MODULE_PATHNAME', 'spherepoly_deg'
952-
LANGUAGE 'c'
953-
IMMUTABLE STRICT;
954-
955-
COMMENT ON FUNCTION spoly_deg(float8[]) IS
956-
' Create spoly from array of points.
957-
Two consecutive numbers among those present
958-
refer to the same occurrence and cover its
959-
latitude and longitude, respectively.';
960-
961971
CREATE FUNCTION spoly_add_points_fin_aggr (spoly)
962972
RETURNS spoly
963973
AS 'MODULE_PATHNAME', 'spherepoly_add_points_finalize'
@@ -974,7 +984,6 @@ CREATE AGGREGATE spoly (
974984
finalfunc = spoly_add_points_fin_aggr
975985
);
976986

977-
978987
--
979988
-- polygon is convex
980989
--

0 commit comments

Comments
 (0)