Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb4a6fe4

Browse files
authored
Merge pull request#99 from vitcpp/spoly_constructor_with_point_array
Add spoly(spoint[]) constructor function
2 parents81939cf +4d8e97d commitb4a6fe4

File tree

7 files changed

+179
-68
lines changed

7 files changed

+179
-68
lines changed

‎doc/constructors.sgm‎

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -268,22 +268,45 @@
268268
<title>
269269
Polygon
270270
</title>
271+
271272
<para>
272-
The aggregate function
273+
The functions <literal>spoly</literal> and <literal>spoly_deg</literal>
274+
can be used to create spherical polygons. Function <literal>spoly</literal>
275+
is overloaded and can accept arrays of float8 or spoint elements.
276+
There are the same restrictions as for using the input function of
277+
spherical polygon (see <xref linkend="dt.spoly"/>).
273278
</para>
274-
<funcsynopsis>
275-
<funcprototype>
276-
<funcdef><function>spoly</function></funcdef>
277-
<paramdef>spoint <parameter>edge</parameter></paramdef>
278-
</funcprototype>
279-
</funcsynopsis>
279+
280280
<para>
281-
can be used to create apolygon froma set ofspherical points.
282-
There are the same restrictions as for using the input function of
283-
spherical polygon (see <xref linkend="dt.spoly"/>). The function
284-
returns
285-
<literal>NULL</literal>, if the polygon couldn't be created.
281+
Create a sphericalpolygon froman array ofpair-consecutive
282+
numbers (lng, lat). The coordinates are specified in radians.
283+
<programlisting>
284+
<![CDATA[sql> SELECT spoly(ARRAY[0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0])]]>
285+
</programlisting>
286286
</para>
287+
288+
<para>
289+
Create a spherical polygon from an array of spoint elements.
290+
<programlisting>
291+
<![CDATA[sql> SELECT spoly(ARRAY[spoint(0, 0), spoint(0, 0.5), spoint(0.5, 0.5), spoint(0.5, 0)])]]>
292+
</programlisting>
293+
</para>
294+
295+
<para>
296+
Create a spherical polygon from an array of pair-consecutive
297+
numbers (lng, lat). The coordinates are specified in degrees.
298+
<programlisting>
299+
<![CDATA[sql> SELECT spoly_deg(ARRAY[0, 0, 0, 10, 10, 10, 10, 0])]]>
300+
</programlisting>
301+
</para>
302+
303+
<para>
304+
The aggregate function <literal>spoly</literal> can be used to
305+
create a polygon from a set of spherical points. The function
306+
returns <literal>NULL</literal>, if the polygon could not be
307+
created.
308+
</para>
309+
287310
<example>
288311
<title>
289312
Create a spherical polygon using a set of spherical points

‎expected/poly.out‎

Lines changed: 50 additions & 26 deletions
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
@@ -342,7 +342,32 @@ SELECT spoly_deg(ARRAY[10.0, 0.0, 10.0, 1.0, 15.0, 0.0]);
342342
{(10d , 0d),(10d , 1d),(15d , 0d)}
343343
(1 row)
344344

345-
-- incorrect input -----
345+
--- Constructors
346+
SELECT spoly(NULL::spoint[]);
347+
spoly
348+
-------
349+
350+
(1 row)
351+
352+
SELECT spoly(ARRAY[]::spoint[]);
353+
ERROR: spherepoly_from_point_array: invalid number of arguments (must be >= 3)
354+
SELECT spoly(ARRAY[spoint_deg(0, 0)]);
355+
ERROR: spherepoly_from_point_array: invalid number of arguments (must be >= 3)
356+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0)]);
357+
ERROR: spherepoly_from_point_array: invalid number of arguments (must be >= 3)
358+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10, 10)]);
359+
spoly
360+
------------------------------------
361+
{(0d , 0d),(10d , 0d),(10d , 10d)}
362+
(1 row)
363+
364+
SELECT spoly(ARRAY[spoint_deg(0, 0), spoint_deg(10, 0), spoint_deg(10, 10), spoint_deg(0, 10)]);
365+
spoly
366+
-----------------------------------------------
367+
{(0d , 0d),(10d , 0d),(10d , 10d),(0d , 10d)}
368+
(1 row)
369+
370+
--- incorrect input -----
346371
SELECT spoly '{(10d,0d),(10d,1d)}';
347372
ERROR: spherepoly_in: more than two points needed
348373
LINE 1: SELECT spoly '{(10d,0d),(10d,1d)}';
@@ -1211,7 +1236,7 @@ SELECT spoly '{(0d,-88d),(90d,-88d),(180d,-88d),(270d,-88d)}' @ spoly '{(0d,89d)
12111236
(1 row)
12121237

