Geometric Functions and Operators
The geometric types point, box,
lseg, line, path,
polygon, and circle have a large set of
native support functions and operators, shown in , , and .
Geometric Operators
Operator
Description
Example(s)
geometric_type + point
geometric_type
Adds the coordinates of the second point to those of each
point of the first argument, thus performing translation.
Available for point, box, path,
circle.
box '(1,1),(0,0)' + point '(2,0)'
(3,1),(2,0)
path + path
path
Concatenates two open paths (returns NULL if either path is closed).
path '[(0,0),(1,1)]' + path '[(2,2),(3,3),(4,4)]'
[(0,0),(1,1),(2,2),(3,3),(4,4)]
geometric_type - point
geometric_type
Subtracts the coordinates of the second point from those
of each point of the first argument, thus performing translation.
Available for point, box, path,
circle.
box '(1,1),(0,0)' - point '(2,0)'
(-1,1),(-2,0)
geometric_type * point
geometric_type
Multiplies each point of the first argument by the second
point (treating a point as being a complex number
represented by real and imaginary parts, and performing standard
complex multiplication). If one interprets
the second point as a vector, this is equivalent to
scaling the object's size and distance from the origin by the length
of the vector, and rotating it counterclockwise around the origin by
the vector's angle from the x axis.
Available for point, box,Rotating
a
box with these operators only moves its corner points: the box is
still considered to have sides parallel to the axes. Hence the box's
size is not preserved, as a true rotation would do.
path, circle.
path '((0,0),(1,0),(1,1))' * point '(3.0,0)'
((0,0),(3,0),(3,3))
path '((0,0),(1,0),(1,1))' * point(cosd(45), sind(45))
((0,0),&zwsp;(0.7071067811865475,0.7071067811865475),&zwsp;(0,1.414213562373095))
geometric_type / point
geometric_type
Divides each point of the first argument by the second
point (treating a point as being a complex number
represented by real and imaginary parts, and performing standard
complex division). If one interprets
the second point as a vector, this is equivalent to
scaling the object's size and distance from the origin down by the
length of the vector, and rotating it clockwise around the origin by
the vector's angle from the x axis.
Available for point, box, path,
circle.
path '((0,0),(1,0),(1,1))' / point '(2.0,0)'
((0,0),(0.5,0),(0.5,0.5))
path '((0,0),(1,0),(1,1))' / point(cosd(45), sind(45))
((0,0),&zwsp;(0.7071067811865476,-0.7071067811865476),&zwsp;(1.4142135623730951,0))
@-@ geometric_type
double precision
Computes the total length.
Available for lseg, path.
@-@ path '[(0,0),(1,0),(1,1)]'
2
@@ geometric_type
point
Computes the center point.
Available for box, lseg,
polygon, circle.
@@ box '(2,2),(0,0)'
(1,1)
# geometric_type
integer
Returns the number of points.
Available for path, polygon.
# path '((1,0),(0,1),(-1,0))'
3
geometric_type # geometric_type
point
Computes the point of intersection, or NULL if there is none.
Available for lseg, line.
lseg '[(0,0),(1,1)]' # lseg '[(1,0),(0,1)]'
(0.5,0.5)
box # box
box
Computes the intersection of two boxes, or NULL if there is none.
box '(2,2),(-1,-1)' # box '(1,1),(-2,-2)'
(1,1),(-1,-1)
geometric_type ## geometric_type
point
Computes the closest point to the first object on the second object.
Available for these pairs of types:
(point, box),
(point, lseg),
(point, line),
(lseg, box),
(lseg, lseg),
(line, lseg).
point '(0,0)' ## lseg '[(2,0),(0,2)]'
(1,1)
geometric_type <-> geometric_type
double precision
Computes the distance between the objects.
Available for all seven geometric types, for all combinations
of point with another geometric type, and for
these additional pairs of types:
(box, lseg),
(lseg, line),
(polygon, circle)
(and the commutator cases).
circle '<(0,0),1>' <-> circle '<(5,0),1>'
3
geometric_type @> geometric_type
boolean
Does first object contain second?
Available for these pairs of types:
(box, point),
(box, box),
(path, point),
(polygon, point),
(polygon, polygon),
(circle, point),
(circle, circle).
circle '<(0,0),2>' @> point '(1,1)'
t
geometric_type <@ geometric_type
boolean
Is first object contained in or on second?
Available for these pairs of types:
(point, box),
(point, lseg),
(point, line),
(point, path),
(point, polygon),
(point, circle),
(box, box),
(lseg, box),
(lseg, line),
(polygon, polygon),
(circle, circle).
point '(1,1)' <@ circle '<(0,0),2>'
t
geometric_type && geometric_type
boolean
Do these objects overlap? (One point in common makes this true.)
Available for box, polygon,
circle.
box '(1,1),(0,0)' && box '(2,2),(0,0)'
t
geometric_type << geometric_type
boolean
Is first object strictly left of second?
Available for point, box,
polygon, circle.
circle '<(0,0),1>' << circle '<(5,0),1>'
t
geometric_type >> geometric_type
boolean
Is first object strictly right of second?
Available for point, box,
polygon, circle.
circle '<(5,0),1>' >> circle '<(0,0),1>'
t
geometric_type &< geometric_type
boolean
Does first object not extend to the right of second?
Available for box, polygon,
circle.
box '(1,1),(0,0)' &< box '(2,2),(0,0)'
t
geometric_type &> geometric_type
boolean
Does first object not extend to the left of second?
Available for box, polygon,
circle.
box '(3,3),(0,0)' &> box '(2,2),(0,0)'
t
geometric_type <<| geometric_type
boolean
Is first object strictly below second?
Available for point, box, polygon,
circle.
box '(3,3),(0,0)' <<| box '(5,5),(3,4)'
t
geometric_type |>> geometric_type
boolean
Is first object strictly above second?
Available for point, box, polygon,
circle.
box '(5,5),(3,4)' |>> box '(3,3),(0,0)'
t
geometric_type &<| geometric_type
boolean
Does first object not extend above second?
Available for box, polygon,
circle.
box '(1,1),(0,0)' &<| box '(2,2),(0,0)'
t
geometric_type |&> geometric_type
boolean
Does first object not extend below second?
Available for box, polygon,
circle.
box '(3,3),(0,0)' |&> box '(2,2),(0,0)'
t
box <^ box
boolean
Is first object below second (allows edges to touch)?
box '((1,1),(0,0))' <^ box '((2,2),(1,1))'
t
box >^ box
boolean
Is first object above second (allows edges to touch)?
box '((2,2),(1,1))' >^ box '((1,1),(0,0))'
t
geometric_type ?# geometric_type
boolean
Do these objects intersect?
Available for these pairs of types:
(box, box),
(lseg, box),
(lseg, lseg),
(lseg, line),
(line, box),
(line, line),
(path, path).
lseg '[(-1,0),(1,0)]' ?# box '(2,2),(-2,-2)'
t
?- line
boolean
?- lseg
boolean
Is line horizontal?
?- lseg '[(-1,0),(1,0)]'
t
point ?- point
boolean
Are points horizontally aligned (that is, have same y coordinate)?
point '(1,0)' ?- point '(0,0)'
t
?| line
boolean
?| lseg
boolean
Is line vertical?
?| lseg '[(-1,0),(1,0)]'
f
point ?| point
boolean
Are points vertically aligned (that is, have same x coordinate)?
point '(0,1)' ?| point '(0,0)'
t
line ?-| line
boolean
lseg ?-| lseg
boolean
Are lines perpendicular?
lseg '[(0,0),(0,1)]' ?-| lseg '[(0,0),(1,0)]'
t
line ?|| line
boolean
lseg ?|| lseg
boolean
Are lines parallel?
lseg '[(-1,0),(1,0)]' ?|| lseg '[(-1,2),(1,2)]'
t
geometric_type ~= geometric_type
boolean
Are these objects the same?
Available for point, box,
polygon, circle.
polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'
t
Note that the same as
operator, ~=,
represents the usual notion of equality for the point,
box, polygon, and circle types.
Some of the geometric types also have an = operator, but
= compares for equal areas only.
The other scalar comparison operators (<= and so
on), where available for these types, likewise compare areas.
Before PostgreSQL 14, the point
is strictly below/above comparison operators point
<<| point and point
|>> point were respectively
called <^ and >^. These
names are still available, but are deprecated and will eventually be
removed.
Geometric Functions
Function
Description
Example(s)
area
area ( geometric_type )
double precision
Computes area.
Available for box, path, circle.
A path input must be closed, else NULL is returned.
Also, if the path is self-intersecting, the result may be
meaningless.
area(box '(2,2),(0,0)')
4
center
center ( geometric_type )
point
Computes center point.
Available for box, circle.
center(box '(1,2),(0,0)')
(0.5,1)
diagonal
diagonal ( box )
lseg
Extracts box's diagonal as a line segment
(same as lseg(box)).
diagonal(box '(1,2),(0,0)')
[(1,2),(0,0)]
diameter
diameter ( circle )
double precision
Computes diameter of circle.
diameter(circle '<(0,0),2>')
4
height
height ( box )
double precision
Computes vertical size of box.
height(box '(1,2),(0,0)')
2
isclosed
isclosed ( path )
boolean
Is path closed?
isclosed(path '((0,0),(1,1),(2,0))')
t
isopen
isopen ( path )
boolean
Is path open?
isopen(path '[(0,0),(1,1),(2,0)]')
t
length
length ( geometric_type )
double precision
Computes the total length.
Available for lseg, path.
length(path '((-1,0),(1,0))')
4
npoints
npoints ( geometric_type )
integer
Returns the number of points.
Available for path, polygon.
npoints(path '[(0,0),(1,1),(2,0)]')
3
pclose
pclose ( path )
path
Converts path to closed form.
pclose(path '[(0,0),(1,1),(2,0)]')
((0,0),(1,1),(2,0))
popen
popen ( path )
path
Converts path to open form.
popen(path '((0,0),(1,1),(2,0))')
[(0,0),(1,1),(2,0)]
radius
radius ( circle )
double precision
Computes radius of circle.
radius(circle '<(0,0),2>')
2
slope
slope ( point, point )
double precision
Computes slope of a line drawn through the two points.
slope(point '(0,0)', point '(2,1)')
0.5
width
width ( box )
double precision
Computes horizontal size of box.
width(box '(1,2),(0,0)')
1
Geometric Type Conversion Functions
Function
Description
Example(s)
box
box ( circle )
box
Computes box inscribed within the circle.
box(circle '<(0,0),2>')
(1.414213562373095,1.414213562373095),&zwsp;(-1.414213562373095,-1.414213562373095)
box ( point )
box
Converts point to empty box.
box(point '(1,0)')
(1,0),(1,0)
box ( point, point )
box
Converts any two corner points to box.
box(point '(0,1)', point '(1,0)')
(1,1),(0,0)
box ( polygon )
box
Computes bounding box of polygon.
box(polygon '((0,0),(1,1),(2,0))')
(2,1),(0,0)
bound_box
bound_box ( box, box )
box
Computes bounding box of two boxes.
bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)')
(4,4),(0,0)
circle
circle ( box )
circle
Computes smallest circle enclosing box.
circle(box '(1,1),(0,0)')
<(0.5,0.5),0.7071067811865476>
circle ( point, double precision )
circle
Constructs circle from center and radius.
circle(point '(0,0)', 2.0)
<(0,0),2>
circle ( polygon )
circle
Converts polygon to circle. The circle's center is the mean of the
positions of the polygon's points, and the radius is the average
distance of the polygon's points from that center.
circle(polygon '((0,0),(1,3),(2,0))')
<(1,1),1.6094757082487299>
line
line ( point, point )
line
Converts two points to the line through them.
line(point '(-1,0)', point '(1,0)')
{0,-1,0}
lseg
lseg ( box )
lseg
Extracts box's diagonal as a line segment.
lseg(box '(1,0),(-1,0)')
[(1,0),(-1,0)]
lseg ( point, point )
lseg
Constructs line segment from two endpoints.
lseg(point '(-1,0)', point '(1,0)')
[(-1,0),(1,0)]
path
path ( polygon )
path
Converts polygon to a closed path with the same list of points.
path(polygon '((0,0),(1,1),(2,0))')
((0,0),(1,1),(2,0))
point
point ( double precision, double precision )
point
Constructs point from its coordinates.
point(23.4, -44.5)
(23.4,-44.5)
point ( box )
point
Computes center of box.
point(box '(1,0),(-1,0)')
(0,0)
point ( circle )
point
Computes center of circle.
point(circle '<(0,0),2>')
(0,0)
point ( lseg )
point
Computes center of line segment.
point(lseg '[(-1,0),(1,0)]')
(0,0)
point ( polygon )
point
Computes center of polygon (the mean of the
positions of the polygon's points).
point(polygon '((0,0),(1,1),(2,0))')
(1,0.3333333333333333)
polygon
polygon ( box )
polygon
Converts box to a 4-point polygon.
polygon(box '(1,1),(0,0)')
((0,0),(0,1),(1,1),(1,0))
polygon ( circle )
polygon
Converts circle to a 12-point polygon.
polygon(circle '<(0,0),2>')
((-2,0),&zwsp;(-1.7320508075688774,0.9999999999999999),&zwsp;(-1.0000000000000002,1.7320508075688772),&zwsp;(-1.2246063538223773e-16,2),&zwsp;(0.9999999999999996,1.7320508075688774),&zwsp;(1.732050807568877,1.0000000000000007),&zwsp;(2,2.4492127076447545e-16),&zwsp;(1.7320508075688776,-0.9999999999999994),&zwsp;(1.0000000000000009,-1.7320508075688767),&zwsp;(3.673819061467132e-16,-2),&zwsp;(-0.9999999999999987,-1.732050807568878),&zwsp;(-1.7320508075688767,-1.0000000000000009))
polygon ( integer, circle )
polygon
Converts circle to an n-point polygon.
polygon(4, circle '<(3,0),1>')
((2,0),&zwsp;(3,1),&zwsp;(4,1.2246063538223773e-16),&zwsp;(3,-1))
polygon ( path )
polygon
Converts closed path to a polygon with the same list of points.
polygon(path '((0,0),(1,1),(2,0))')
((0,0),(1,1),(2,0))
It is possible to access the two component numbers of a point
as though the point were an array with indexes 0 and 1. For example, if
t.p is a point column then
SELECT p[0] FROM t retrieves the X coordinate and
UPDATE t SET p[1] = ... changes the Y coordinate.
In the same way, a value of type box or lseg can be treated
as an array of two point values.