PostGIS  3.0.6dev-r@@SVN_REVISION@@
liblwgeom_internal.h
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  *
6  * PostGIS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * PostGIS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with PostGIS. If not, see <http://www.gnu.org/licenses/>.
18  *
19  **********************************************************************
20  *
21  * Copyright (C) 2011-2012 Sandro Santilli <strk@kbt.io>
22  * Copyright (C) 2011 Paul Ramsey <pramsey@cleverelephant.ca>
23  * Copyright (C) 2007-2008 Mark Cave-Ayland
24  * Copyright (C) 2001-2006 Refractions Research Inc.
25  *
26  **********************************************************************/
27 
28 
29 #ifndef _LIBLWGEOM_INTERNAL_H
30 #define _LIBLWGEOM_INTERNAL_H 1
31 
32 #include "../postgis_config.h"
33 
34 #include "lwgeom_log.h"
35 
36 #include <assert.h>
37 #include <stdarg.h>
38 #include <stdint.h>
39 #include <stdio.h>
40 #include <string.h>
41 #include <stdlib.h>
42 #include <float.h>
43 #include <math.h>
44 
45 #if HAVE_IEEEFP_H
46 #include <ieeefp.h>
47 #endif
48 
49 #include "liblwgeom.h"
50 
54 #define FP_TOLERANCE 1e-12
55 #define FP_IS_ZERO(A) (fabs(A) <= FP_TOLERANCE)
56 #define FP_MAX(A, B) (((A) > (B)) ? (A) : (B))
57 #define FP_MIN(A, B) (((A) < (B)) ? (A) : (B))
58 #define FP_ABS(a) ((a) < (0) ? -(a) : (a))
59 #define FP_EQUALS(A, B) (fabs((A)-(B)) <= FP_TOLERANCE)
60 #define FP_NEQUALS(A, B) (fabs((A)-(B)) > FP_TOLERANCE)
61 #define FP_LT(A, B) (((A) + FP_TOLERANCE) < (B))
62 #define FP_LTEQ(A, B) (((A) - FP_TOLERANCE) <= (B))
63 #define FP_GT(A, B) (((A) - FP_TOLERANCE) > (B))
64 #define FP_GTEQ(A, B) (((A) + FP_TOLERANCE) >= (B))
65 #define FP_CONTAINS_TOP(A, X, B) (FP_LT(A, X) && FP_LTEQ(X, B))
66 #define FP_CONTAINS_BOTTOM(A, X, B) (FP_LTEQ(A, X) && FP_LT(X, B))
67 #define FP_CONTAINS_INCL(A, X, B) (FP_LTEQ(A, X) && FP_LTEQ(X, B))
68 #define FP_CONTAINS_EXCL(A, X, B) (FP_LT(A, X) && FP_LT(X, B))
69 #define FP_CONTAINS(A, X, B) FP_CONTAINS_EXCL(A, X, B)
70 
71 
72 /*
73 * this will change to NaN when I figure out how to
74 * get NaN in a platform-independent way
75 */
76 #define NO_VALUE 0.0
77 #define NO_Z_VALUE NO_VALUE
78 #define NO_M_VALUE NO_VALUE
79 
80 
84 #define WKT_NO_TYPE 0x08 /* Internal use only */
85 #define WKT_NO_PARENS 0x10 /* Internal use only */
86 #define WKT_IS_CHILD 0x20 /* Internal use only */
87 
92 #define WKB_DOUBLE_SIZE 8 /* Internal use only */
93 #define WKB_INT_SIZE 4 /* Internal use only */
94 #define WKB_BYTE_SIZE 1 /* Internal use only */
95 
99 #define WKB_POINT_TYPE 1
100 #define WKB_LINESTRING_TYPE 2
101 #define WKB_POLYGON_TYPE 3
102 #define WKB_MULTIPOINT_TYPE 4
103 #define WKB_MULTILINESTRING_TYPE 5
104 #define WKB_MULTIPOLYGON_TYPE 6
105 #define WKB_GEOMETRYCOLLECTION_TYPE 7
106 #define WKB_CIRCULARSTRING_TYPE 8
107 #define WKB_COMPOUNDCURVE_TYPE 9
108 #define WKB_CURVEPOLYGON_TYPE 10
109 #define WKB_MULTICURVE_TYPE 11
110 #define WKB_MULTISURFACE_TYPE 12
111 #define WKB_CURVE_TYPE 13 /* from ISO draft, not sure is real */
112 #define WKB_SURFACE_TYPE 14 /* from ISO draft, not sure is real */
113 #define WKB_POLYHEDRALSURFACE_TYPE 15
114 #define WKB_TIN_TYPE 16
115 #define WKB_TRIANGLE_TYPE 17
116 
123 #ifdef WORDS_BIGENDIAN
124 #define SIZE_GET(varsize) ((varsize) & 0x3FFFFFFF)
125 #define SIZE_SET(varsize, len) ((varsize) = ((len) & 0x3FFFFFFF))
126 #define IS_BIG_ENDIAN 1
127 #else
128 #define SIZE_GET(varsize) (((varsize) >> 2) & 0x3FFFFFFF)
129 #define SIZE_SET(varsize, len) ((varsize) = (((uint32_t)(len)) << 2))
130 #define IS_BIG_ENDIAN 0
131 #endif
132 
139 #define SIGNUM(n) (((n) > 0) - ((n) < 0))
140 
144 #define EPSILON_SQLMM 1e-8
145 
146 /*
147  * Export functions
148  */
149 #define OUT_MAX_DOUBLE 1E15
150 #define OUT_SHOW_DIGS_DOUBLE 20
151 #define OUT_MAX_DOUBLE_PRECISION 15
152 #define OUT_MAX_DIGS_DOUBLE (OUT_SHOW_DIGS_DOUBLE + 2) /* +2 mean add dot and sign */
153 #define OUT_DOUBLE_BUFFER_SIZE \
154  OUT_MAX_DIGS_DOUBLE + OUT_MAX_DOUBLE_PRECISION + 1
155 
159 #define LW_INSIDE 1
160 #define LW_BOUNDARY 0
161 #define LW_OUTSIDE -1
162 
163 /*
164 * Internal prototypes
165 */
166 
167 /* Machine endianness */
168 #define XDR 0 /* big endian */
169 #define NDR 1 /* little endian */
170 
171 
172 /*
173 * Force dims
174 */
175 LWGEOM* lwgeom_force_dims(const LWGEOM *lwgeom, int hasz, int hasm);
176 LWPOINT* lwpoint_force_dims(const LWPOINT *lwpoint, int hasz, int hasm);
177 LWLINE* lwline_force_dims(const LWLINE *lwline, int hasz, int hasm);
178 LWPOLY* lwpoly_force_dims(const LWPOLY *lwpoly, int hasz, int hasm);
179 LWCOLLECTION* lwcollection_force_dims(const LWCOLLECTION *lwcol, int hasz, int hasm);
180 POINTARRAY* ptarray_force_dims(const POINTARRAY *pa, int hasz, int hasm);
181 
187 void ptarray_swap_ordinates(POINTARRAY *pa, LWORD o1, LWORD o2);
188 
189 /*
190 * Is Empty?
191 */
192 int lwpoly_is_empty(const LWPOLY *poly);
195 int lwtriangle_is_empty(const LWTRIANGLE *triangle);
196 int lwline_is_empty(const LWLINE *line);
197 int lwpoint_is_empty(const LWPOINT *point);
198 
199 /*
200 * Number of vertices?
201 */
202 uint32_t lwline_count_vertices(LWLINE *line);
203 uint32_t lwpoly_count_vertices(LWPOLY *poly);
205 
206 /*
207 * DP simplification
208 */
209 
213 void ptarray_simplify_in_place(POINTARRAY *pa, double tolerance, uint32_t minpts);
214 
215 /*
216 * The possible ways a pair of segments can interact. Returned by lw_segment_intersects
217 */
219  SEG_ERROR = -1,
225  SEG_TOUCH_RIGHT = 5
226 };
227 
228 /*
229 * Do the segments intersect? How?
230 */
231 int lw_segment_intersects(const POINT2D *p1, const POINT2D *p2, const POINT2D *q1, const POINT2D *q2);
232 
233 /*
234 * Get/Set an enumeratoed ordinate. (x,y,z,m)
235 */
236 double lwpoint_get_ordinate(const POINT4D *p, char ordinate);
237 void lwpoint_set_ordinate(POINT4D *p, char ordinate, double value);
238 
239 /*
240 * Generate an interpolated coordinate p given an interpolation value and ordinate to apply it to
241 */
242 int point_interpolate(const POINT4D *p1, const POINT4D *p2, POINT4D *p, int hasz, int hasm, char ordinate, double interpolation_value);
243 
244 
245 /*
246 * Geohash
247 */
248 int lwgeom_geohash_precision(GBOX bbox, GBOX *bounds);
249 char *geohash_point(double longitude, double latitude, int precision);
250 void decode_geohash_bbox(char *geohash, double *lat, double *lon, int precision);
251 
252 /*
253 * Point comparisons
254 */
255 int p4d_same(const POINT4D *p1, const POINT4D *p2);
256 int p3d_same(const POINT3D *p1, const POINT3D *p2);
257 int p2d_same(const POINT2D *p1, const POINT2D *p2);
258 
259 /*
260 * Area calculations
261 */
262 double lwpoly_area(const LWPOLY *poly);
263 double lwcurvepoly_area(const LWCURVEPOLY *curvepoly);
264 double lwtriangle_area(const LWTRIANGLE *triangle);
265 
271 
272 /*
273  * Populate a bounding box *without* allocating an LWGEOM. Useful for some performance
274  * purposes. Use only if gserialized_read_gbox_p failed
275  */
277 
283 size_t gserialized_from_lwgeom_size(const LWGEOM *geom);
284 
285 /*
286 * Length calculations
287 */
288 double lwcompound_length(const LWCOMPOUND *comp);
289 double lwcompound_length_2d(const LWCOMPOUND *comp);
290 double lwline_length(const LWLINE *line);
291 double lwline_length_2d(const LWLINE *line);
292 double lwcircstring_length(const LWCIRCSTRING *circ);
293 double lwcircstring_length_2d(const LWCIRCSTRING *circ);
294 double lwpoly_perimeter(const LWPOLY *poly);
295 double lwpoly_perimeter_2d(const LWPOLY *poly);
296 double lwcurvepoly_perimeter(const LWCURVEPOLY *poly);
297 double lwcurvepoly_perimeter_2d(const LWCURVEPOLY *poly);
298 double lwtriangle_perimeter(const LWTRIANGLE *triangle);
299 double lwtriangle_perimeter_2d(const LWTRIANGLE *triangle);
300 
301 /*
302 * Segmentization
303 */
304 LWPOLY *lwcurvepoly_stroke(const LWCURVEPOLY *curvepoly, uint32_t perQuad);
305 
306 /*
307 * Affine
308 */
309 void ptarray_affine(POINTARRAY *pa, const AFFINE *affine);
310 void affine_invert(AFFINE *affine);
311 
312 /*
313 * Scale
314 */
315 void ptarray_scale(POINTARRAY *pa, const POINT4D *factor);
316 
317 /*
318 * PointArray
319 */
320 int ptarray_has_z(const POINTARRAY *pa);
321 int ptarray_has_m(const POINTARRAY *pa);
322 double ptarray_signed_area(const POINTARRAY *pa);
323 
324 /*
325 * Length
326 */
327 double ptarray_length(const POINTARRAY *pts);
328 double ptarray_arc_length_2d(const POINTARRAY *pts);
329 
330 /*
331 * Clone support
332 */
333 LWPOINT *lwpoint_clone(const LWPOINT *lwgeom);
334 LWLINE *lwline_clone(const LWLINE *lwgeom);
335 LWPOLY *lwpoly_clone(const LWPOLY *lwgeom);
336 LWTRIANGLE *lwtriangle_clone(const LWTRIANGLE *lwgeom);
339 POINTARRAY *ptarray_clone(const POINTARRAY *ptarray);
340 LWLINE *lwline_clone_deep(const LWLINE *lwgeom);
341 LWPOLY *lwpoly_clone_deep(const LWPOLY *lwgeom);
343 GBOX *gbox_clone(const GBOX *gbox);
344 
345 /*
346 * Clockwise
347 */
348 void lwpoly_force_clockwise(LWPOLY *poly);
349 void lwtriangle_force_clockwise(LWTRIANGLE *triangle);
350 int lwpoly_is_clockwise(LWPOLY *poly);
351 int lwtriangle_is_clockwise(LWTRIANGLE *triangle);
352 int ptarray_isccw(const POINTARRAY *pa);
353 
354 /*
355 * Same
356 */
357 char ptarray_same(const POINTARRAY *pa1, const POINTARRAY *pa2);
358 char lwpoint_same(const LWPOINT *p1, const LWPOINT *p2);
359 char lwline_same(const LWLINE *p1, const LWLINE *p2);
360 char lwpoly_same(const LWPOLY *p1, const LWPOLY *p2);
361 char lwtriangle_same(const LWTRIANGLE *p1, const LWTRIANGLE *p2);
362 char lwcollection_same(const LWCOLLECTION *p1, const LWCOLLECTION *p2);
363 char lwcircstring_same(const LWCIRCSTRING *p1, const LWCIRCSTRING *p2);
364 
365 /*
366 * Shift
367 */
369 
370 /*
371 * Support for in place modification of point arrays, fast
372 * function to move coordinate values around
373 */
374 void ptarray_copy_point(POINTARRAY *pa, uint32_t from, uint32_t to);
375 
376 /*
377 * Reverse
378 */
380 
381 /*
382 * Startpoint
383 */
384 int lwpoly_startpoint(const LWPOLY* lwpoly, POINT4D* pt);
385 int ptarray_startpoint(const POINTARRAY* pa, POINT4D* pt);
386 int lwcollection_startpoint(const LWCOLLECTION* col, POINT4D* pt);
387 
388 /*
389  * Write into *ret the coordinates of the closest point on
390  * segment A-B to the reference input point R
391  */
392 void closest_point_on_segment(const POINT4D *R, const POINT4D *A, const POINT4D *B, POINT4D *ret);
393 
394 /*
395 * Repeated points
396 */
397 POINTARRAY *ptarray_remove_repeated_points(const POINTARRAY *in, double tolerance);
398 LWGEOM* lwline_remove_repeated_points(const LWLINE *in, double tolerance);
399 void ptarray_remove_repeated_points_in_place(POINTARRAY *pa, double tolerance, uint32_t min_points);
400 
401 /*
402 * Closure test
403 */
404 int lwline_is_closed(const LWLINE *line);
405 int lwpoly_is_closed(const LWPOLY *poly);
406 int lwcircstring_is_closed(const LWCIRCSTRING *curve);
407 int lwcompound_is_closed(const LWCOMPOUND *curve);
408 int lwpsurface_is_closed(const LWPSURFACE *psurface);
409 int lwtin_is_closed(const LWTIN *tin);
410 
414 void ptarray_grid_in_place(POINTARRAY *pa, const gridspec *grid);
415 
416 /*
417 * What side of the line formed by p1 and p2 does q fall?
418 * Returns -1 for left and 1 for right and 0 for co-linearity
419 */
420 int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q);
421 int lw_arc_side(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, const POINT2D *Q);
422 int lw_arc_calculate_gbox_cartesian_2d(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, GBOX *gbox);
423 double lw_arc_center(const POINT2D *p1, const POINT2D *p2, const POINT2D *p3, POINT2D *result);
424 int lw_pt_in_seg(const POINT2D *P, const POINT2D *A1, const POINT2D *A2);
425 int lw_pt_in_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3);
426 int lw_arc_is_pt(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3);
427 double lw_seg_length(const POINT2D *A1, const POINT2D *A2);
428 double lw_arc_length(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3);
429 int pt_in_ring_2d(const POINT2D *p, const POINTARRAY *ring);
430 int ptarray_contains_point(const POINTARRAY *pa, const POINT2D *pt);
431 int ptarrayarc_contains_point(const POINTARRAY *pa, const POINT2D *pt);
432 int ptarray_contains_point_partial(const POINTARRAY *pa, const POINT2D *pt, int check_closed, int *winding_number);
433 int ptarrayarc_contains_point_partial(const POINTARRAY *pa, const POINT2D *pt, int check_closed, int *winding_number);
434 int lwcompound_contains_point(const LWCOMPOUND *comp, const POINT2D *pt);
435 int lwgeom_contains_point(const LWGEOM *geom, const POINT2D *pt);
436 
447 int lwline_split_by_point_to(const LWLINE* ln, const LWPOINT* pt, LWMLINE* to);
448 
450 void lwcollection_reserve(LWCOLLECTION *col, uint32_t ngeoms);
451 
453 int lwcollection_allows_subtype(int collectiontype, int subtype);
454 
456 double gbox_angular_height(const GBOX* gbox);
457 double gbox_angular_width(const GBOX* gbox);
458 int gbox_centroid(const GBOX* gbox, POINT2D* out);
459 
460 /* Utilities */
461 int lwprint_double(double d, int maxdd, char* buf, size_t bufsize);
462 extern uint8_t MULTITYPE[NUMTYPES];
463 
465 extern int _lwgeom_interrupt_requested;
466 #define LW_ON_INTERRUPT(x) { \
467  if ( _lwgeom_interrupt_callback ) { \
468  (*_lwgeom_interrupt_callback)(); \
469  } \
470  if ( _lwgeom_interrupt_requested ) { \
471  _lwgeom_interrupt_requested = 0; \
472  lwnotice("liblwgeom code interrupted"); \
473  x; \
474  } \
475 }
476 
477 int ptarray_npoints_in_rect(const POINTARRAY *pa, const GBOX *gbox);
478 int gbox_contains_point2d(const GBOX *g, const POINT2D *p);
479 int lwpoly_contains_point(const LWPOLY *poly, const POINT2D *pt);
480 POINT4D* lwmpoint_extract_points_4d(const LWMPOINT* g, uint32_t* npoints, int* input_empty);
481 char* lwstrdup(const char* a);
482 
483 #endif /* _LIBLWGEOM_INTERNAL_H */
static uint8_t precision
Definition: cu_in_twkb.c:25
void() lwinterrupt_callback()
Install a callback to be called periodically during algorithm execution.
Definition: liblwgeom.h:305
#define NUMTYPES
Definition: liblwgeom.h:132
enum LWORD_T LWORD
Ordinate names.
This library is the generic geometry handling section of PostGIS.
int ptarray_contains_point_partial(const POINTARRAY *pa, const POINT2D *pt, int check_closed, int *winding_number)
Definition: ptarray.c:738
char * lwstrdup(const char *a)
Definition: lwutil.c:248
size_t gserialized_from_lwgeom_size(const LWGEOM *geom)
Calculate required memory segment to contain a serialized form of the LWGEOM.
Definition: gserialized.c:230
double lwline_length_2d(const LWLINE *line)
Definition: lwline.c:517
void ptarray_longitude_shift(POINTARRAY *pa)
Longitude shift for a pointarray.
Definition: ptarray.c:1415
void lwpoint_set_ordinate(POINT4D *p, char ordinate, double value)
Given a point, ordinate number and value, set that ordinate on the point.
LWLINE * lwline_clone_deep(const LWLINE *lwgeom)
Definition: lwline.c:109
int lwgeom_geohash_precision(GBOX bbox, GBOX *bounds)
Definition: lwalgorithm.c:765
double lwcircstring_length_2d(const LWCIRCSTRING *circ)
Definition: lwcircstring.c:274
LWPOINT * lwpoint_clone(const LWPOINT *lwgeom)
Definition: lwpoint.c:239
lwinterrupt_callback * _lwgeom_interrupt_callback
Definition: lwgeom_api.c:678
LWGEOM * lwline_remove_repeated_points(const LWLINE *in, double tolerance)
Definition: lwline.c:439
int lwcircstring_is_closed(const LWCIRCSTRING *curve)
Definition: lwcircstring.c:261
void ptarray_reverse_in_place(POINTARRAY *pa)
Definition: ptarray.c:331
LWLINE * lwline_clone(const LWLINE *lwgeom)
Definition: lwline.c:93
char lwcollection_same(const LWCOLLECTION *p1, const LWCOLLECTION *p2)
check for same geometry composition
Definition: lwcollection.c:279
int p4d_same(const POINT4D *p1, const POINT4D *p2)
Definition: lwalgorithm.c:32
int ptarrayarc_contains_point(const POINTARRAY *pa, const POINT2D *pt)
For POINTARRAYs representing CIRCULARSTRINGS.
Definition: ptarray.c:831
double lwtriangle_area(const LWTRIANGLE *triangle)
Find the area of the outer ring.
Definition: lwtriangle.c:178
int p3d_same(const POINT3D *p1, const POINT3D *p2)
Definition: lwalgorithm.c:41
double lwpoint_get_ordinate(const POINT4D *p, char ordinate)
Given a POINT4D and an ordinate number, return the value of the ordinate.
double lw_arc_length(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3)
Returns the length of a circular arc segment.
Definition: lwalgorithm.c:119
double lwcompound_length_2d(const LWCOMPOUND *comp)
Definition: lwcompound.c:74
uint32_t lwpoly_count_vertices(LWPOLY *poly)
Definition: lwpoly.c:418
int lwline_is_empty(const LWLINE *line)
int lwcompound_contains_point(const LWCOMPOUND *comp, const POINT2D *pt)
Definition: lwcompound.c:145
double ptarray_length(const POINTARRAY *pts)
Find the 3d/2d length of the given POINTARRAY (depending on its dimensionality)
Definition: ptarray.c:1728
double ptarray_signed_area(const POINTARRAY *pa)
Returns the area in cartesian units.
Definition: ptarray.c:995
int lwline_is_closed(const LWLINE *line)
Definition: lwline.c:445
char lwtriangle_same(const LWTRIANGLE *p1, const LWTRIANGLE *p2)
Definition: lwtriangle.c:126
int lwpoly_startpoint(const LWPOLY *lwpoly, POINT4D *pt)
Definition: lwpoly.c:524
POINTARRAY * ptarray_clone(const POINTARRAY *ptarray)
Clone a POINTARRAY object.
Definition: ptarray.c:657
int lwcollection_startpoint(const LWCOLLECTION *col, POINT4D *pt)
Definition: lwcollection.c:560
int _lwgeom_interrupt_requested
Definition: lwgeom_api.c:668
int ptarray_startpoint(const POINTARRAY *pa, POINT4D *pt)
Definition: ptarray.c:1963
int lwcompound_is_closed(const LWCOMPOUND *curve)
Definition: lwcompound.c:35
int gbox_contains_point2d(const GBOX *g, const POINT2D *p)
Definition: gbox.c:350
double lwtriangle_perimeter_2d(const LWTRIANGLE *triangle)
Definition: lwtriangle.c:210
int lwpoly_is_clockwise(LWPOLY *poly)
Definition: lwpoly.c:288
void ptarray_grid_in_place(POINTARRAY *pa, const gridspec *grid)
Snap to grid.
Definition: ptarray.c:1978
double gbox_angular_height(const GBOX *gbox)
GBOX utility functions to figure out coverage/location on the globe.
Definition: lwgeodetic.c:188
double lwpoly_area(const LWPOLY *poly)
Find the area of the outer ring - sum (area of inner rings).
Definition: lwpoly.c:434
CG_SEGMENT_INTERSECTION_TYPE
@ SEG_NO_INTERSECTION
@ SEG_ERROR
@ SEG_COLINEAR
@ SEG_TOUCH_LEFT
@ SEG_CROSS_RIGHT
@ SEG_CROSS_LEFT
@ SEG_TOUCH_RIGHT
int lwline_split_by_point_to(const LWLINE *ln, const LWPOINT *pt, LWMLINE *to)
Split a line by a point and push components to the provided multiline.
int lw_segment_intersects(const POINT2D *p1, const POINT2D *p2, const POINT2D *q1, const POINT2D *q2)
returns the kind of CG_SEGMENT_INTERSECTION_TYPE behavior of lineseg 1 (constructed from p1 and p2) a...
Definition: lwalgorithm.c:373
int lwtriangle_is_clockwise(LWTRIANGLE *triangle)
Definition: lwtriangle.c:113
char ptarray_same(const POINTARRAY *pa1, const POINTARRAY *pa2)
Definition: ptarray.c:476
double gbox_angular_width(const GBOX *gbox)
Returns the angular width (longitudinal span) of the box in radians.
Definition: lwgeodetic.c:215
char lwline_same(const LWLINE *p1, const LWLINE *p2)
Definition: lwline.c:141
void ptarray_remove_repeated_points_in_place(POINTARRAY *pa, double tolerance, uint32_t min_points)
Definition: ptarray.c:1452
double lwtriangle_perimeter(const LWTRIANGLE *triangle)
Definition: lwtriangle.c:201
POINT4D * lwmpoint_extract_points_4d(const LWMPOINT *g, uint32_t *npoints, int *input_empty)
double lw_arc_center(const POINT2D *p1, const POINT2D *p2, const POINT2D *p3, POINT2D *result)
Determines the center of the circle defined by the three given points.
Definition: lwalgorithm.c:229
int lwpoint_is_empty(const LWPOINT *point)
void ptarray_simplify_in_place(POINTARRAY *pa, double tolerance, uint32_t minpts)
Definition: ptarray.c:1587
int pt_in_ring_2d(const POINT2D *p, const POINTARRAY *ring)
Definition: lwalgorithm.c:282
double lwcompound_length(const LWCOMPOUND *comp)
Definition: lwcompound.c:69
LWCOLLECTION * lwcollection_clone_deep(const LWCOLLECTION *lwgeom)
Deep clone LWCOLLECTION object.
Definition: lwcollection.c:150
int lw_arc_side(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, const POINT2D *Q)
Definition: lwalgorithm.c:179
double lw_seg_length(const POINT2D *A1, const POINT2D *A2)
Returns the length of a linear segment.
Definition: lwalgorithm.c:75
void lwtriangle_force_clockwise(LWTRIANGLE *triangle)
Definition: lwtriangle.c:106
LWPOINT * lwpoint_force_dims(const LWPOINT *lwpoint, int hasz, int hasm)
Definition: lwpoint.c:271
void affine_invert(AFFINE *affine)
double ptarray_arc_length_2d(const POINTARRAY *pts)
Find the 2d length of the given POINTARRAY, using circular arc interpolation between each coordinate ...
Definition: ptarray.c:1673
POINTARRAY * ptarray_remove_repeated_points(const POINTARRAY *in, double tolerance)
Definition: ptarray.c:1445
void ptarray_scale(POINTARRAY *pa, const POINT4D *factor)
WARNING, make sure you send in only 16-member double arrays or obviously things will go pear-shaped f...
Definition: ptarray.c:1945
void ptarray_affine(POINTARRAY *pa, const AFFINE *affine)
Affine transform a pointarray.
Definition: ptarray.c:1758
int lwpsurface_is_closed(const LWPSURFACE *psurface)
Definition: lwpsurface.c:99
int lwtriangle_is_empty(const LWTRIANGLE *triangle)
int ptarray_contains_point(const POINTARRAY *pa, const POINT2D *pt)
Return 1 if the point is inside the POINTARRAY, -1 if it is outside, and 0 if it is on the boundary.
Definition: ptarray.c:732
LWPOLY * lwpoly_force_dims(const LWPOLY *lwpoly, int hasz, int hasm)
Definition: lwpoly.c:394
int ptarrayarc_contains_point_partial(const POINTARRAY *pa, const POINT2D *pt, int check_closed, int *winding_number)
Definition: ptarray.c:837
double lwcurvepoly_perimeter(const LWCURVEPOLY *poly)
Definition: lwcurvepoly.c:147
LWCOLLECTION * lwcollection_force_dims(const LWCOLLECTION *lwcol, int hasz, int hasm)
Definition: lwcollection.c:486
int lw_pt_in_seg(const POINT2D *P, const POINT2D *A1, const POINT2D *A2)
Returns true if P is between A1/A2.
Definition: lwalgorithm.c:96
int lwpoly_is_empty(const LWPOLY *poly)
char lwpoly_same(const LWPOLY *p1, const LWPOLY *p2)
Definition: lwpoly.c:339
int lwgeom_contains_point(const LWGEOM *geom, const POINT2D *pt)
Definition: lwcompound.c:129
int ptarray_isccw(const POINTARRAY *pa)
Definition: ptarray.c:1026
int ptarray_has_z(const POINTARRAY *pa)
Definition: ptarray.c:37
double lwline_length(const LWLINE *line)
Definition: lwline.c:510
int gserialized_peek_gbox_p(const GSERIALIZED *g, GBOX *gbox)
uint8_t MULTITYPE[NUMTYPES]
Look-up for the correct MULTI* type promotion for singleton types.
Definition: lwgeom.c:336
void lwcollection_reserve(LWCOLLECTION *col, uint32_t ngeoms)
Ensure the collection can hold at least up to ngeoms geometries.
Definition: lwcollection.c:175
void lwpoly_force_clockwise(LWPOLY *poly)
Definition: lwpoly.c:268
void ptarray_swap_ordinates(POINTARRAY *pa, LWORD o1, LWORD o2)
Swap ordinate values o1 and o2 on a given POINTARRAY.
Definition: ptarray.c:379
int gserialized_read_gbox_p(const GSERIALIZED *g, GBOX *gbox)
Pull a GBOX from the header of a GSERIALIZED, if one is available.
LWPOLY * lwcurvepoly_stroke(const LWCURVEPOLY *curvepoly, uint32_t perQuad)
Definition: lwstroke.c:676
double lwpoly_perimeter_2d(const LWPOLY *poly)
Compute the sum of polygon rings length (forcing 2d computation).
Definition: lwpoly.c:485
int lwprint_double(double d, int maxdd, char *buf, size_t bufsize)
Definition: lwprint.c:492
int ptarray_npoints_in_rect(const POINTARRAY *pa, const GBOX *gbox)
Definition: ptarray.c:2046
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition: lwalgorithm.c:65
int lwtin_is_closed(const LWTIN *tin)
Definition: lwtin.c:93
int gbox_centroid(const GBOX *gbox, POINT2D *out)
Computes the average(ish) center of the box and returns success.
Definition: lwgeodetic.c:267
int lwpoly_contains_point(const LWPOLY *poly, const POINT2D *pt)
Definition: lwpoly.c:532
void closest_point_on_segment(const POINT4D *R, const POINT4D *A, const POINT4D *B, POINT4D *ret)
Definition: ptarray.c:1255
GBOX * gbox_clone(const GBOX *gbox)
Definition: gbox.c:45
char lwcircstring_same(const LWCIRCSTRING *p1, const LWCIRCSTRING *p2)
Definition: lwcircstring.c:131
LWPOLY * lwpoly_clone_deep(const LWPOLY *lwgeom)
Definition: lwpoly.c:228
double lwcircstring_length(const LWCIRCSTRING *circ)
Definition: lwcircstring.c:269
uint32_t lwcollection_count_vertices(LWCOLLECTION *col)
Definition: lwcollection.c:510
int point_interpolate(const POINT4D *p1, const POINT4D *p2, POINT4D *p, int hasz, int hasm, char ordinate, double interpolation_value)
Given two points, a dimensionality, an ordinate, and an interpolation value generate a new point that...
int lw_arc_is_pt(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3)
Returns true if arc A is actually a point (all vertices are the same) .
Definition: lwalgorithm.c:106
double lwcurvepoly_area(const LWCURVEPOLY *curvepoly)
This should be rewritten to make use of the curve itself.
Definition: lwcurvepoly.c:133
LWCOLLECTION * lwcollection_clone(const LWCOLLECTION *lwgeom)
Clone LWCOLLECTION object.
Definition: lwcollection.c:124
void decode_geohash_bbox(char *geohash, double *lat, double *lon, int precision)
Definition: lwalgorithm.c:720
int lwpoly_is_closed(const LWPOLY *poly)
Definition: lwpoly.c:499
LWLINE * lwline_force_dims(const LWLINE *lwline, int hasz, int hasm)
Definition: lwline.c:483
int lwcollection_allows_subtype(int collectiontype, int subtype)
Check if subtype is allowed in collectiontype.
Definition: lwcollection.c:523
LWGEOM * lwgeom_force_dims(const LWGEOM *lwgeom, int hasz, int hasm)
Definition: lwgeom.c:799
LWPOLY * lwpoly_clone(const LWPOLY *lwgeom)
Definition: lwpoly.c:213
void ptarray_copy_point(POINTARRAY *pa, uint32_t from, uint32_t to)
Definition: lwgeom_api.c:401
POINTARRAY * ptarray_force_dims(const POINTARRAY *pa, int hasz, int hasm)
Definition: ptarray.c:1035
int lw_pt_in_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3)
Returns true if P is on the same side of the plane partition defined by A1/A3 as A2 is.
Definition: lwalgorithm.c:86
int ptarray_has_m(const POINTARRAY *pa)
Definition: ptarray.c:44
int lwcircstring_is_empty(const LWCIRCSTRING *circ)
int lwcollection_is_empty(const LWCOLLECTION *col)
uint32_t lwline_count_vertices(LWLINE *line)
Definition: lwline.c:502
double lwcurvepoly_perimeter_2d(const LWCURVEPOLY *poly)
Definition: lwcurvepoly.c:159
double lwpoly_perimeter(const LWPOLY *poly)
Compute the sum of polygon rings length.
Definition: lwpoly.c:467
int lw_arc_calculate_gbox_cartesian_2d(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, GBOX *gbox)
Definition: gbox.c:453
LWTRIANGLE * lwtriangle_clone(const LWTRIANGLE *lwgeom)
Definition: lwtriangle.c:99
char lwpoint_same(const LWPOINT *p1, const LWPOINT *p2)
Definition: lwpoint.c:264
LWCIRCSTRING * lwcircstring_clone(const LWCIRCSTRING *curve)
Definition: lwcircstring.c:124
char * geohash_point(double longitude, double latitude, int precision)
Definition: lwalgorithm.c:597
int p2d_same(const POINT2D *p1, const POINT2D *p2)
Definition: lwalgorithm.c:50
int value
Definition: genraster.py:62
Snap-to-grid.
Definition: liblwgeom.h:1341