12131238
--- spoly ~ spoly
1214-
--- should be true
1239+
--- should be true
12151240
SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' ~ spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}';
12161241
?column?
12171242
----------
@@ -1280,7 +1305,7 @@ SELECT spoly '{(0d,89d),(90d,89d),(180d,89d),(270d,89d)}' ~ spoly '{(0d,-88d),(9
12801305
(1 row)
12811306

12821307
--- spoly && spoly
1283-
--- should be true
1308+
--- should be true
12841309
SELECT spoly '{(0d,0d),(0d,0.5d),(0.5d,0.5d),(0.5d,0d)}' && spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}';
12851310
?column?
12861311
----------
@@ -1417,7 +1442,6 @@ SELECT spoly '{(-1d,-1d),(-1d,1d),(1d,1d),(1d,-1d)}' && spoly '{(179d,-1d),(179d
14171442
--
14181443
-- ellipse and polygon
14191444
--
1420-
14211445
-- negators , commutator @,&&
14221446
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{10d,5d},(280d,-20d),90d>';
14231447
?column?
@@ -1564,49 +1588,49 @@ SELECT sellipse '<{10d,5d},(280d,-20d),90d>' !&& spoly '{(280d,-11d),(280d,-12
15641588
(1 row)
15651589

15661590
-- ellipse is point
1567-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
1591+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
15681592
?column?
15691593
----------
15701594
f
15711595
(1 row)
15721596

1573-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
1597+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' @ sellipse '<{0d,0d},(280d,-20d),90d>';
15741598
?column?
15751599
----------
15761600
f
15771601
(1 row)
15781602

1579-
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
1603+
SELECT spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
15801604
?column?
15811605
----------
15821606
f
15831607
(1 row)
15841608

1585-
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
1609+
SELECT spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}' && sellipse '<{0d,0d},(280d,-20d),90d>';
15861610
?column?
15871611
----------
15881612
t
15891613
(1 row)
15901614

1591-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
1615+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
15921616
?column?
15931617
----------
15941618
f
15951619
(1 row)
15961620

1597-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
1621+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' @ spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
15981622
?column?
15991623
----------
16001624
t
16011625
(1 row)
16021626

1603-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
1627+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d, -9d),(280d, -8d),(279d, -8d)}' ;
16041628
?column?
16051629
----------
16061630
f
16071631
(1 row)
16081632

1609-
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
1633+
SELECT sellipse '<{0d,0d},(280d,-20d),90d>' && spoly '{(280d,-11d),(280d,-20d),(279d, -12d)}';
16101634
?column?
16111635
----------
16121636
t

‎pgs_polygon.sql.in‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,15 @@ CREATE FUNCTION spoly(float8[])
948948
COMMENT ON FUNCTION spoly(float8[]) IS
949949
'creates spoly from array of numbers in radians';
950950

951+
CREATE FUNCTION spoly(spoint[])
952+
RETURNS spoly
953+
AS 'MODULE_PATHNAME', 'spherepoly_from_point_array'
954+
LANGUAGE 'c'
955+
IMMUTABLE STRICT PARALLEL SAFE;
956+
957+
COMMENT ON FUNCTION spoly(spoint[]) IS
958+
'creates spoly from an array of points';
959+
951960
CREATE FUNCTION spoly_deg(float8[])
952961
RETURNS spoly
953962
AS 'MODULE_PATHNAME', 'spherepoly_deg'
@@ -987,7 +996,6 @@ CREATE AGGREGATE spoly (
987996
finalfunc = spoly_add_points_fin_aggr
988997
);
989998

990-
991999
--
9921000
-- polygon is convex
9931001
--

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp