MobilityDB 1.3
Loading...
Searching...
No Matches
cbuffer.h
Go to the documentation of this file.
1/*****************************************************************************
2 *
3 * This MobilityDB code is provided under The PostgreSQL License.
4 * Copyright (c) 2016-2025, Université libre de Bruxelles and MobilityDB
5 * contributors
6 *
7 * MobilityDB includes portions of PostGIS version 3 source code released
8 * under the GNU General Public License (GPLv2 or later).
9 * Copyright (c) 2001-2025, PostGIS contributors
10 *
11 * Permission to use, copy, modify, and distribute this software and its
12 * documentation for any purpose, without fee, and without a written
13 * agreement is hereby granted, provided that the above copyright notice and
14 * this paragraph and the following two paragraphs appear in all copies.
15 *
16 * IN NO EVENT SHALL UNIVERSITE LIBRE DE BRUXELLES BE LIABLE TO ANY PARTY FOR
17 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
18 * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
19 * EVEN IF UNIVERSITE LIBRE DE BRUXELLES HAS BEEN ADVISED OF THE POSSIBILITY
20 * OF SUCH DAMAGE.
21 *
22 * UNIVERSITE LIBRE DE BRUXELLES SPECIFICALLY DISCLAIMS ANY WARRANTIES,
23 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON
25 * AN "AS IS" BASIS, AND UNIVERSITE LIBRE DE BRUXELLES HAS NO OBLIGATIONS TO
26 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
27 *
28 *****************************************************************************/
29
34#ifndef __CBUFFER_H__
35#define __CBUFFER_H__
36
37/* PostgreSQL */
38#include <postgres.h>
39/* MEOS */
40#include <meos.h>
41#include <meos_cbuffer.h>
42
43/*****************************************************************************
44 * Type definitions
45 *****************************************************************************/
46
47/* Structure to represent circular buffers */
48
49struct Cbuffer
50{
52 double radius;
56 /* variable-length data follows */
57};
58
59/*****************************************************************************
60 * fmgr macros
61 *****************************************************************************/
62
63#define DatumGetCbufferP(X) ((Cbuffer *) DatumGetPointer(X))
64#define CbufferPGetDatum(X) PointerGetDatum(X)
65#define PG_GETARG_CBUFFER_P(X) DatumGetCbufferP(PG_GETARG_DATUM(X))
66#define PG_RETURN_CBUFFER_P(X) PG_RETURN_POINTER(X)
67
68/*****************************************************************************/
69
70/* Validity functions */
71
72extern bool ensure_valid_cbuffer_cbuffer(const Cbuffer *cb1,
73 const Cbuffer *cb2);
74extern bool ensure_valid_cbuffer_geo(const Cbuffer *cb,
75 const GSERIALIZED *gs);
76extern bool ensure_valid_cbuffer_stbox(const Cbuffer *cb, const STBox *box);
77extern bool ensure_valid_cbufferset_cbuffer(const Set *s, const Cbuffer *cb);
78
79/* Collinear and interpolation functions */
80
81extern bool cbuffer_collinear(const Cbuffer *cb1, const Cbuffer *cb2,
82 const Cbuffer *cbuf3, double ratio);
83extern Cbuffer *cbuffersegm_interpolate(const Cbuffer *start,
84 const Cbuffer *end, long double ratio);
85extern long double cbuffersegm_locate(const Cbuffer *start, const Cbuffer *end,
86 const Cbuffer *value);
87
88/* Input/output functions */
89
90extern Cbuffer *cbuffer_parse(const char **str, bool end);
91extern char *cbuffer_wkt_out(Datum value, int maxdd, bool extended);
92
93/* Accessor functions */
94
95extern const GSERIALIZED *cbuffer_point_p(const Cbuffer *cb);
96
98
99/* Transformation functions */
100
101extern Cbuffer *cbuffer_transf_pj(const Cbuffer *cb, int32_t srid_to, const LWPROJ *pj);
102
103/* Distance function */
104
105extern double cbuffer_distance(const Cbuffer *cb1, const Cbuffer *cb2);
106extern Datum datum_cbuffer_distance(Datum cb1, Datum cb2);
107extern int cbuffersegm_distance_turnpt(const Cbuffer *start1,
108 const Cbuffer *end1, const Cbuffer *start2, const Cbuffer *end2,
109 TimestampTz lower, TimestampTz upper, TimestampTz *t1, TimestampTz *t2);
110
111/* Spatial relationship functions */
112
113extern int cbuffer_contains(const Cbuffer *cb1, const Cbuffer *cb2);
114extern int cbuffer_covers(const Cbuffer *cb1, const Cbuffer *cb2);
115extern int cbuffer_disjoint(const Cbuffer *cb1, const Cbuffer *cb2);
116extern int cbuffer_intersects(const Cbuffer *cb1, const Cbuffer *cb2);
117extern int cbuffer_dwithin(const Cbuffer *cb1, const Cbuffer *cb2, double dist);
118extern int cbuffer_touches(const Cbuffer *cb1, const Cbuffer *cb2);
119
120extern int contains_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2);
121extern int covers_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2);
122extern int disjoint_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2);
123extern int intersects_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2);
124extern int dwithin_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2, double dist);
125extern int touches_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2);
126
127extern Datum datum_cbuffer_contains(Datum cb1, Datum cb2);
128extern Datum datum_cbuffer_covers(Datum cb1, Datum cb2);
129extern Datum datum_cbuffer_disjoint(Datum cb1, Datum cb2);
131extern Datum datum_cbuffer_dwithin(Datum cb1, Datum cb2, Datum dist);
132extern Datum datum_cbuffer_touches(Datum cb1, Datum cb2);
133
134/*****************************************************************************/
135
136#endif /* __CBUFFER_H__ */
Cbuffer * cbuffer_transf_pj(const Cbuffer *cb, int32_t srid_to, const LWPROJ *pj)
Return a circular buffer transformed to another SRID using a pipeline.
Definition: cbuffer.c:844
bool cbuffer_collinear(const Cbuffer *cb1, const Cbuffer *cb2, const Cbuffer *cbuf3, double ratio)
Return true if the three values are collinear.
Definition: cbuffer.c:78
bool ensure_valid_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2)
Ensure the validity of two circular buffers.
Definition: cbuffer.c:195
Datum datum_cbuffer_contains(Datum cb1, Datum cb2)
Return a Datum true if the first circular buffer contains the second one.
Definition: cbuffer.c:1266
int cbuffer_disjoint(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if two circular buffers are disjoint in 2D.
Definition: cbuffer.c:1114
Datum datum_cbuffer_dwithin(Datum cb1, Datum cb2, Datum dist)
Return a Datum true if two 2D circular buffers are within a distance.
Definition: cbuffer.c:1329
int cbuffer_covers(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if the first circular buffer covers the second one.
Definition: cbuffer.c:1092
Datum datum_cbuffer_intersects(Datum cb1, Datum cb2)
Return a Datum true if two circular buffers intersect in 2D.
Definition: cbuffer.c:1303
int cbuffer_dwithin(const Cbuffer *cb1, const Cbuffer *cb2, double dist)
Return true if two 2D circular buffers are within a distance.
Definition: cbuffer.c:1157
const GSERIALIZED * cbuffer_point_p(const Cbuffer *cb)
Return a pointer to the point of a circular buffer.
Definition: cbuffer.c:702
int cbuffer_intersects(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if two circular buffers intersect in 2D.
Definition: cbuffer.c:1127
Cbuffer * cbuffer_parse(const char **str, bool end)
Parse a circular buffer from its string representation.
Definition: cbuffer.c:227
Datum datum_cbuffer_touches(Datum cb1, Datum cb2)
Return a Datum true if the first circular buffer touches the second one.
Definition: cbuffer.c:1316
int cbuffer_contains(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if the first circular buffer contains the second one.
Definition: cbuffer.c:1070
Cbuffer * cbuffersegm_interpolate(const Cbuffer *start, const Cbuffer *end, long double ratio)
Return a circular buffer interpolated from a circular buffer segment with respect to a fraction of it...
Definition: cbuffer.c:149
bool ensure_valid_cbuffer_geo(const Cbuffer *cb, const GSERIALIZED *gs)
Ensure the validity of a circular buffer and geometry.
Definition: cbuffer.c:170
Datum datum_cbuffer_disjoint(Datum cb1, Datum cb2)
Return a Datum true if two circular buffers are disjoint in 2D.
Definition: cbuffer.c:1291
char * cbuffer_wkt_out(Datum value, int maxdd, bool extended)
Return the Well-Known Text (WKT) representation of a circular buffer.
Definition: cbuffer.c:339
int cbuffer_touches(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if the first circular buffer touches the second one.
Definition: cbuffer.c:1141
Datum datum_cbuffer_covers(Datum cb1, Datum cb2)
Return a Datum true if the first circular buffer covers the second one.
Definition: cbuffer.c:1279
long double cbuffersegm_locate(const Cbuffer *start, const Cbuffer *end, const Cbuffer *value)
Return a float in [0,1] representing the location of the closest location on the circular buffer segm...
Definition: cbuffer.c:97
bool ensure_valid_cbuffer_stbox(const Cbuffer *cb, const STBox *box)
Ensure the validity of a circular buffer and spatiotemporal box.
Definition: cbuffer.c:182
bool ensure_valid_cbufferset_cbuffer(const Set *s, const Cbuffer *cb)
Return true if a set and a circular buffer are valid for set operations.
Definition: cbuffer.c:210
Datum datum_cbuffer_round(Datum buffer, Datum size)
Return a circular buffer with the precision of the values set to a number of decimal places.
Definition: cbuffer.c:767
int cbuffersegm_distance_turnpt(const Cbuffer *start1, const Cbuffer *end1, const Cbuffer *start2, const Cbuffer *end2, TimestampTz lower, TimestampTz upper, TimestampTz *t1, TimestampTz *t2)
Return the TWO timestamps at which two temporal circular buffers segments are at the minimum distance...
Definition: tcbuffer_distance.c:219
int touches_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if the first circular buffer touches the second one.
Definition: cbuffer.c:1236
int covers_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if the first circular buffer covers the second one.
Definition: cbuffer.c:1200
int contains_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if the first circular buffer contains the second one.
Definition: cbuffer.c:1188
int disjoint_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if two circular buffers are disjoint in 2D.
Definition: cbuffer.c:1212
int intersects_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2)
Return true if two circular buffers intersect in 2D.
Definition: cbuffer.c:1224
int dwithin_cbuffer_cbuffer(const Cbuffer *cb1, const Cbuffer *cb2, double dist)
Return true if two 2D circular buffers are within a distance.
Definition: cbuffer.c:1249
double cbuffer_distance(const Cbuffer *cb1, const Cbuffer *cb2)
Return the distance between two circular buffers.
Definition: cbuffer.c:928
Datum datum_cbuffer_distance(Datum cb1, Datum cb2)
Return the distance between two circular buffers.
Definition: cbuffer.c:960
External API of the Mobility Engine Open Source (MEOS) library.
Datum buffer(PG_FUNCTION_ARGS)
int64 TimestampTz
Definition: postgres_ext_defs.in.h:22
uintptr_t Datum
Definition: postgres_ext_defs.in.h:7
signed int int32
Definition: postgres_ext_defs.in.h:11
double radius
radius
Definition: cbuffer.h:52
Datum point
First 8 bytes of the point which is passed by reference.
Definition: cbuffer.h:53
int32 vl_len_
Varlena header (do not touch directly!)
Definition: cbuffer.h:51
Functions for temporal buffers.
Definition: cbuffer.h:50
Definition: postgis_ext_defs.in.h:170
Definition: postgis_ext_defs.in.h:406
Structure to represent spatiotemporal boxes.
Definition: meos.h:134
Structure to represent sets of values.
Definition: meos.h:80
int const GSERIALIZED * gs
Definition: trgeo_spatialrels.h:52