PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches
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-2021 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#define STR_EQUALS(A, B) strcmp((A), (B)) == 0
72#define STR_IEQUALS(A, B) (strcasecmp((A), (B)) == 0)
73#define STR_ISTARTS(A, B) (strncasecmp((A), (B), strlen((B))) == 0)
74
75
76/*
77* this will change to NaN when I figure out how to
78* get NaN in a platform-independent way
79*/
80#define NO_VALUE 0.0
81#define NO_Z_VALUE NO_VALUE
82#define NO_M_VALUE NO_VALUE
83
84
88#define WKT_NO_TYPE 0x08 /* Internal use only */
89#define WKT_NO_PARENS 0x10 /* Internal use only */
90#define WKT_IS_CHILD 0x20 /* Internal use only */
91
96#define WKB_DOUBLE_SIZE 8 /* Internal use only */
97#define WKB_INT_SIZE 4 /* Internal use only */
98#define WKB_BYTE_SIZE 1 /* Internal use only */
99
103#define WKB_POINT_TYPE 1
104#define WKB_LINESTRING_TYPE 2
105#define WKB_POLYGON_TYPE 3
106#define WKB_MULTIPOINT_TYPE 4
107#define WKB_MULTILINESTRING_TYPE 5
108#define WKB_MULTIPOLYGON_TYPE 6
109#define WKB_GEOMETRYCOLLECTION_TYPE 7
110#define WKB_CIRCULARSTRING_TYPE 8
111#define WKB_COMPOUNDCURVE_TYPE 9
112#define WKB_CURVEPOLYGON_TYPE 10
113#define WKB_MULTICURVE_TYPE 11
114#define WKB_MULTISURFACE_TYPE 12
115#define WKB_CURVE_TYPE 13 /* from ISO draft, not sure is real */
116#define WKB_SURFACE_TYPE 14 /* from ISO draft, not sure is real */
117#define WKB_POLYHEDRALSURFACE_TYPE 15
118#define WKB_TIN_TYPE 16
119#define WKB_TRIANGLE_TYPE 17
120
121
128#define SIGNUM(n) (((n) > 0) - ((n) < 0))
129
133#define EPSILON_SQLMM 1e-8
134
135/*
136 * Export functions
137 */
138
139/* Any (absolute) values outside this range will be printed in scientific notation */
140#define OUT_MIN_DOUBLE 1E-8
141#define OUT_MAX_DOUBLE 1E15
142#define OUT_DEFAULT_DECIMAL_DIGITS 15
143
144/* 17 digits are sufficient for round-tripping
145 * Then we might add up to 8 (from OUT_MIN_DOUBLE) max leading zeroes (or 2 digits for "e+") */
146#define OUT_MAX_DIGITS 17 + 8
147
148/* Limit for the max amount of characters that a double can use, including dot and sign */
149/* */
150#define OUT_MAX_BYTES_DOUBLE (1 /* Sign */ + 2 /* 0.x */ + OUT_MAX_DIGITS)
151#define OUT_DOUBLE_BUFFER_SIZE OUT_MAX_BYTES_DOUBLE + 1 /* +1 including NULL */
152
156#define LW_INSIDE 1
157#define LW_BOUNDARY 0
158#define LW_OUTSIDE -1
159
163#define LW_CLOCKWISE 1
164#define LW_NONE 0
165#define LW_COUNTERCLOCKWISE -1
166
167/*
168* Internal prototypes
169*/
170
171/* Machine endianness */
172#define XDR 0 /* big endian */
173#define NDR 1 /* little endian */
174
175
176/*
177* Force dims
178*/
179LWGEOM* lwgeom_force_dims(const LWGEOM *lwgeom, int hasz, int hasm, double zval, double mval);
180LWPOINT* lwpoint_force_dims(const LWPOINT *lwpoint, int hasz, int hasm, double zval, double mval);
181LWLINE* lwline_force_dims(const LWLINE *lwline, int hasz, int hasm, double zval, double mval);
182LWPOLY* lwpoly_force_dims(const LWPOLY *lwpoly, int hasz, int hasm, double zval, double mval);
183LWCOLLECTION* lwcollection_force_dims(const LWCOLLECTION *lwcol, int hasz, int hasm, double zval, double mval);
184POINTARRAY* ptarray_force_dims(const POINTARRAY *pa, int hasz, int hasm, double zval, double mval);
185
192
193/*
194* Is Empty?
195*/
196int lwpoly_is_empty(const LWPOLY *poly);
199int lwtriangle_is_empty(const LWTRIANGLE *triangle);
200int lwline_is_empty(const LWLINE *line);
201int lwpoint_is_empty(const LWPOINT *point);
202
203/*
204* Number of vertices?
205*/
206uint32_t lwline_count_vertices(const LWLINE *line);
207uint32_t lwpoly_count_vertices(const LWPOLY *poly);
208uint32_t lwcollection_count_vertices(const LWCOLLECTION *col);
209
210/*
211* DP simplification
212*/
213
217void ptarray_simplify_in_place(POINTARRAY *pa, double tolerance, uint32_t minpts);
218
219/*
220* The possible ways a pair of segments can interact. Returned by lw_segment_intersects
221*/
231
232/*
233* Do the segments intersect? How?
234*/
235int lw_segment_intersects(const POINT2D *p1, const POINT2D *p2, const POINT2D *q1, const POINT2D *q2);
236
237/*
238* Get/Set an enumeratoed ordinate. (x,y,z,m)
239*/
240double lwpoint_get_ordinate(const POINT4D *p, char ordinate);
241void lwpoint_set_ordinate(POINT4D *p, char ordinate, double value);
242
243/*
244* Generate an interpolated coordinate p given an interpolation value and ordinate to apply it to
245*/
246int point_interpolate(const POINT4D *p1, const POINT4D *p2, POINT4D *p, int hasz, int hasm, char ordinate, double interpolation_value);
247
248
249/*
250* Geohash
251*/
252int lwgeom_geohash_precision(GBOX bbox, GBOX *bounds);
253lwvarlena_t *geohash_point(double longitude, double latitude, int precision);
254void decode_geohash_bbox(char *geohash, double *lat, double *lon, int precision);
255
256/*
257* Point comparisons (FP tolerance based)
258*/
259int p4d_same(const POINT4D *p1, const POINT4D *p2);
260int p3d_same(const POINT3D *p1, const POINT3D *p2);
261int p3dz_same(const POINT3DZ *p1, const POINT3DZ *p2);
262int p2d_same(const POINT2D *p1, const POINT2D *p2);
263
264/*
265 * Non-tolerance based equality for points
266 * whereas the p#d_same function are tolerance based
267 */
268#define P2D_SAME_STRICT(a,b) ((a)->x == (b)->x && (a)->y == (b)->y)
269#define P3DZ_SAME_STRICT(a,b) ((a)->x == (b)->x && (a)->y == (b)->y && (a)->z == (b)->z )
270#define P3DM_SAME_STRICT(a,b) ((a)->x == (b)->x && (a)->y == (b)->y && (a)->m == (b)->m )
271#define P4D_SAME_STRICT(a,b) ((a)->x == (b)->x && (a)->y == (b)->y && (a)->z == (b)->z && (a)->m == (b)->m )
272
273/*
274* Projections
275*/
276int project_pt(const POINT2D *P, double distance, double azimuth, POINT2D *R);
277int project_pt_pt(const POINT4D *A, const POINT4D *B, double distance, POINT4D *R);
278
279/*
280* Area calculations
281*/
282double lwpoly_area(const LWPOLY *poly);
283double lwcurvepoly_area(const LWCURVEPOLY *curvepoly);
284double lwtriangle_area(const LWTRIANGLE *triangle);
285
291
292/*
293 * Populate a bounding box *without* allocating an LWGEOM. Useful for some performance
294 * purposes. Use only if gserialized_read_gbox_p failed
295 */
297
303size_t gserialized_from_lwgeom_size(const LWGEOM *geom);
304
305/*
306* Length calculations
307*/
308double lwcompound_length(const LWCOMPOUND *comp);
309double lwcompound_length_2d(const LWCOMPOUND *comp);
310double lwline_length(const LWLINE *line);
311double lwline_length_2d(const LWLINE *line);
312double lwcircstring_length(const LWCIRCSTRING *circ);
313double lwcircstring_length_2d(const LWCIRCSTRING *circ);
314double lwpoly_perimeter(const LWPOLY *poly);
315double lwpoly_perimeter_2d(const LWPOLY *poly);
316double lwcurvepoly_perimeter(const LWCURVEPOLY *poly);
317double lwcurvepoly_perimeter_2d(const LWCURVEPOLY *poly);
318double lwtriangle_perimeter(const LWTRIANGLE *triangle);
319double lwtriangle_perimeter_2d(const LWTRIANGLE *triangle);
320
321/*
322* Segmentization
323*/
324LWPOLY *lwcurvepoly_stroke(const LWCURVEPOLY *curvepoly, uint32_t perQuad);
325
326/*
327* Affine
328*/
329void ptarray_affine(POINTARRAY *pa, const AFFINE *affine);
330void affine_invert(AFFINE *affine);
331
332/*
333* Scale
334*/
335void ptarray_scale(POINTARRAY *pa, const POINT4D *factor);
336
337/*
338* Scroll
339*/
340int ptarray_scroll_in_place(POINTARRAY *pa, const POINT4D *newbase);
341
342/*
343* PointArray
344*/
345int ptarray_has_z(const POINTARRAY *pa);
346int ptarray_has_m(const POINTARRAY *pa);
347double ptarray_signed_area(const POINTARRAY *pa);
348
349/*
350* Length
351*/
352double ptarray_length(const POINTARRAY *pts);
353double ptarray_arc_length_2d(const POINTARRAY *pts);
354
355/*
356* Clone support
357*/
358LWPOINT *lwpoint_clone(const LWPOINT *lwgeom);
359LWLINE *lwline_clone(const LWLINE *lwgeom);
360LWPOLY *lwpoly_clone(const LWPOLY *lwgeom);
364POINTARRAY *ptarray_clone(const POINTARRAY *ptarray);
365LWLINE *lwline_clone_deep(const LWLINE *lwgeom);
366LWPOLY *lwpoly_clone_deep(const LWPOLY *lwgeom);
368GBOX *gbox_clone(const GBOX *gbox);
369
370/*
371* Orientation (LW_CLOCKWISE and LW_COUNTERCLOCKWISE)
372*/
373void lwpoly_force_orientation(LWPOLY *poly, int orientation);
374void lwtriangle_force_orientation(LWTRIANGLE *triangle, int orientation);
375int lwpoly_has_orientation(const LWPOLY *poly, int orientation);
376int lwtriangle_has_orientation(const LWTRIANGLE *triangle, int orientation);
377int ptarray_has_orientation(const POINTARRAY *pa, int orientation);
378int ptarray_isccw(const POINTARRAY *pa);
379
380/*
381* Same
382*/
383char ptarray_same2d(const POINTARRAY *pa1, const POINTARRAY *pa2);
384char ptarray_same(const POINTARRAY *pa1, const POINTARRAY *pa2);
385char lwpoint_same2d(const LWPOINT *p1, const LWPOINT *p2);
386char lwpoint_same(const LWPOINT *p1, const LWPOINT *p2);
387char lwline_same(const LWLINE *p1, const LWLINE *p2);
388char lwpoly_same(const LWPOLY *p1, const LWPOLY *p2);
389char lwtriangle_same(const LWTRIANGLE *p1, const LWTRIANGLE *p2);
390char lwcollection_same(const LWCOLLECTION *p1, const LWCOLLECTION *p2);
391char lwcircstring_same(const LWCIRCSTRING *p1, const LWCIRCSTRING *p2);
392
393/*
394* Shift
395*/
397
398/*
399* Support for in place modification of point arrays, fast
400* function to move coordinate values around
401*/
402void ptarray_copy_point(POINTARRAY *pa, uint32_t from, uint32_t to);
403
404/*
405* Reverse
406*/
408
409/*
410* Startpoint
411*/
412int lwpoly_startpoint(const LWPOLY* lwpoly, POINT4D* pt);
413int ptarray_startpoint(const POINTARRAY* pa, POINT4D* pt);
414int lwcollection_startpoint(const LWCOLLECTION* col, POINT4D* pt);
415
416/*
417 * Write into *ret the coordinates of the closest point on
418 * segment A-B to the reference input point R
419 */
420void closest_point_on_segment(const POINT4D *R, const POINT4D *A, const POINT4D *B, POINT4D *ret);
421
422/*
423* Repeated points
424*/
425POINTARRAY *ptarray_remove_repeated_points(const POINTARRAY *in, double tolerance);
426LWGEOM* lwline_remove_repeated_points(const LWLINE *in, double tolerance);
427void ptarray_remove_repeated_points_in_place(POINTARRAY *pa, double tolerance, uint32_t min_points);
428
429/*
430* Closure test
431*/
432int lwline_is_closed(const LWLINE *line);
433int lwpoly_is_closed(const LWPOLY *poly);
434int lwcircstring_is_closed(const LWCIRCSTRING *curve);
435int lwcompound_is_closed(const LWCOMPOUND *curve);
436int lwcompound_is_valid(const LWCOMPOUND *curve);
437int lwpsurface_is_closed(const LWPSURFACE *psurface);
438int lwtin_is_closed(const LWTIN *tin);
439
444
445/*
446* What side of the line formed by p1 and p2 does q fall?
447* Returns -1 for left and 1 for right and 0 for co-linearity
448*/
449int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q);
450int lw_arc_side(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, const POINT2D *Q);
451int lw_arc_calculate_gbox_cartesian_2d(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, GBOX *gbox);
452double lw_arc_center(const POINT2D *p1, const POINT2D *p2, const POINT2D *p3, POINT2D *result);
453int lw_pt_in_seg(const POINT2D *P, const POINT2D *A1, const POINT2D *A2);
454int lw_pt_in_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3);
455int lw_arc_is_pt(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3);
456int lw_pt_on_segment(const POINT2D* p1, const POINT2D* p2, const POINT2D* p);
457double lw_seg_length(const POINT2D *A1, const POINT2D *A2);
458double lw_arc_length(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3);
459int pt_in_ring_2d(const POINT2D *p, const POINTARRAY *ring);
460int ptarray_contains_point(const POINTARRAY *pa, const POINT2D *pt);
461int ptarrayarc_contains_point(const POINTARRAY *pa, const POINT2D *pt);
462int ptarray_contains_point_partial(const POINTARRAY *pa, const POINT2D *pt, int check_closed, int *winding_number);
463int ptarray_raycast_intersections(const POINTARRAY *pa, const POINT2D *p, int *on_boundary);
464int ptarrayarc_raycast_intersections(const POINTARRAY *pa, const POINT2D *p, int *on_boundary);
465int lwcompound_contains_point(const LWCOMPOUND *comp, const POINT2D *pt);
466int lwgeom_contains_point(const LWGEOM *geom, const POINT2D *pt);
467
478int lwline_split_by_point_to(const LWLINE* ln, const LWPOINT* pt, LWMLINE* to);
479
481void lwcollection_reserve(LWCOLLECTION *col, uint32_t ngeoms);
482
484int lwcollection_allows_subtype(int collectiontype, int subtype);
485
487double gbox_angular_height(const GBOX* gbox);
488double gbox_angular_width(const GBOX* gbox);
489int gbox_centroid(const GBOX* gbox, POINT2D* out);
490
491/* Utilities */
492int lwprint_double(double d, int maxdd, char *buf);
493extern uint8_t MULTITYPE[NUMTYPES];
494
497#define LW_ON_INTERRUPT(x) { \
498 if ( _lwgeom_interrupt_callback ) { \
499 (*_lwgeom_interrupt_callback)(); \
500 } \
501 if ( _lwgeom_interrupt_requested ) { \
502 _lwgeom_interrupt_requested = 0; \
503 lwnotice("liblwgeom code interrupted"); \
504 x; \
505 } \
506}
507
508int ptarray_npoints_in_rect(const POINTARRAY *pa, const GBOX *gbox);
509int gbox_contains_point2d(const GBOX *g, const POINT2D *p);
510int lwpoly_contains_point(const LWPOLY *poly, const POINT2D *pt);
511POINT4D* lwmpoint_extract_points_4d(const LWMPOINT* g, uint32_t* npoints, int* input_empty);
512char* lwstrdup(const char* a);
513void* lwalloc0(size_t sz);
514
515#endif /* _LIBLWGEOM_INTERNAL_H */
static uint8_t precision
Definition cu_in_twkb.c:25
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition cu_print.c:267
void() lwinterrupt_callback(void)
Install a callback to be called periodically during algorithm execution.
Definition liblwgeom.h:291
#define NUMTYPES
Definition liblwgeom.h:118
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:1031
size_t gserialized_from_lwgeom_size(const LWGEOM *geom)
Calculate required memory segment to contain a serialized form of the LWGEOM.
double lwline_length_2d(const LWLINE *line)
Definition lwline.c:530
LWGEOM * lwline_remove_repeated_points(const LWLINE *in, double tolerance)
Definition lwline.c:449
void ptarray_longitude_shift(POINTARRAY *pa)
Longitude shift for a pointarray.
Definition ptarray.c:1637
void lwpoint_set_ordinate(POINT4D *p, char ordinate, double value)
Given a point, ordinate number and value, set that ordinate on the point.
int lwgeom_geohash_precision(GBOX bbox, GBOX *bounds)
LWPOLY * lwpoly_clone(const LWPOLY *lwgeom)
Definition lwpoly.c:213
double lwcircstring_length_2d(const LWCIRCSTRING *circ)
LWLINE * lwline_force_dims(const LWLINE *lwline, int hasz, int hasm, double zval, double mval)
Definition lwline.c:496
void lwtriangle_force_orientation(LWTRIANGLE *triangle, int orientation)
Definition lwtriangle.c:112
lwinterrupt_callback * _lwgeom_interrupt_callback
Definition lwgeom_api.c:666
int lwtriangle_has_orientation(const LWTRIANGLE *triangle, int orientation)
Definition lwtriangle.c:106
int lwcircstring_is_closed(const LWCIRCSTRING *curve)
LWPOINT * lwpoint_clone(const LWPOINT *lwgeom)
Definition lwpoint.c:239
void ptarray_reverse_in_place(POINTARRAY *pa)
Definition ptarray.c:339
char lwcollection_same(const LWCOLLECTION *p1, const LWCOLLECTION *p2)
check for same geometry composition
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:1123
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.
double lwcompound_length_2d(const LWCOMPOUND *comp)
Definition lwcompound.c:117
int ptarray_raycast_intersections(const POINTARRAY *pa, const POINT2D *p, int *on_boundary)
Definition ptarray.c:827
int lwline_is_empty(const LWLINE *line)
int lwcompound_contains_point(const LWCOMPOUND *comp, const POINT2D *pt)
Definition lwcompound.c:195
double ptarray_length(const POINTARRAY *pts)
Find the 3d/2d length of the given POINTARRAY (depending on its dimensionality)
Definition ptarray.c:2003
void * lwalloc0(size_t sz)
Definition lwutil.c:234
double ptarray_signed_area(const POINTARRAY *pa)
Returns the area in cartesian units.
Definition ptarray.c:1143
int lwline_is_closed(const LWLINE *line)
Definition lwline.c:455
uint32_t lwline_count_vertices(const LWLINE *line)
Definition lwline.c:515
int lwcompound_is_valid(const LWCOMPOUND *curve)
Definition lwcompound.c:81
LWCIRCSTRING * lwcircstring_clone(const LWCIRCSTRING *curve)
LWPOINT * lwpoint_force_dims(const LWPOINT *lwpoint, int hasz, int hasm, double zval, double mval)
Definition lwpoint.c:304
char lwtriangle_same(const LWTRIANGLE *p1, const LWTRIANGLE *p2)
Definition lwtriangle.c:126
int lwpoly_startpoint(const LWPOLY *lwpoly, POINT4D *pt)
Definition lwpoly.c:523
LWCOLLECTION * lwcollection_clone_deep(const LWCOLLECTION *lwgeom)
Deep clone LWCOLLECTION object.
LWPOLY * lwcurvepoly_stroke(const LWCURVEPOLY *curvepoly, uint32_t perQuad)
Definition lwstroke.c:688
int lwcollection_startpoint(const LWCOLLECTION *col, POINT4D *pt)
int _lwgeom_interrupt_requested
Definition lwgeom_api.c:656
int ptarray_startpoint(const POINTARRAY *pa, POINT4D *pt)
Definition ptarray.c:2219
int lwcompound_is_closed(const LWCOMPOUND *curve)
Definition lwcompound.c:48
int gbox_contains_point2d(const GBOX *g, const POINT2D *p)
Definition gbox.c:362
double lwtriangle_perimeter_2d(const LWTRIANGLE *triangle)
Definition lwtriangle.c:210
int ptarray_scroll_in_place(POINTARRAY *pa, const POINT4D *newbase)
Definition ptarray.c:2337
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:433
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...
LWPOLY * lwpoly_force_dims(const LWPOLY *lwpoly, int hasz, int hasm, double zval, double mval)
Definition lwpoly.c:393
int lw_pt_on_segment(const POINT2D *p1, const POINT2D *p2, const POINT2D *p)
char ptarray_same(const POINTARRAY *pa1, const POINTARRAY *pa2)
Definition ptarray.c:484
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:1674
int ptarrayarc_raycast_intersections(const POINTARRAY *pa, const POINT2D *p, int *on_boundary)
Definition ptarray.c:944
lwvarlena_t * geohash_point(double longitude, double latitude, int precision)
double lwtriangle_perimeter(const LWTRIANGLE *triangle)
Definition lwtriangle.c:201
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.
int lwpoint_is_empty(const LWPOINT *point)
void ptarray_simplify_in_place(POINTARRAY *pa, double tolerance, uint32_t minpts)
Definition ptarray.c:1856
int pt_in_ring_2d(const POINT2D *p, const POINTARRAY *ring)
POINT4D * lwmpoint_extract_points_4d(const LWMPOINT *g, uint32_t *npoints, int *input_empty)
double lwcompound_length(const LWCOMPOUND *comp)
Definition lwcompound.c:112
char lwpoint_same2d(const LWPOINT *p1, const LWPOINT *p2)
Definition lwpoint.c:271
int lw_arc_side(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, const POINT2D *Q)
void ptarray_grid_in_place(POINTARRAY *pa, gridspec *grid)
Snap to grid.
Definition ptarray.c:2234
double lw_seg_length(const POINT2D *A1, const POINT2D *A2)
Returns the length of a linear segment.
Definition lwalgorithm.c:80
int lwpoly_has_orientation(const LWPOLY *poly, int orientation)
Definition lwpoly.c:287
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:1948
void lwpoly_force_orientation(LWPOLY *poly, int orientation)
Definition lwpoly.c:268
int project_pt(const POINT2D *P, double distance, double azimuth, POINT2D *R)
Azimuth is angle in radians from vertical axis.
Definition measures.c:2421
int p3dz_same(const POINT3DZ *p1, const POINT3DZ *p2)
Definition lwalgorithm.c:49
LWCOLLECTION * lwcollection_clone(const LWCOLLECTION *lwgeom)
Clone LWCOLLECTION object.
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:2201
LWLINE * lwline_clone(const LWLINE *lwgeom)
Definition lwline.c:93
void ptarray_affine(POINTARRAY *pa, const AFFINE *affine)
Affine transform a pointarray.
Definition ptarray.c:2033
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)
The following is based on the "Fast Winding Number Inclusion of a Point in a Polygon" algorithm by Da...
Definition ptarray.c:755
GBOX * gbox_clone(const GBOX *gbox)
Definition gbox.c:45
double lwcurvepoly_perimeter(const LWCURVEPOLY *poly)
char * lwstrdup(const char *a)
Definition lwutil.c:254
LWTRIANGLE * lwtriangle_clone(const LWTRIANGLE *lwgeom)
Definition lwtriangle.c:99
uint32_t lwpoly_count_vertices(const LWPOLY *poly)
Definition lwpoly.c:417
int ptarray_has_orientation(const POINTARRAY *pa, int orientation)
Definition ptarray.c:1174
int lw_pt_in_seg(const POINT2D *P, const POINT2D *A1, const POINT2D *A2)
Returns true if P is between A1/A2.
int lwpoly_is_empty(const LWPOLY *poly)
LWGEOM * lwgeom_force_dims(const LWGEOM *lwgeom, int hasz, int hasm, double zval, double mval)
Definition lwgeom.c:845
char lwpoly_same(const LWPOLY *p1, const LWPOLY *p2)
Definition lwpoly.c:338
int lwgeom_contains_point(const LWGEOM *geom, const POINT2D *pt)
Definition lwcompound.c:172
int ptarray_isccw(const POINTARRAY *pa)
Definition ptarray.c:1182
int ptarray_has_z(const POINTARRAY *pa)
Definition ptarray.c:37
double lwline_length(const LWLINE *line)
Definition lwline.c:523
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:382
LWLINE * lwline_clone_deep(const LWLINE *lwgeom)
Definition lwline.c:109
void lwcollection_reserve(LWCOLLECTION *col, uint32_t ngeoms)
Ensure the collection can hold at least up to ngeoms geometries.
uint32_t lwcollection_count_vertices(const LWCOLLECTION *col)
void ptarray_swap_ordinates(POINTARRAY *pa, LWORD o1, LWORD o2)
Swap ordinate values o1 and o2 on a given POINTARRAY.
Definition ptarray.c:387
int gserialized_read_gbox_p(const GSERIALIZED *g, GBOX *gbox)
Pull a GBOX from the header of a GSERIALIZED, if one is available.
LWPOLY * lwpoly_clone_deep(const LWPOLY *lwgeom)
Definition lwpoly.c:228
double lwpoly_perimeter_2d(const LWPOLY *poly)
Compute the sum of polygon rings length (forcing 2d computation).
Definition lwpoly.c:484
int ptarray_npoints_in_rect(const POINTARRAY *pa, const GBOX *gbox)
Definition ptarray.c:2314
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition lwalgorithm.c:70
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 project_pt_pt(const POINT4D *A, const POINT4D *B, double distance, POINT4D *R)
Azimuth is angle in radians from vertical axis.
Definition measures.c:2445
char ptarray_same2d(const POINTARRAY *pa1, const POINTARRAY *pa2)
Definition ptarray.c:509
int lwpoly_contains_point(const LWPOLY *poly, const POINT2D *pt)
Definition lwpoly.c:531
void closest_point_on_segment(const POINT4D *R, const POINT4D *A, const POINT4D *B, POINT4D *ret)
Definition ptarray.c:1408
char lwcircstring_same(const LWCIRCSTRING *p1, const LWCIRCSTRING *p2)
POINTARRAY * ptarray_clone(const POINTARRAY *ptarray)
Clone a POINTARRAY object.
Definition ptarray.c:674
LWCOLLECTION * lwcollection_force_dims(const LWCOLLECTION *lwcol, int hasz, int hasm, double zval, double mval)
POINTARRAY * ptarray_force_dims(const POINTARRAY *pa, int hasz, int hasm, double zval, double mval)
Definition ptarray.c:1188
double lwcircstring_length(const LWCIRCSTRING *circ)
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) .
POINTARRAY * ptarray_remove_repeated_points(const POINTARRAY *in, double tolerance)
Definition ptarray.c:1667
double lwcurvepoly_area(const LWCURVEPOLY *curvepoly)
This should be rewritten to make use of the curve itself.
void decode_geohash_bbox(char *geohash, double *lat, double *lon, int precision)
int lwpoly_is_closed(const LWPOLY *poly)
Definition lwpoly.c:498
int lwcollection_allows_subtype(int collectiontype, int subtype)
Check if subtype is allowed in collectiontype.
void ptarray_copy_point(POINTARRAY *pa, uint32_t from, uint32_t to)
Definition lwgeom_api.c:394
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:91
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)
double lwcurvepoly_perimeter_2d(const LWCURVEPOLY *poly)
int lwprint_double(double d, int maxdd, char *buf)
Definition lwprint.c:463
double lwpoly_perimeter(const LWPOLY *poly)
Compute the sum of polygon rings length.
Definition lwpoly.c:466
int lw_arc_calculate_gbox_cartesian_2d(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, GBOX *gbox)
Definition gbox.c:465
char lwpoint_same(const LWPOINT *p1, const LWPOINT *p2)
Definition lwpoint.c:264
int p2d_same(const POINT2D *p1, const POINT2D *p2)
Definition lwalgorithm.c:57
static double distance(double x1, double y1, double x2, double y2)
Definition lwtree.c:1032
Snap-to-grid.
Definition liblwgeom.h:1400