codekingpro/portable-devtools
115k
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>9.11. Geometric Functions and Operators</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="functions-enum.html" title="9.10. Enum Support Functions" /><link rel="next" href="functions-net.html" title="9.12. Network Address Functions and Operators" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">9.11. Geometric Functions and Operators</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="functions-enum.html" title="9.10. Enum Support Functions">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="functions.html" title="Chapter 9. Functions and Operators">Up</a></td><th width="60%" align="center">Chapter 9. Functions and Operators</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="functions-net.html" title="9.12. Network Address Functions and Operators">Next</a></td></tr></table><hr /></div><div class="sect1" id="FUNCTIONS-GEOMETRY"><div class="titlepage"><div><div><h2 class="title" style="clear: both">9.11. Geometric Functions and Operators <a href="#FUNCTIONS-GEOMETRY" class="id_link">#</a></h2></div></div></div><p>3 The geometric types <code class="type">point</code>, <code class="type">box</code>,4 <code class="type">lseg</code>, <code class="type">line</code>, <code class="type">path</code>,5 <code class="type">polygon</code>, and <code class="type">circle</code> have a large set of6 native support functions and operators, shown in <a class="xref" href="functions-geometry.html#FUNCTIONS-GEOMETRY-OP-TABLE" title="Table 9.36. Geometric Operators">Table 9.36</a>, <a class="xref" href="functions-geometry.html#FUNCTIONS-GEOMETRY-FUNC-TABLE" title="Table 9.37. Geometric Functions">Table 9.37</a>, and <a class="xref" href="functions-geometry.html#FUNCTIONS-GEOMETRY-CONV-TABLE" title="Table 9.38. Geometric Type Conversion Functions">Table 9.38</a>.7 </p><div class="table" id="FUNCTIONS-GEOMETRY-OP-TABLE"><p class="title"><strong>Table 9.36. Geometric Operators</strong></p><div class="table-contents"><table class="table" summary="Geometric Operators" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature">8 Operator9 </p>10 <p>11 Description12 </p>13 <p>14 Example(s)15 </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">16 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">+</code> <code class="type">point</code>17 → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>18 </p>19 <p>20 Adds the coordinates of the second <code class="type">point</code> to those of each21 point of the first argument, thus performing translation.22 Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">path</code>,23 <code class="type">circle</code>.24 </p>25 <p>26 <code class="literal">box '(1,1),(0,0)' + point '(2,0)'</code>27 → <code class="returnvalue">(3,1),(2,0)</code>28 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">29 <code class="type">path</code> <code class="literal">+</code> <code class="type">path</code>30 → <code class="returnvalue">path</code>31 </p>32 <p>33 Concatenates two open paths (returns NULL if either path is closed).34 </p>35 <p>36 <code class="literal">path '[(0,0),(1,1)]' + path '[(2,2),(3,3),(4,4)]'</code>37 → <code class="returnvalue">[(0,0),(1,1),(2,2),(3,3),(4,4)]</code>38 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">39 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">-</code> <code class="type">point</code>40 → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>41 </p>42 <p>43 Subtracts the coordinates of the second <code class="type">point</code> from those44 of each point of the first argument, thus performing translation.45 Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">path</code>,46 <code class="type">circle</code>.47 </p>48 <p>49 <code class="literal">box '(1,1),(0,0)' - point '(2,0)'</code>50 → <code class="returnvalue">(-1,1),(-2,0)</code>51 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">52 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">*</code> <code class="type">point</code>53 → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>54 </p>55 <p>56 Multiplies each point of the first argument by the second57 <code class="type">point</code> (treating a point as being a complex number58 represented by real and imaginary parts, and performing standard59 complex multiplication). If one interprets60 the second <code class="type">point</code> as a vector, this is equivalent to61 scaling the object's size and distance from the origin by the length62 of the vector, and rotating it counterclockwise around the origin by63 the vector's angle from the <em class="replaceable"><code>x</code></em> axis.64 Available for <code class="type">point</code>, <code class="type">box</code>,<a href="#ftn.FUNCTIONS-GEOMETRY-ROTATION-FN" class="footnote"><sup class="footnote" id="FUNCTIONS-GEOMETRY-ROTATION-FN">[a]</sup></a>65 <code class="type">path</code>, <code class="type">circle</code>.66 </p>67 <p>68 <code class="literal">path '((0,0),(1,0),(1,1))' * point '(3.0,0)'</code>69 → <code class="returnvalue">((0,0),(3,0),(3,3))</code>70 </p>71 <p>72 <code class="literal">path '((0,0),(1,0),(1,1))' * point(cosd(45), sind(45))</code>73 → <code class="returnvalue">((0,0),(0.7071067811865475,0.7071067811865475),(0,1.414213562373095))</code>74 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">75 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">/</code> <code class="type">point</code>76 → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>77 </p>78 <p>79 Divides each point of the first argument by the second80 <code class="type">point</code> (treating a point as being a complex number81 represented by real and imaginary parts, and performing standard82 complex division). If one interprets83 the second <code class="type">point</code> as a vector, this is equivalent to84 scaling the object's size and distance from the origin down by the85 length of the vector, and rotating it clockwise around the origin by86 the vector's angle from the <em class="replaceable"><code>x</code></em> axis.87 Available for <code class="type">point</code>, <code class="type">box</code>,<a href="functions-geometry.html#ftn.FUNCTIONS-GEOMETRY-ROTATION-FN" class="footnoteref"><sup class="footnoteref">[a]</sup></a> <code class="type">path</code>,88 <code class="type">circle</code>.89 </p>90 <p>91 <code class="literal">path '((0,0),(1,0),(1,1))' / point '(2.0,0)'</code>92 → <code class="returnvalue">((0,0),(0.5,0),(0.5,0.5))</code>93 </p>94 <p>95 <code class="literal">path '((0,0),(1,0),(1,1))' / point(cosd(45), sind(45))</code>96 → <code class="returnvalue">((0,0),(0.7071067811865476,-0.7071067811865476),(1.4142135623730951,0))</code>97 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">98 <code class="literal">@-@</code> <em class="replaceable"><code>geometric_type</code></em>99 → <code class="returnvalue">double precision</code>100 </p>101 <p>102 Computes the total length.103 Available for <code class="type">lseg</code>, <code class="type">path</code>.104 </p>105 <p>106 <code class="literal">@-@ path '[(0,0),(1,0),(1,1)]'</code>107 → <code class="returnvalue">2</code>108 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">109 <code class="literal">@@</code> <em class="replaceable"><code>geometric_type</code></em>110 → <code class="returnvalue">point</code>111 </p>112 <p>113 Computes the center point.114 Available for <code class="type">box</code>, <code class="type">lseg</code>,115 <code class="type">polygon</code>, <code class="type">circle</code>.116 </p>117 <p>118 <code class="literal">@@ box '(2,2),(0,0)'</code>119 → <code class="returnvalue">(1,1)</code>120 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">121 <code class="literal">#</code> <em class="replaceable"><code>geometric_type</code></em>122 → <code class="returnvalue">integer</code>123 </p>124 <p>125 Returns the number of points.126 Available for <code class="type">path</code>, <code class="type">polygon</code>.127 </p>128 <p>129 <code class="literal"># path '((1,0),(0,1),(-1,0))'</code>130 → <code class="returnvalue">3</code>131 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">132 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">#</code> <em class="replaceable"><code>geometric_type</code></em>133 → <code class="returnvalue">point</code>134 </p>135 <p>136 Computes the point of intersection, or NULL if there is none.137 Available for <code class="type">lseg</code>, <code class="type">line</code>.138 </p>139 <p>140 <code class="literal">lseg '[(0,0),(1,1)]' # lseg '[(1,0),(0,1)]'</code>141 → <code class="returnvalue">(0.5,0.5)</code>142 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">143 <code class="type">box</code> <code class="literal">#</code> <code class="type">box</code>144 → <code class="returnvalue">box</code>145 </p>146 <p>147 Computes the intersection of two boxes, or NULL if there is none.148 </p>149 <p>150 <code class="literal">box '(2,2),(-1,-1)' # box '(1,1),(-2,-2)'</code>151 → <code class="returnvalue">(1,1),(-1,-1)</code>152 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">153 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">##</code> <em class="replaceable"><code>geometric_type</code></em>154 → <code class="returnvalue">point</code>155 </p>156 <p>157 Computes the closest point to the first object on the second object.158 Available for these pairs of types:159 (<code class="type">point</code>, <code class="type">box</code>),160 (<code class="type">point</code>, <code class="type">lseg</code>),161 (<code class="type">point</code>, <code class="type">line</code>),162 (<code class="type">lseg</code>, <code class="type">box</code>),163 (<code class="type">lseg</code>, <code class="type">lseg</code>),164 (<code class="type">line</code>, <code class="type">lseg</code>).165 </p>166 <p>167 <code class="literal">point '(0,0)' ## lseg '[(2,0),(0,2)]'</code>168 → <code class="returnvalue">(1,1)</code>169 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">170 <em class="replaceable"><code>geometric_type</code></em> <code class="literal"><-></code> <em class="replaceable"><code>geometric_type</code></em>171 → <code class="returnvalue">double precision</code>172 </p>173 <p>174 Computes the distance between the objects.175 Available for all seven geometric types, for all combinations176 of <code class="type">point</code> with another geometric type, and for177 these additional pairs of types:178 (<code class="type">box</code>, <code class="type">lseg</code>),179 (<code class="type">lseg</code>, <code class="type">line</code>),180 (<code class="type">polygon</code>, <code class="type">circle</code>)181 (and the commutator cases).182 </p>183 <p>184 <code class="literal">circle '<(0,0),1>' <-> circle '<(5,0),1>'</code>185 → <code class="returnvalue">3</code>186 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">187 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">@></code> <em class="replaceable"><code>geometric_type</code></em>188 → <code class="returnvalue">boolean</code>189 </p>190 <p>191 Does first object contain second?192 Available for these pairs of types:193 (<code class="literal">box</code>, <code class="literal">point</code>),194 (<code class="literal">box</code>, <code class="literal">box</code>),195 (<code class="literal">path</code>, <code class="literal">point</code>),196 (<code class="literal">polygon</code>, <code class="literal">point</code>),197 (<code class="literal">polygon</code>, <code class="literal">polygon</code>),198 (<code class="literal">circle</code>, <code class="literal">point</code>),199 (<code class="literal">circle</code>, <code class="literal">circle</code>).200 </p>201 <p>202 <code class="literal">circle '<(0,0),2>' @> point '(1,1)'</code>203 → <code class="returnvalue">t</code>204 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">205 <em class="replaceable"><code>geometric_type</code></em> <code class="literal"><@</code> <em class="replaceable"><code>geometric_type</code></em>206 → <code class="returnvalue">boolean</code>207 </p>208 <p>209 Is first object contained in or on second?210 Available for these pairs of types:211 (<code class="literal">point</code>, <code class="literal">box</code>),212 (<code class="literal">point</code>, <code class="literal">lseg</code>),213 (<code class="literal">point</code>, <code class="literal">line</code>),214 (<code class="literal">point</code>, <code class="literal">path</code>),215 (<code class="literal">point</code>, <code class="literal">polygon</code>),216 (<code class="literal">point</code>, <code class="literal">circle</code>),217 (<code class="literal">box</code>, <code class="literal">box</code>),218 (<code class="literal">lseg</code>, <code class="literal">box</code>),219 (<code class="literal">lseg</code>, <code class="literal">line</code>),220 (<code class="literal">polygon</code>, <code class="literal">polygon</code>),221 (<code class="literal">circle</code>, <code class="literal">circle</code>).222 </p>223 <p>224 <code class="literal">point '(1,1)' <@ circle '<(0,0),2>'</code>225 → <code class="returnvalue">t</code>226 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">227 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&&</code> <em class="replaceable"><code>geometric_type</code></em>228 → <code class="returnvalue">boolean</code>229 </p>230 <p>231 Do these objects overlap? (One point in common makes this true.)232 Available for <code class="type">box</code>, <code class="type">polygon</code>,233 <code class="type">circle</code>.234 </p>235 <p>236 <code class="literal">box '(1,1),(0,0)' && box '(2,2),(0,0)'</code>237 → <code class="returnvalue">t</code>238 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">239 <em class="replaceable"><code>geometric_type</code></em> <code class="literal"><<</code> <em class="replaceable"><code>geometric_type</code></em>240 → <code class="returnvalue">boolean</code>241 </p>242 <p>243 Is first object strictly left of second?244 Available for <code class="type">point</code>, <code class="type">box</code>,245 <code class="type">polygon</code>, <code class="type">circle</code>.246 </p>247 <p>248 <code class="literal">circle '<(0,0),1>' << circle '<(5,0),1>'</code>249 → <code class="returnvalue">t</code>250 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">251 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">>></code> <em class="replaceable"><code>geometric_type</code></em>252 → <code class="returnvalue">boolean</code>253 </p>254 <p>255 Is first object strictly right of second?256 Available for <code class="type">point</code>, <code class="type">box</code>,257 <code class="type">polygon</code>, <code class="type">circle</code>.258 </p>259 <p>260 <code class="literal">circle '<(5,0),1>' >> circle '<(0,0),1>'</code>261 → <code class="returnvalue">t</code>262 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">263 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&<</code> <em class="replaceable"><code>geometric_type</code></em>264 → <code class="returnvalue">boolean</code>265 </p>266 <p>267 Does first object not extend to the right of second?268 Available for <code class="type">box</code>, <code class="type">polygon</code>,269 <code class="type">circle</code>.270 </p>271 <p>272 <code class="literal">box '(1,1),(0,0)' &< box '(2,2),(0,0)'</code>273 → <code class="returnvalue">t</code>274 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">275 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&></code> <em class="replaceable"><code>geometric_type</code></em>276 → <code class="returnvalue">boolean</code>277 </p>278 <p>279 Does first object not extend to the left of second?280 Available for <code class="type">box</code>, <code class="type">polygon</code>,281 <code class="type">circle</code>.282 </p>283 <p>284 <code class="literal">box '(3,3),(0,0)' &> box '(2,2),(0,0)'</code>285 → <code class="returnvalue">t</code>286 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">287 <em class="replaceable"><code>geometric_type</code></em> <code class="literal"><<|</code> <em class="replaceable"><code>geometric_type</code></em>288 → <code class="returnvalue">boolean</code>289 </p>290 <p>291 Is first object strictly below second?292 Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">polygon</code>,293 <code class="type">circle</code>.294 </p>295 <p>296 <code class="literal">box '(3,3),(0,0)' <<| box '(5,5),(3,4)'</code>297 → <code class="returnvalue">t</code>298 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">299 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">|>></code> <em class="replaceable"><code>geometric_type</code></em>300 → <code class="returnvalue">boolean</code>301 </p>302 <p>303 Is first object strictly above second?304 Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">polygon</code>,305 <code class="type">circle</code>.306 </p>307 <p>308 <code class="literal">box '(5,5),(3,4)' |>> box '(3,3),(0,0)'</code>309 → <code class="returnvalue">t</code>310 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">311 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&<|</code> <em class="replaceable"><code>geometric_type</code></em>312 → <code class="returnvalue">boolean</code>313 </p>314 <p>315 Does first object not extend above second?316 Available for <code class="type">box</code>, <code class="type">polygon</code>,317 <code class="type">circle</code>.318 </p>319 <p>320 <code class="literal">box '(1,1),(0,0)' &<| box '(2,2),(0,0)'</code>321 → <code class="returnvalue">t</code>322 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">323 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">|&></code> <em class="replaceable"><code>geometric_type</code></em>324 → <code class="returnvalue">boolean</code>325 </p>326 <p>327 Does first object not extend below second?328 Available for <code class="type">box</code>, <code class="type">polygon</code>,329 <code class="type">circle</code>.330 </p>331 <p>332 <code class="literal">box '(3,3),(0,0)' |&> box '(2,2),(0,0)'</code>333 → <code class="returnvalue">t</code>334 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">335 <code class="type">box</code> <code class="literal"><^</code> <code class="type">box</code>336 → <code class="returnvalue">boolean</code>337 </p>338 <p>339 Is first object below second (allows edges to touch)?340 </p>341 <p>342 <code class="literal">box '((1,1),(0,0))' <^ box '((2,2),(1,1))'</code>343 → <code class="returnvalue">t</code>344 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">345 <code class="type">box</code> <code class="literal">>^</code> <code class="type">box</code>346 → <code class="returnvalue">boolean</code>347 </p>348 <p>349 Is first object above second (allows edges to touch)?350 </p>351 <p>352 <code class="literal">box '((2,2),(1,1))' >^ box '((1,1),(0,0))'</code>353 → <code class="returnvalue">t</code>354 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">355 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">?#</code> <em class="replaceable"><code>geometric_type</code></em>356 → <code class="returnvalue">boolean</code>357 </p>358 <p>359 Do these objects intersect?360 Available for these pairs of types:361 (<code class="type">box</code>, <code class="type">box</code>),362 (<code class="type">lseg</code>, <code class="type">box</code>),363 (<code class="type">lseg</code>, <code class="type">lseg</code>),364 (<code class="type">lseg</code>, <code class="type">line</code>),365 (<code class="type">line</code>, <code class="type">box</code>),366 (<code class="type">line</code>, <code class="type">line</code>),367 (<code class="type">path</code>, <code class="type">path</code>).368 </p>369 <p>370 <code class="literal">lseg '[(-1,0),(1,0)]' ?# box '(2,2),(-2,-2)'</code>371 → <code class="returnvalue">t</code>372 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">373 <code class="literal">?-</code> <code class="type">line</code>374 → <code class="returnvalue">boolean</code>375 </p>376 <p class="func_signature">377 <code class="literal">?-</code> <code class="type">lseg</code>378 → <code class="returnvalue">boolean</code>379 </p>380 <p>381 Is line horizontal?382 </p>383 <p>384 <code class="literal">?- lseg '[(-1,0),(1,0)]'</code>385 → <code class="returnvalue">t</code>386 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">387 <code class="type">point</code> <code class="literal">?-</code> <code class="type">point</code>388 → <code class="returnvalue">boolean</code>389 </p>390 <p>391 Are points horizontally aligned (that is, have same y coordinate)?392 </p>393 <p>394 <code class="literal">point '(1,0)' ?- point '(0,0)'</code>395 → <code class="returnvalue">t</code>396 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">397 <code class="literal">?|</code> <code class="type">line</code>398 → <code class="returnvalue">boolean</code>399 </p>400 <p class="func_signature">401 <code class="literal">?|</code> <code class="type">lseg</code>402 → <code class="returnvalue">boolean</code>403 </p>404 <p>405 Is line vertical?406 </p>407 <p>408 <code class="literal">?| lseg '[(-1,0),(1,0)]'</code>409 → <code class="returnvalue">f</code>410 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">411 <code class="type">point</code> <code class="literal">?|</code> <code class="type">point</code>412 → <code class="returnvalue">boolean</code>413 </p>414 <p>415 Are points vertically aligned (that is, have same x coordinate)?416 </p>417 <p>418 <code class="literal">point '(0,1)' ?| point '(0,0)'</code>419 → <code class="returnvalue">t</code>420 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">421 <code class="type">line</code> <code class="literal">?-|</code> <code class="type">line</code>422 → <code class="returnvalue">boolean</code>423 </p>424 <p class="func_signature">425 <code class="type">lseg</code> <code class="literal">?-|</code> <code class="type">lseg</code>426 → <code class="returnvalue">boolean</code>427 </p>428 <p>429 Are lines perpendicular?430 </p>431 <p>432 <code class="literal">lseg '[(0,0),(0,1)]' ?-| lseg '[(0,0),(1,0)]'</code>433 → <code class="returnvalue">t</code>434 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">435 <code class="type">line</code> <code class="literal">?||</code> <code class="type">line</code>436 → <code class="returnvalue">boolean</code>437 </p>438 <p class="func_signature">439 <code class="type">lseg</code> <code class="literal">?||</code> <code class="type">lseg</code>440 → <code class="returnvalue">boolean</code>441 </p>442 <p>443 Are lines parallel?444 </p>445 <p>446 <code class="literal">lseg '[(-1,0),(1,0)]' ?|| lseg '[(-1,2),(1,2)]'</code>447 → <code class="returnvalue">t</code>448 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">449 <em class="replaceable"><code>geometric_type</code></em> <code class="literal">~=</code> <em class="replaceable"><code>geometric_type</code></em>450 → <code class="returnvalue">boolean</code>451 </p>452 <p>453 Are these objects the same?454 Available for <code class="type">point</code>, <code class="type">box</code>,455 <code class="type">polygon</code>, <code class="type">circle</code>.456 </p>457 <p>458 <code class="literal">polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'</code>459 → <code class="returnvalue">t</code>460 </p></td></tr></tbody><tbody class="footnotes"><tr><td colspan="1"><div id="ftn.FUNCTIONS-GEOMETRY-ROTATION-FN" class="footnote"><p><a href="#FUNCTIONS-GEOMETRY-ROTATION-FN" class="para"><sup class="para">[a] </sup></a><span class="quote">“<span class="quote">Rotating</span>”</span> a461 box with these operators only moves its corner points: the box is462 still considered to have sides parallel to the axes. Hence the box's463 size is not preserved, as a true rotation would do.</p></div></td></tr></tbody></table></div></div><br class="table-break" /><div class="caution"><h3 class="title">Caution</h3><p>464 Note that the <span class="quote">“<span class="quote">same as</span>”</span> operator, <code class="literal">~=</code>,465 represents the usual notion of equality for the <code class="type">point</code>,466 <code class="type">box</code>, <code class="type">polygon</code>, and <code class="type">circle</code> types.467 Some of the geometric types also have an <code class="literal">=</code> operator, but468 <code class="literal">=</code> compares for equal <span class="emphasis"><em>areas</em></span> only.469 The other scalar comparison operators (<code class="literal"><=</code> and so470 on), where available for these types, likewise compare areas.471 </p></div><div class="note"><h3 class="title">Note</h3><p>472 Before <span class="productname">PostgreSQL</span> 14, the point473 is strictly below/above comparison operators <code class="type">point</code>474 <code class="literal"><<|</code> <code class="type">point</code> and <code class="type">point</code>475 <code class="literal">|>></code> <code class="type">point</code> were respectively476 called <code class="literal"><^</code> and <code class="literal">>^</code>. These477 names are still available, but are deprecated and will eventually be478 removed.479 </p></div><div class="table" id="FUNCTIONS-GEOMETRY-FUNC-TABLE"><p class="title"><strong>Table 9.37. Geometric Functions</strong></p><div class="table-contents"><table class="table" summary="Geometric Functions" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature">480 Function481 </p>482 <p>483 Description484 </p>485 <p>486 Example(s)487 </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">488 <a id="id-1.5.8.17.6.2.2.1.1.1.1" class="indexterm"></a>489 <code class="function">area</code> ( <em class="replaceable"><code>geometric_type</code></em> )490 → <code class="returnvalue">double precision</code>491 </p>492 <p>493 Computes area.494 Available for <code class="type">box</code>, <code class="type">path</code>, <code class="type">circle</code>.495 A <code class="type">path</code> input must be closed, else NULL is returned.496 Also, if the <code class="type">path</code> is self-intersecting, the result may be497 meaningless.498 </p>499 <p>500 <code class="literal">area(box '(2,2),(0,0)')</code>501 → <code class="returnvalue">4</code>502 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">503 <a id="id-1.5.8.17.6.2.2.2.1.1.1" class="indexterm"></a>504 <code class="function">center</code> ( <em class="replaceable"><code>geometric_type</code></em> )505 → <code class="returnvalue">point</code>506 </p>507 <p>508 Computes center point.509 Available for <code class="type">box</code>, <code class="type">circle</code>.510 </p>511 <p>512 <code class="literal">center(box '(1,2),(0,0)')</code>513 → <code class="returnvalue">(0.5,1)</code>514 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">515 <a id="id-1.5.8.17.6.2.2.3.1.1.1" class="indexterm"></a>516 <code class="function">diagonal</code> ( <code class="type">box</code> )517 → <code class="returnvalue">lseg</code>518 </p>519 <p>520 Extracts box's diagonal as a line segment521 (same as <code class="function">lseg(box)</code>).522 </p>523 <p>524 <code class="literal">diagonal(box '(1,2),(0,0)')</code>525 → <code class="returnvalue">[(1,2),(0,0)]</code>526 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">527 <a id="id-1.5.8.17.6.2.2.4.1.1.1" class="indexterm"></a>528 <code class="function">diameter</code> ( <code class="type">circle</code> )529 → <code class="returnvalue">double precision</code>530 </p>531 <p>532 Computes diameter of circle.533 </p>534 <p>535 <code class="literal">diameter(circle '<(0,0),2>')</code>536 → <code class="returnvalue">4</code>537 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">538 <a id="id-1.5.8.17.6.2.2.5.1.1.1" class="indexterm"></a>539 <code class="function">height</code> ( <code class="type">box</code> )540 → <code class="returnvalue">double precision</code>541 </p>542 <p>543 Computes vertical size of box.544 </p>545 <p>546 <code class="literal">height(box '(1,2),(0,0)')</code>547 → <code class="returnvalue">2</code>548 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">549 <a id="id-1.5.8.17.6.2.2.6.1.1.1" class="indexterm"></a>550 <code class="function">isclosed</code> ( <code class="type">path</code> )551 → <code class="returnvalue">boolean</code>552 </p>553 <p>554 Is path closed?555 </p>556 <p>557 <code class="literal">isclosed(path '((0,0),(1,1),(2,0))')</code>558 → <code class="returnvalue">t</code>559 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">560 <a id="id-1.5.8.17.6.2.2.7.1.1.1" class="indexterm"></a>561 <code class="function">isopen</code> ( <code class="type">path</code> )562 → <code class="returnvalue">boolean</code>563 </p>564 <p>565 Is path open?566 </p>567 <p>568 <code class="literal">isopen(path '[(0,0),(1,1),(2,0)]')</code>569 → <code class="returnvalue">t</code>570 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">571 <a id="id-1.5.8.17.6.2.2.8.1.1.1" class="indexterm"></a>572 <code class="function">length</code> ( <em class="replaceable"><code>geometric_type</code></em> )573 → <code class="returnvalue">double precision</code>574 </p>575 <p>576 Computes the total length.577 Available for <code class="type">lseg</code>, <code class="type">path</code>.578 </p>579 <p>580 <code class="literal">length(path '((-1,0),(1,0))')</code>581 → <code class="returnvalue">4</code>582 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">583 <a id="id-1.5.8.17.6.2.2.9.1.1.1" class="indexterm"></a>584 <code class="function">npoints</code> ( <em class="replaceable"><code>geometric_type</code></em> )585 → <code class="returnvalue">integer</code>586 </p>587 <p>588 Returns the number of points.589 Available for <code class="type">path</code>, <code class="type">polygon</code>.590 </p>591 <p>592 <code class="literal">npoints(path '[(0,0),(1,1),(2,0)]')</code>593 → <code class="returnvalue">3</code>594 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">595 <a id="id-1.5.8.17.6.2.2.10.1.1.1" class="indexterm"></a>596 <code class="function">pclose</code> ( <code class="type">path</code> )597 → <code class="returnvalue">path</code>598 </p>599 <p>600 Converts path to closed form.601 </p>602 <p>603 <code class="literal">pclose(path '[(0,0),(1,1),(2,0)]')</code>604 → <code class="returnvalue">((0,0),(1,1),(2,0))</code>605 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">606 <a id="id-1.5.8.17.6.2.2.11.1.1.1" class="indexterm"></a>607 <code class="function">popen</code> ( <code class="type">path</code> )608 → <code class="returnvalue">path</code>609 </p>610 <p>611 Converts path to open form.612 </p>613 <p>614 <code class="literal">popen(path '((0,0),(1,1),(2,0))')</code>615 → <code class="returnvalue">[(0,0),(1,1),(2,0)]</code>616 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">617 <a id="id-1.5.8.17.6.2.2.12.1.1.1" class="indexterm"></a>618 <code class="function">radius</code> ( <code class="type">circle</code> )619 → <code class="returnvalue">double precision</code>620 </p>621 <p>622 Computes radius of circle.623 </p>624 <p>625 <code class="literal">radius(circle '<(0,0),2>')</code>626 → <code class="returnvalue">2</code>627 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">628 <a id="id-1.5.8.17.6.2.2.13.1.1.1" class="indexterm"></a>629 <code class="function">slope</code> ( <code class="type">point</code>, <code class="type">point</code> )630 → <code class="returnvalue">double precision</code>631 </p>632 <p>633 Computes slope of a line drawn through the two points.634 </p>635 <p>636 <code class="literal">slope(point '(0,0)', point '(2,1)')</code>637 → <code class="returnvalue">0.5</code>638 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">639 <a id="id-1.5.8.17.6.2.2.14.1.1.1" class="indexterm"></a>640 <code class="function">width</code> ( <code class="type">box</code> )641 → <code class="returnvalue">double precision</code>642 </p>643 <p>644 Computes horizontal size of box.645 </p>646 <p>647 <code class="literal">width(box '(1,2),(0,0)')</code>648 → <code class="returnvalue">1</code>649 </p></td></tr></tbody></table></div></div><br class="table-break" /><div class="table" id="FUNCTIONS-GEOMETRY-CONV-TABLE"><p class="title"><strong>Table 9.38. Geometric Type Conversion Functions</strong></p><div class="table-contents"><table class="table" summary="Geometric Type Conversion Functions" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature">650 Function651 </p>652 <p>653 Description654 </p>655 <p>656 Example(s)657 </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">658 <a id="id-1.5.8.17.7.2.2.1.1.1.1" class="indexterm"></a>659 <code class="function">box</code> ( <code class="type">circle</code> )660 → <code class="returnvalue">box</code>661 </p>662 <p>663 Computes box inscribed within the circle.664 </p>665 <p>666 <code class="literal">box(circle '<(0,0),2>')</code>667 → <code class="returnvalue">(1.414213562373095,1.414213562373095),(-1.414213562373095,-1.414213562373095)</code>668 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">669 <code class="function">box</code> ( <code class="type">point</code> )670 → <code class="returnvalue">box</code>671 </p>672 <p>673 Converts point to empty box.674 </p>675 <p>676 <code class="literal">box(point '(1,0)')</code>677 → <code class="returnvalue">(1,0),(1,0)</code>678 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">679 <code class="function">box</code> ( <code class="type">point</code>, <code class="type">point</code> )680 → <code class="returnvalue">box</code>681 </p>682 <p>683 Converts any two corner points to box.684 </p>685 <p>686 <code class="literal">box(point '(0,1)', point '(1,0)')</code>687 → <code class="returnvalue">(1,1),(0,0)</code>688 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">689 <code class="function">box</code> ( <code class="type">polygon</code> )690 → <code class="returnvalue">box</code>691 </p>692 <p>693 Computes bounding box of polygon.694 </p>695 <p>696 <code class="literal">box(polygon '((0,0),(1,1),(2,0))')</code>697 → <code class="returnvalue">(2,1),(0,0)</code>698 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">699 <a id="id-1.5.8.17.7.2.2.5.1.1.1" class="indexterm"></a>700 <code class="function">bound_box</code> ( <code class="type">box</code>, <code class="type">box</code> )701 → <code class="returnvalue">box</code>702 </p>703 <p>704 Computes bounding box of two boxes.705 </p>706 <p>707 <code class="literal">bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)')</code>708 → <code class="returnvalue">(4,4),(0,0)</code>709 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">710 <a id="id-1.5.8.17.7.2.2.6.1.1.1" class="indexterm"></a>711 <code class="function">circle</code> ( <code class="type">box</code> )712 → <code class="returnvalue">circle</code>713 </p>714 <p>715 Computes smallest circle enclosing box.716 </p>717 <p>718 <code class="literal">circle(box '(1,1),(0,0)')</code>719 → <code class="returnvalue"><(0.5,0.5),0.7071067811865476></code>720 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">721 <code class="function">circle</code> ( <code class="type">point</code>, <code class="type">double precision</code> )722 → <code class="returnvalue">circle</code>723 </p>724 <p>725 Constructs circle from center and radius.726 </p>727 <p>728 <code class="literal">circle(point '(0,0)', 2.0)</code>729 → <code class="returnvalue"><(0,0),2></code>730 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">731 <code class="function">circle</code> ( <code class="type">polygon</code> )732 → <code class="returnvalue">circle</code>733 </p>734 <p>735 Converts polygon to circle. The circle's center is the mean of the736 positions of the polygon's points, and the radius is the average737 distance of the polygon's points from that center.738 </p>739 <p>740 <code class="literal">circle(polygon '((0,0),(1,3),(2,0))')</code>741 → <code class="returnvalue"><(1,1),1.6094757082487299></code>742 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">743 <a id="id-1.5.8.17.7.2.2.9.1.1.1" class="indexterm"></a>744 <code class="function">line</code> ( <code class="type">point</code>, <code class="type">point</code> )745 → <code class="returnvalue">line</code>746 </p>747 <p>748 Converts two points to the line through them.749 </p>750 <p>751 <code class="literal">line(point '(-1,0)', point '(1,0)')</code>752 → <code class="returnvalue">{0,-1,0}</code>753 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">754 <a id="id-1.5.8.17.7.2.2.10.1.1.1" class="indexterm"></a>755 <code class="function">lseg</code> ( <code class="type">box</code> )756 → <code class="returnvalue">lseg</code>757 </p>758 <p>759 Extracts box's diagonal as a line segment.760 </p>761 <p>762 <code class="literal">lseg(box '(1,0),(-1,0)')</code>763 → <code class="returnvalue">[(1,0),(-1,0)]</code>764 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">765 <code class="function">lseg</code> ( <code class="type">point</code>, <code class="type">point</code> )766 → <code class="returnvalue">lseg</code>767 </p>768 <p>769 Constructs line segment from two endpoints.770 </p>771 <p>772 <code class="literal">lseg(point '(-1,0)', point '(1,0)')</code>773 → <code class="returnvalue">[(-1,0),(1,0)]</code>774 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">775 <a id="id-1.5.8.17.7.2.2.12.1.1.1" class="indexterm"></a>776 <code class="function">path</code> ( <code class="type">polygon</code> )777 → <code class="returnvalue">path</code>778 </p>779 <p>780 Converts polygon to a closed path with the same list of points.781 </p>782 <p>783 <code class="literal">path(polygon '((0,0),(1,1),(2,0))')</code>784 → <code class="returnvalue">((0,0),(1,1),(2,0))</code>785 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">786 <a id="id-1.5.8.17.7.2.2.13.1.1.1" class="indexterm"></a>787 <code class="function">point</code> ( <code class="type">double precision</code>, <code class="type">double precision</code> )788 → <code class="returnvalue">point</code>789 </p>790 <p>791 Constructs point from its coordinates.792 </p>793 <p>794 <code class="literal">point(23.4, -44.5)</code>795 → <code class="returnvalue">(23.4,-44.5)</code>796 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">797 <code class="function">point</code> ( <code class="type">box</code> )798 → <code class="returnvalue">point</code>799 </p>800 <p>801 Computes center of box.802 </p>803 <p>804 <code class="literal">point(box '(1,0),(-1,0)')</code>805 → <code class="returnvalue">(0,0)</code>806 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">807 <code class="function">point</code> ( <code class="type">circle</code> )808 → <code class="returnvalue">point</code>809 </p>810 <p>811 Computes center of circle.812 </p>813 <p>814 <code class="literal">point(circle '<(0,0),2>')</code>815 → <code class="returnvalue">(0,0)</code>816 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">817 <code class="function">point</code> ( <code class="type">lseg</code> )818 → <code class="returnvalue">point</code>819 </p>820 <p>821 Computes center of line segment.822 </p>823 <p>824 <code class="literal">point(lseg '[(-1,0),(1,0)]')</code>825 → <code class="returnvalue">(0,0)</code>826 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">827 <code class="function">point</code> ( <code class="type">polygon</code> )828 → <code class="returnvalue">point</code>829 </p>830 <p>831 Computes center of polygon (the mean of the832 positions of the polygon's points).833 </p>834 <p>835 <code class="literal">point(polygon '((0,0),(1,1),(2,0))')</code>836 → <code class="returnvalue">(1,0.3333333333333333)</code>837 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">838 <a id="id-1.5.8.17.7.2.2.18.1.1.1" class="indexterm"></a>839 <code class="function">polygon</code> ( <code class="type">box</code> )840 → <code class="returnvalue">polygon</code>841 </p>842 <p>843 Converts box to a 4-point polygon.844 </p>845 <p>846 <code class="literal">polygon(box '(1,1),(0,0)')</code>847 → <code class="returnvalue">((0,0),(0,1),(1,1),(1,0))</code>848 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">849 <code class="function">polygon</code> ( <code class="type">circle</code> )850 → <code class="returnvalue">polygon</code>851 </p>852 <p>853 Converts circle to a 12-point polygon.854 </p>855 <p>856 <code class="literal">polygon(circle '<(0,0),2>')</code>857 → <code class="returnvalue">((-2,0),(-1.7320508075688774,0.9999999999999999),(-1.0000000000000002,1.7320508075688772),(-1.2246063538223773e-16,2),(0.9999999999999996,1.7320508075688774),(1.732050807568877,1.0000000000000007),(2,2.4492127076447545e-16),(1.7320508075688776,-0.9999999999999994),(1.0000000000000009,-1.7320508075688767),(3.673819061467132e-16,-2),(-0.9999999999999987,-1.732050807568878),(-1.7320508075688767,-1.0000000000000009))</code>858 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">859 <code class="function">polygon</code> ( <code class="type">integer</code>, <code class="type">circle</code> )860 → <code class="returnvalue">polygon</code>861 </p>862 <p>863 Converts circle to an <em class="replaceable"><code>n</code></em>-point polygon.864 </p>865 <p>866 <code class="literal">polygon(4, circle '<(3,0),1>')</code>867 → <code class="returnvalue">((2,0),(3,1),(4,1.2246063538223773e-16),(3,-1))</code>868 </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">869 <code class="function">polygon</code> ( <code class="type">path</code> )870 → <code class="returnvalue">polygon</code>871 </p>872 <p>873 Converts closed path to a polygon with the same list of points.874 </p>875 <p>876 <code class="literal">polygon(path '((0,0),(1,1),(2,0))')</code>877 → <code class="returnvalue">((0,0),(1,1),(2,0))</code>878 </p></td></tr></tbody></table></div></div><br class="table-break" /><p>879 It is possible to access the two component numbers of a <code class="type">point</code>880 as though the point were an array with indexes 0 and 1. For example, if881 <code class="literal">t.p</code> is a <code class="type">point</code> column then882 <code class="literal">SELECT p[0] FROM t</code> retrieves the X coordinate and883 <code class="literal">UPDATE t SET p[1] = ...</code> changes the Y coordinate.884 In the same way, a value of type <code class="type">box</code> or <code class="type">lseg</code> can be treated885 as an array of two <code class="type">point</code> values.886 </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="functions-enum.html" title="9.10. Enum Support Functions">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="functions.html" title="Chapter 9. Functions and Operators">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="functions-net.html" title="9.12. Network Address Functions and Operators">Next</a></td></tr><tr><td width="40%" align="left" valign="top">9.10. Enum Support Functions </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="40%" align="right" valign="top"> 9.12. Network Address Functions and Operators</td></tr></table></div></body></html>