geo_coder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. data/Gemfile +12 -0
  2. data/Gemfile.lock +32 -0
  3. data/History.txt +6 -0
  4. data/Makefile +13 -0
  5. data/Manifest.txt +18 -0
  6. data/README.rdoc +197 -0
  7. data/Rakefile +53 -0
  8. data/TODO.txt +8 -0
  9. data/VERSION +1 -0
  10. data/bin/build_indexes +8 -0
  11. data/bin/rebuild_cluster +22 -0
  12. data/bin/rebuild_metaphones +23 -0
  13. data/bin/tiger_import +59 -0
  14. data/demos/demo/app/ext/geocodewrap.rb +84 -0
  15. data/demos/demo/app/views/index.builder +13 -0
  16. data/demos/demo/app/views/index.erb +71 -0
  17. data/demos/demo/config.ru +12 -0
  18. data/demos/demo/config/bootstraps.rb +130 -0
  19. data/demos/demo/config/geoenvironment.rb +25 -0
  20. data/demos/demo/geocoder_helper.rb +12 -0
  21. data/demos/demo/geocom_geocode.rb +10 -0
  22. data/demos/demo/main.rb +3 -0
  23. data/demos/demo/rakefile.rb +17 -0
  24. data/demos/demo/tmp/restart.txt +0 -0
  25. data/demos/simpledemo/views/index.builder +13 -0
  26. data/demos/simpledemo/views/index.erb +69 -0
  27. data/demos/simpledemo/ws.rb +83 -0
  28. data/doc/Makefile +7 -0
  29. data/doc/html4css1.css +279 -0
  30. data/doc/lookup.rst +193 -0
  31. data/doc/parsing.rst +125 -0
  32. data/doc/voidspace.css +147 -0
  33. data/geo_coder.gemspec +172 -0
  34. data/lib/geocoder/us.rb +21 -0
  35. data/lib/geocoder/us/address.rb +290 -0
  36. data/lib/geocoder/us/constants.rb +670 -0
  37. data/lib/geocoder/us/database.rb +745 -0
  38. data/lib/geocoder/us/import.rb +181 -0
  39. data/lib/geocoder/us/import/tiger.rb +13 -0
  40. data/lib/geocoder/us/numbers.rb +58 -0
  41. data/navteq/README +4 -0
  42. data/navteq/convert.sql +37 -0
  43. data/navteq/navteq_import +39 -0
  44. data/navteq/prepare.sql +92 -0
  45. data/sql/cluster.sql +16 -0
  46. data/sql/convert.sql +80 -0
  47. data/sql/create.sql +37 -0
  48. data/sql/index.sql +12 -0
  49. data/sql/place.csv +104944 -0
  50. data/sql/place.sql +104948 -0
  51. data/sql/setup.sql +78 -0
  52. data/src/Makefile +13 -0
  53. data/src/README +14 -0
  54. data/src/liblwgeom/Makefile +75 -0
  55. data/src/liblwgeom/box2d.c +54 -0
  56. data/src/liblwgeom/lex.yy.c +4799 -0
  57. data/src/liblwgeom/liblwgeom.h +1405 -0
  58. data/src/liblwgeom/lwalgorithm.c +946 -0
  59. data/src/liblwgeom/lwalgorithm.h +52 -0
  60. data/src/liblwgeom/lwcircstring.c +759 -0
  61. data/src/liblwgeom/lwcollection.c +541 -0
  62. data/src/liblwgeom/lwcompound.c +118 -0
  63. data/src/liblwgeom/lwcurvepoly.c +86 -0
  64. data/src/liblwgeom/lwgeom.c +886 -0
  65. data/src/liblwgeom/lwgeom_api.c +2201 -0
  66. data/src/liblwgeom/lwgparse.c +1219 -0
  67. data/src/liblwgeom/lwgunparse.c +1054 -0
  68. data/src/liblwgeom/lwline.c +525 -0
  69. data/src/liblwgeom/lwmcurve.c +125 -0
  70. data/src/liblwgeom/lwmline.c +137 -0
  71. data/src/liblwgeom/lwmpoint.c +138 -0
  72. data/src/liblwgeom/lwmpoly.c +141 -0
  73. data/src/liblwgeom/lwmsurface.c +129 -0
  74. data/src/liblwgeom/lwpoint.c +439 -0
  75. data/src/liblwgeom/lwpoly.c +579 -0
  76. data/src/liblwgeom/lwsegmentize.c +1047 -0
  77. data/src/liblwgeom/lwutil.c +369 -0
  78. data/src/liblwgeom/measures.c +861 -0
  79. data/src/liblwgeom/postgis_config.h +93 -0
  80. data/src/liblwgeom/ptarray.c +847 -0
  81. data/src/liblwgeom/vsprintf.c +179 -0
  82. data/src/liblwgeom/wktparse.h +126 -0
  83. data/src/liblwgeom/wktparse.lex +74 -0
  84. data/src/liblwgeom/wktparse.tab.c +2353 -0
  85. data/src/liblwgeom/wktparse.tab.h +145 -0
  86. data/src/liblwgeom/wktparse.y +385 -0
  87. data/src/libsqlite3_geocoder/Makefile +22 -0
  88. data/src/libsqlite3_geocoder/Makefile.nix +15 -0
  89. data/src/libsqlite3_geocoder/Makefile.redhat +15 -0
  90. data/src/libsqlite3_geocoder/extension.c +121 -0
  91. data/src/libsqlite3_geocoder/extension.h +13 -0
  92. data/src/libsqlite3_geocoder/levenshtein.c +42 -0
  93. data/src/libsqlite3_geocoder/metaphon.c +278 -0
  94. data/src/libsqlite3_geocoder/util.c +37 -0
  95. data/src/libsqlite3_geocoder/wkb_compress.c +54 -0
  96. data/src/metaphone/Makefile +7 -0
  97. data/src/metaphone/README +49 -0
  98. data/src/metaphone/extension.c +37 -0
  99. data/src/metaphone/metaphon.c +251 -0
  100. data/src/shp2sqlite/Makefile +37 -0
  101. data/src/shp2sqlite/Makefile.nix +36 -0
  102. data/src/shp2sqlite/Makefile.redhat +35 -0
  103. data/src/shp2sqlite/dbfopen.c +1595 -0
  104. data/src/shp2sqlite/getopt.c +695 -0
  105. data/src/shp2sqlite/getopt.h +127 -0
  106. data/src/shp2sqlite/shapefil.h +500 -0
  107. data/src/shp2sqlite/shp2sqlite.c +1974 -0
  108. data/src/shp2sqlite/shpopen.c +1894 -0
  109. data/tests/address.rb +236 -0
  110. data/tests/benchmark.rb +20 -0
  111. data/tests/constants.rb +57 -0
  112. data/tests/data/address-sample.csv +52 -0
  113. data/tests/data/db-test.csv +57 -0
  114. data/tests/data/locations.csv +4 -0
  115. data/tests/database.rb +137 -0
  116. data/tests/generate.rb +34 -0
  117. data/tests/numbers.rb +46 -0
  118. data/tests/run.rb +11 -0
  119. metadata +237 -0
@@ -0,0 +1,1405 @@
1
+ /**********************************************************************
2
+ * $Id: liblwgeom.h 3812 2009-03-09 14:36:15Z pramsey $
3
+ *
4
+ * PostGIS - Spatial Types for PostgreSQL
5
+ * http://postgis.refractions.net
6
+ * Copyright 2001-2006 Refractions Research Inc.
7
+ * Copyright 2007-2008 Mark Cave-Ayland
8
+ * Copyright 2008 Paul Ramsey <pramsey@cleverelephant.ca>
9
+ *
10
+ * This is free software; you can redistribute and/or modify it under
11
+ * the terms of the GNU General Public Licence. See the COPYING file.
12
+ *
13
+ **********************************************************************/
14
+
15
+ #ifndef _LIBLWGEOM_H
16
+ #define _LIBLWGEOM_H 1
17
+
18
+ #include "postgis_config.h"
19
+ #include <stdarg.h>
20
+ #include <stdio.h>
21
+
22
+ /**
23
+ * @file liblwgeom.h
24
+ *
25
+ * This library is the generic geometry handling section of PostGIS. The geometry
26
+ * objects, constructors, destructors, and a set of spatial processing functions,
27
+ * are implemented here.
28
+ *
29
+ * The library is designed for use in non-PostGIS applications if necessary. The
30
+ * units tests at cunit/cu_tester.c and the loader/dumper programs at
31
+ * ../loader/shp2pgsql.c are examples of non-PostGIS applications using liblwgeom.
32
+ *
33
+ * Programs using this library should set up the default memory managers and error
34
+ * handlers by implementing an lwgeom_init_allocators() function, which can be as
35
+ * a wrapper around the lwgeom_install_default_allocators() function if you want
36
+ * no special handling for memory management and error reporting.
37
+ */
38
+
39
+ #define INTEGRITY_CHECKS 1
40
+
41
+ /*
42
+ * Floating point comparitors.
43
+ */
44
+ #define PGIS_EPSILON 1e-12
45
+ #define FP_MAX(A, B) ((A > B) ? A : B)
46
+ #define FP_MIN(A, B) ((A < B) ? A : B)
47
+ #define FP_LT(A, B) ((A + PGIS_EPSILON) < B)
48
+ #define FP_LTEQ(A, B) ((A - PGIS_EPSILON) <= B)
49
+ #define FP_GT(A, B) ((A - PGIS_EPSILON) > B)
50
+ #define FP_GTEQ(A, B) ((A + PGIS_EPSILON) >= B)
51
+ #define FP_CONTAINS_TOP(A, X, B) (FP_LT(A, X) && FP_LTEQ(X, B))
52
+ #define FP_CONTAINS_BOTTOM(A, X, B) (FP_LTEQ(A, X) && FP_LT(X, B))
53
+ #define FP_CONTAINS_INCL(A, X, B) (FP_LTEQ(A, X) && FP_LTEQ(X, B))
54
+ #define FP_CONTAINS_EXCL(A, X, B) (FP_LT(A, X) && FP_LT(X, B))
55
+ #define FP_CONTAINS(A, X, B) FP_CONTAINS_EXCL(A, X, B)
56
+ #define LW_TRUE 1
57
+ #define LW_FALSE 0
58
+
59
+ /*
60
+ * this will change to NaN when I figure out how to
61
+ * get NaN in a platform-independent way
62
+ */
63
+ #define NO_VALUE 0.0
64
+ #define NO_Z_VALUE NO_VALUE
65
+ #define NO_M_VALUE NO_VALUE
66
+
67
+ #ifndef C_H
68
+
69
+ typedef unsigned int uint32;
70
+ typedef int int32;
71
+
72
+ #endif
73
+
74
+ /**
75
+ * Global functions for memory/logging handlers.
76
+ */
77
+ typedef void* (*lwallocator)(size_t size);
78
+ typedef void* (*lwreallocator)(void *mem, size_t size);
79
+ typedef void (*lwfreeor)(void* mem);
80
+ typedef void (*lwreporter)(const char* fmt, va_list ap);
81
+ extern lwreallocator lwrealloc_var;
82
+ extern lwallocator lwalloc_var;
83
+ extern lwfreeor lwfree_var;
84
+ extern lwreporter lwerror_var;
85
+ extern lwreporter lwnotice_var;
86
+
87
+ /**
88
+ * Supply the memory management and error handling functions you want your
89
+ * application to use.
90
+ * @ingroup system
91
+ */
92
+ extern void lwgeom_init_allocators(void);
93
+
94
+ /**
95
+ * Apply the default memory management (malloc() and free()) and error handlers.
96
+ * Called inside lwgeom_init_allocators() generally.
97
+ * @ingroup system
98
+ */
99
+ extern void lwgeom_install_default_allocators(void);
100
+
101
+ /**
102
+ * Write a notice out to the notice handler. Uses standard printf() substitutions.
103
+ * Use for messages you always want output. For debugging, use LWDEBUG() or LWDEBUGF().
104
+ * @ingroup logging
105
+ */
106
+ void lwnotice(const char *fmt, ...);
107
+
108
+ /**
109
+ * Write a notice out to the error handler. Uses standard printf() substitutions.
110
+ * Use for errors you always want output. For debugging, use LWDEBUG() or LWDEBUGF().
111
+ * @ingroup logging
112
+ */
113
+ void lwerror(const char *fmt, ...);
114
+
115
+ /**
116
+ * The default memory/logging handlers installed by lwgeom_install_default_allocators()
117
+ */
118
+ void *default_allocator(size_t size);
119
+ void *default_reallocator(void *mem, size_t size);
120
+ void default_freeor(void *ptr);
121
+ void default_errorreporter(const char *fmt, va_list ap);
122
+ void default_noticereporter(const char *fmt, va_list ap);
123
+
124
+
125
+ extern int lw_vasprintf (char **result, const char *format, va_list args);
126
+
127
+ /* Debug macros */
128
+ #if POSTGIS_DEBUG_LEVEL > 0
129
+
130
+ /* Display a notice at the given debug level */
131
+ #define LWDEBUG(level, msg) \
132
+ do { \
133
+ if (POSTGIS_DEBUG_LEVEL >= level) \
134
+ lwnotice("[%s:%s:%d] " msg, __FILE__, __func__, __LINE__); \
135
+ } while (0);
136
+
137
+ /* Display a formatted notice at the given debug level (like printf, with variadic arguments) */
138
+ #define LWDEBUGF(level, msg, ...) \
139
+ do { \
140
+ if (POSTGIS_DEBUG_LEVEL >= level) \
141
+ lwnotice("[%s:%s:%d] " msg, __FILE__, __func__, __LINE__, __VA_ARGS__); \
142
+ } while (0);
143
+
144
+ #else
145
+
146
+ /* Empty prototype that can be optimised away by the compiler for non-debug builds */
147
+ #define LWDEBUG(level, msg) \
148
+ ((void) 0)
149
+
150
+ /* Empty prototype that can be optimised away by the compiler for non-debug builds */
151
+ #define LWDEBUGF(level, msg, ...) \
152
+ ((void) 0)
153
+
154
+ #endif
155
+
156
+ /******************************************************************/
157
+
158
+ typedef unsigned char uchar;
159
+
160
+ typedef struct
161
+ {
162
+ float xmin;
163
+ float ymin;
164
+ float xmax;
165
+ float ymax;
166
+ } BOX2DFLOAT4;
167
+
168
+ typedef struct
169
+ {
170
+ double xmin, ymin, zmin;
171
+ double xmax, ymax, zmax;
172
+ } BOX3D;
173
+
174
+ typedef struct chiptag
175
+ {
176
+ int size; /* unused (for use by postgresql) */
177
+
178
+ int endian_hint; /* the number 1 in the endian of this datastruct */
179
+
180
+ BOX3D bvol;
181
+ int SRID;
182
+ char future[4];
183
+ float factor; /* Usually 1.0.
184
+ * Integer values are multiplied by this number
185
+ * to get the actual height value
186
+ * (for sub-meter accuracy height data).
187
+ */
188
+
189
+ int datatype; /* 1 = float32,
190
+ * 5 = 24bit integer,
191
+ * 6 = 16bit integer (short)
192
+ * 7 = 16bit ???
193
+ * 8 = 8bit ???
194
+ * 101 = float32 (NDR),
195
+ * 105 = 24bit integer (NDR),
196
+ * 106 = 16bit int (NDR)
197
+ * 107 = 16bit ??? (NDR)
198
+ * 108 = 8bit ??? (NDR) (this doesn't make sense)
199
+ */
200
+ int height;
201
+ int width;
202
+ int compression; /* 0 = no compression, 1 = differencer
203
+ * 0x80 = new value
204
+ * 0x7F = nodata
205
+ */
206
+
207
+ /*
208
+ * this is provided for convenience, it should be set to
209
+ * sizeof(chip) bytes into the struct because the serialized form is:
210
+ * <header><data>
211
+ * NULL when serialized
212
+ */
213
+ void *data; /* data[0] = bottm left,
214
+ * data[width] = 1st pixel, 2nd row (uncompressed)
215
+ */
216
+
217
+ } CHIP;
218
+
219
+ /*
220
+ * standard definition of an ellipsoid (what wkt calls a spheroid)
221
+ * f = (a-b)/a
222
+ * e_sq = (a*a - b*b)/(a*a)
223
+ * b = a - fa
224
+ */
225
+ typedef struct
226
+ {
227
+ double a; /* semimajor axis */
228
+ double b; /* semiminor axis */
229
+ double f; /* flattening */
230
+ double e; /* eccentricity (first) */
231
+ double e_sq; /* eccentricity (first), squared */
232
+ char name[20]; /* name of ellipse */
233
+ } SPHEROID;
234
+
235
+
236
+ /*
237
+ * ALL LWGEOM structures will use POINT3D as an abstract point.
238
+ * This means a 2d geometry will be stored as (x,y) in its serialized
239
+ * form, but all functions will work on (x,y,0). This keeps all the
240
+ * analysis functions simple.
241
+ * NOTE: for GEOS integration, we'll probably set z=NaN
242
+ * so look out - z might be NaN for 2d geometries!
243
+ */
244
+ typedef struct { double x,y,z; } POINT3DZ;
245
+ typedef struct { double x,y,z; } POINT3D; /* alias for POINT3DZ */
246
+ typedef struct { double x,y,m; } POINT3DM;
247
+
248
+
249
+ /*
250
+ * type for 2d points. When you convert this to 3d, the
251
+ * z component will be either 0 or NaN.
252
+ */
253
+ typedef struct
254
+ {
255
+ double x;
256
+ double y;
257
+ } POINT2D;
258
+
259
+ typedef struct
260
+ {
261
+ double x;
262
+ double y;
263
+ double z;
264
+ double m;
265
+ } POINT4D;
266
+
267
+ /******************************************************************/
268
+
269
+ /*
270
+ * Point array abstracts a lot of the complexity of points and point lists.
271
+ * It handles miss-alignment in the serialized form, 2d/3d translation
272
+ * (2d points converted to 3d will have z=0 or NaN)
273
+ * DONT MIX 2D and 3D POINTS! *EVERYTHING* is either one or the other
274
+ */
275
+ typedef struct
276
+ {
277
+ /* array of POINT 2D, 3D or 4D. probably missaligned. */
278
+ uchar *serialized_pointlist;
279
+
280
+ /* use TYPE_* macros to handle */
281
+ uchar dims;
282
+
283
+ uint32 npoints;
284
+ } POINTARRAY;
285
+
286
+
287
+ /*
288
+ * Use the following to build pointarrays
289
+ * when number of points in output is not
290
+ * known in advance
291
+ */
292
+ typedef struct {
293
+ POINTARRAY *pa;
294
+ size_t ptsize;
295
+ size_t capacity; /* given in points */
296
+ } DYNPTARRAY;
297
+
298
+ /* Create a new dynamic pointarray */
299
+ extern DYNPTARRAY *dynptarray_create(size_t initial_capacity, int dims);
300
+
301
+ /*
302
+ * Add a POINT4D to the dynamic pointarray.
303
+ *
304
+ * The dynamic pointarray may be of any dimension, only
305
+ * accepted dimensions will be copied.
306
+ *
307
+ * If allow_duplicates is set to 0 (false) a check
308
+ * is performed to see if last point in array is equal to the
309
+ * provided one. NOTE that the check is 4d based, with missing
310
+ * ordinates in the pointarray set to NO_Z_VALUE and NO_M_VALUE
311
+ * respectively.
312
+ */
313
+ extern int dynptarray_addPoint4d(DYNPTARRAY *dpa, POINT4D *p4d,
314
+ int allow_duplicates);
315
+
316
+ /******************************************************************
317
+ *
318
+ * LWGEOM (any type)
319
+ *
320
+ ******************************************************************/
321
+
322
+ typedef struct
323
+ {
324
+ uchar type;
325
+ BOX2DFLOAT4 *bbox;
326
+ uint32 SRID; /* -1 == unneeded */
327
+ void *data;
328
+ } LWGEOM;
329
+
330
+ /* POINTYPE */
331
+ typedef struct
332
+ {
333
+ uchar type; /* POINTTYPE */
334
+ BOX2DFLOAT4 *bbox;
335
+ uint32 SRID;
336
+ POINTARRAY *point; /* hide 2d/3d (this will be an array of 1 point) */
337
+ } LWPOINT; /* "light-weight point" */
338
+
339
+ /* LINETYPE */
340
+ typedef struct
341
+ {
342
+ uchar type; /* LINETYPE */
343
+ BOX2DFLOAT4 *bbox;
344
+ uint32 SRID;
345
+ POINTARRAY *points; /* array of POINT3D */
346
+ } LWLINE; /* "light-weight line" */
347
+
348
+ /* POLYGONTYPE */
349
+ typedef struct
350
+ {
351
+ uchar type; /* POLYGONTYPE */
352
+ BOX2DFLOAT4 *bbox;
353
+ uint32 SRID;
354
+ int nrings;
355
+ POINTARRAY **rings; /* list of rings (list of points) */
356
+ } LWPOLY; /* "light-weight polygon" */
357
+
358
+ /* MULTIPOINTTYPE */
359
+ typedef struct
360
+ {
361
+ uchar type;
362
+ BOX2DFLOAT4 *bbox;
363
+ uint32 SRID;
364
+ int ngeoms;
365
+ LWPOINT **geoms;
366
+ } LWMPOINT;
367
+
368
+ /* MULTILINETYPE */
369
+ typedef struct
370
+ {
371
+ uchar type;
372
+ BOX2DFLOAT4 *bbox;
373
+ uint32 SRID;
374
+ int ngeoms;
375
+ LWLINE **geoms;
376
+ } LWMLINE;
377
+
378
+ /* MULTIPOLYGONTYPE */
379
+ typedef struct
380
+ {
381
+ uchar type;
382
+ BOX2DFLOAT4 *bbox;
383
+ uint32 SRID;
384
+ int ngeoms;
385
+ LWPOLY **geoms;
386
+ } LWMPOLY;
387
+
388
+ /* COLLECTIONTYPE */
389
+ typedef struct
390
+ {
391
+ uchar type;
392
+ BOX2DFLOAT4 *bbox;
393
+ uint32 SRID;
394
+ int ngeoms;
395
+ LWGEOM **geoms;
396
+ } LWCOLLECTION;
397
+
398
+ /* CIRCSTRINGTYPE */
399
+ typedef struct
400
+ {
401
+ uchar type; /* CIRCSTRINGTYPE */
402
+ BOX2DFLOAT4 *bbox;
403
+ uint32 SRID;
404
+ POINTARRAY *points; /* array of POINT(3D/3DM) */
405
+ } LWCIRCSTRING; /* "light-weight circularstring" */
406
+
407
+ /* COMPOUNDTYPE */
408
+ typedef struct
409
+ {
410
+ uchar type; /* COMPOUNDTYPE */
411
+ BOX2DFLOAT4 *bbox;
412
+ uint32 SRID;
413
+ int ngeoms;
414
+ LWGEOM **geoms;
415
+ } LWCOMPOUND; /* "light-weight compound line" */
416
+
417
+ /* CURVEPOLYTYPE */
418
+ typedef struct
419
+ {
420
+ uchar type; /* CURVEPOLYTYPE */
421
+ BOX2DFLOAT4 *bbox;
422
+ uint32 SRID;
423
+ int nrings;
424
+ LWGEOM **rings; /* list of rings (list of points) */
425
+ } LWCURVEPOLY; /* "light-weight polygon" */
426
+
427
+ /* MULTICURVE */
428
+ typedef struct
429
+ {
430
+ uchar type;
431
+ BOX2DFLOAT4 *bbox;
432
+ uint32 SRID;
433
+ int ngeoms;
434
+ LWGEOM **geoms;
435
+ } LWMCURVE;
436
+
437
+ /* MULTISURFACETYPE */
438
+ typedef struct
439
+ {
440
+ uchar type;
441
+ BOX2DFLOAT4 *bbox;
442
+ uint32 SRID;
443
+ int ngeoms;
444
+ LWGEOM **geoms;
445
+ } LWMSURFACE;
446
+
447
+ /* Casts LWGEOM->LW* (return NULL if cast is illegal) */
448
+ extern LWMPOLY *lwgeom_as_lwmpoly(LWGEOM *lwgeom);
449
+ extern LWMLINE *lwgeom_as_lwmline(LWGEOM *lwgeom);
450
+ extern LWMPOINT *lwgeom_as_lwmpoint(LWGEOM *lwgeom);
451
+ extern LWCOLLECTION *lwgeom_as_lwcollection(LWGEOM *lwgeom);
452
+ extern LWPOLY *lwgeom_as_lwpoly(LWGEOM *lwgeom);
453
+ extern LWLINE *lwgeom_as_lwline(LWGEOM *lwgeom);
454
+ extern LWPOINT *lwgeom_as_lwpoint(LWGEOM *lwgeom);
455
+ extern LWCIRCSTRING *lwgeom_as_lwcircstring(LWGEOM *lwgeom);
456
+
457
+ /* Casts LW*->LWGEOM (always cast) */
458
+ extern LWGEOM *lwmpoly_as_lwgeom(LWMPOLY *obj);
459
+ extern LWGEOM *lwmline_as_lwgeom(LWMLINE *obj);
460
+ extern LWGEOM *lwmpoint_as_lwgeom(LWMPOINT *obj);
461
+ extern LWGEOM *lwcollection_as_lwgeom(LWCOLLECTION *obj);
462
+ extern LWGEOM *lwpoly_as_lwgeom(LWPOLY *obj);
463
+ extern LWGEOM *lwline_as_lwgeom(LWLINE *obj);
464
+ extern LWGEOM *lwpoint_as_lwgeom(LWPOINT *obj);
465
+
466
+ /*
467
+ * Call this function everytime LWGEOM coordinates
468
+ * change so to invalidate bounding box
469
+ */
470
+ extern void lwgeom_changed(LWGEOM *lwgeom);
471
+
472
+ /*
473
+ * Call this function to drop BBOX and SRID
474
+ * from LWGEOM. If LWGEOM type is *not* flagged
475
+ * with the HASBBOX flag and has a bbox, it
476
+ * will be released.
477
+ */
478
+ extern void lwgeom_drop_bbox(LWGEOM *lwgeom);
479
+
480
+ /* Compute a bbox if not already computed */
481
+ extern void lwgeom_add_bbox(LWGEOM *lwgeom);
482
+
483
+ extern void lwgeom_dropSRID(LWGEOM *lwgeom);
484
+
485
+ /* Determine whether a LWGEOM can contain sub-geometries or not */
486
+ extern int lwgeom_contains_subgeoms(int type);
487
+
488
+ /******************************************************************/
489
+
490
+ /*
491
+ * copies a point from the point array into the parameter point
492
+ * will set point's z=0 (or NaN) if pa is 2d
493
+ * will set point's m=0 (or NaN) if pa is 3d or 2d
494
+ * NOTE: point is a real POINT3D *not* a pointer
495
+ */
496
+ extern POINT4D getPoint4d(const POINTARRAY *pa, int n);
497
+
498
+ /*
499
+ * copies a point from the point array into the parameter point
500
+ * will set point's z=0 (or NaN) if pa is 2d
501
+ * will set point's m=0 (or NaN) if pa is 3d or 2d
502
+ * NOTE: this will modify the point4d pointed to by 'point'.
503
+ */
504
+ extern int getPoint4d_p(const POINTARRAY *pa, int n, POINT4D *point);
505
+
506
+ /*
507
+ * copies a point from the point array into the parameter point
508
+ * will set point's z=0 (or NaN) if pa is 2d
509
+ * NOTE: point is a real POINT3D *not* a pointer
510
+ */
511
+ extern POINT3DZ getPoint3dz(const POINTARRAY *pa, int n);
512
+ extern POINT3DM getPoint3dm(const POINTARRAY *pa, int n);
513
+
514
+ /*
515
+ * copies a point from the point array into the parameter point
516
+ * will set point's z=0 (or NaN) if pa is 2d
517
+ * NOTE: this will modify the point3d pointed to by 'point'.
518
+ */
519
+ extern int getPoint3dz_p(const POINTARRAY *pa, int n, POINT3DZ *point);
520
+ extern int getPoint3dm_p(const POINTARRAY *pa, int n, POINT3DM *point);
521
+
522
+
523
+ /*
524
+ * copies a point from the point array into the parameter point
525
+ * z value (if present is not returned)
526
+ * NOTE: point is a real POINT3D *not* a pointer
527
+ */
528
+ extern POINT2D getPoint2d(const POINTARRAY *pa, int n);
529
+
530
+ /*
531
+ * copies a point from the point array into the parameter point
532
+ * z value (if present is not returned)
533
+ * NOTE: this will modify the point2d pointed to by 'point'.
534
+ */
535
+ extern int getPoint2d_p(const POINTARRAY *pa, int n, POINT2D *point);
536
+
537
+ /*
538
+ * set point N to the given value
539
+ * NOTE that the pointarray can be of any
540
+ * dimension, the appropriate ordinate values
541
+ * will be extracted from it
542
+ *
543
+ */
544
+ extern void setPoint4d(POINTARRAY *pa, int n, POINT4D *p4d);
545
+
546
+ /*
547
+ * get a pointer to nth point of a POINTARRAY
548
+ * You'll need to cast it to appropriate dimensioned point.
549
+ * Note that if you cast to a higher dimensional point you'll
550
+ * possibly corrupt the POINTARRAY.
551
+ *
552
+ * WARNING: Don't cast this to a POINT !
553
+ * it would not be reliable due to memory alignment constraints
554
+ */
555
+ extern uchar *getPoint_internal(const POINTARRAY *pa, int n);
556
+
557
+ /* --- here is a macro equivalent, for speed... */
558
+ /* #define getPoint(x,n) &( (x)->serialized_pointlist[((x)->ndims*8)*(n)] ) */
559
+
560
+
561
+ /*
562
+ * constructs a POINTARRAY.
563
+ * NOTE: points is *not* copied, so be careful about modification
564
+ * (can be aligned/missaligned)
565
+ * NOTE: hasz and hasm are descriptive - it describes what type of data
566
+ * 'points' points to. No data conversion is done.
567
+ */
568
+ extern POINTARRAY *pointArray_construct(uchar *points, char hasz, char hasm,
569
+ uint32 npoints);
570
+
571
+ /*
572
+ * Calculate the (BOX3D) bounding box of a set of points.
573
+ * Returns an alloced BOX3D or NULL (for empty geom) in the first form.
574
+ * Write result in user-provided BOX3D in second form (return 0 if untouched).
575
+ * If pa is 2d, then box3d's zmin/zmax will be set to NO_Z_VALUE
576
+ */
577
+ extern BOX3D *ptarray_compute_box3d(const POINTARRAY *pa);
578
+ extern int ptarray_compute_box3d_p(const POINTARRAY *pa, BOX3D *out);
579
+
580
+ /*
581
+ * size of point represeneted in the POINTARRAY
582
+ * 16 for 2d, 24 for 3d, 32 for 4d
583
+ */
584
+ extern int pointArray_ptsize(const POINTARRAY *pa);
585
+
586
+
587
+ #define POINTTYPE 1
588
+ #define LINETYPE 2
589
+ #define POLYGONTYPE 3
590
+ #define MULTIPOINTTYPE 4
591
+ #define MULTILINETYPE 5
592
+ #define MULTIPOLYGONTYPE 6
593
+ #define COLLECTIONTYPE 7
594
+ #define CIRCSTRINGTYPE 8
595
+ #define COMPOUNDTYPE 9
596
+ #define CURVEPOLYTYPE 13
597
+ #define MULTICURVETYPE 14
598
+ #define MULTISURFACETYPE 15
599
+
600
+ #define WKBZOFFSET 0x80000000
601
+ #define WKBMOFFSET 0x40000000
602
+ #define WKBSRIDFLAG 0x20000000
603
+ #define WKBBBOXFLAG 0x10000000
604
+
605
+ /* These macros work on PG_LWGEOM.type, LWGEOM.type and all its subclasses */
606
+
607
+ #define TYPE_SETTYPE(c,t) ((c)=(((c)&0xF0)|(t)))
608
+ #define TYPE_SETZM(t,z,m) ((t)=(((t)&0xCF)|((z)<<5)|((m)<<4)))
609
+ #define TYPE_SETHASBBOX(t,b) ((t)=(((t)&0x7F)|((b)<<7)))
610
+ #define TYPE_SETHASSRID(t,s) ((t)=(((t)&0xBF)|((s)<<6)))
611
+
612
+ #define TYPE_HASZ(t) ( ((t)&0x20)>>5 )
613
+ #define TYPE_HASM(t) ( ((t)&0x10)>>4 )
614
+ #define TYPE_HASBBOX(t) ( ((t)&0x80)>>7 )
615
+ #define TYPE_HASSRID(t) ( (((t)&0x40))>>6 )
616
+ #define TYPE_NDIMS(t) ((((t)&0x20)>>5)+(((t)&0x10)>>4)+2)
617
+ #define TYPE_GETTYPE(t) ((t)&0x0F)
618
+
619
+ /* 0x02==Z 0x01==M */
620
+ #define TYPE_GETZM(t) (((t)&0x30)>>4)
621
+
622
+ extern char lwgeom_hasBBOX(uchar type); /* true iff B bit set */
623
+ extern int lwgeom_ndims(uchar type); /* returns 2,3 or 4 */
624
+ extern int lwgeom_hasZ(uchar type); /* has Z ? */
625
+ extern int lwgeom_hasM(uchar type); /* has M ? */
626
+ extern int lwgeom_getType(uchar type); /* returns the tttt value */
627
+
628
+ extern uchar lwgeom_makeType(char hasZ, char hasM, char hasSRID, int type);
629
+ extern uchar lwgeom_makeType_full(char hasZ, char hasM, char hasSRID, int type, char hasBBOX);
630
+ extern char lwgeom_hasSRID(uchar type); /* true iff S bit is set */
631
+ extern char lwgeom_hasBBOX(uchar type); /* true iff B bit set */
632
+
633
+
634
+
635
+ /*
636
+ * This is the binary representation of lwgeom compatible
637
+ * with postgresql varlena struct
638
+ */
639
+ typedef struct {
640
+ uint32 size; /* varlena header (do not touch directly!) */
641
+ uchar type; /* encodes ndims, type, bbox presence,
642
+ srid presence */
643
+ uchar data[1];
644
+ } PG_LWGEOM;
645
+
646
+ /*
647
+ * Construct a full PG_LWGEOM type (including size header)
648
+ * from a serialized form.
649
+ * The constructed PG_LWGEOM object will be allocated using palloc
650
+ * and the serialized form will be copied.
651
+ * If you specify a SRID other then -1 it will be set.
652
+ * If you request bbox (wantbbox=1) it will be extracted or computed
653
+ * from the serialized form.
654
+ */
655
+ extern PG_LWGEOM *PG_LWGEOM_construct(uchar *serialized, int SRID,
656
+ int wantbbox);
657
+
658
+ /*
659
+ * Compute bbox of serialized geom
660
+ */
661
+ extern int compute_serialized_box2d_p(uchar *serialized_form, BOX2DFLOAT4 *box);
662
+ extern BOX3D *compute_serialized_box3d(uchar *serialized_form);
663
+ extern int compute_serialized_box3d_p(uchar *serialized_form, BOX3D *box);
664
+
665
+
666
+ /*
667
+ * Evaluate with an heuristic if the provided PG_LWGEOM is worth
668
+ * caching a bbox
669
+ */
670
+ char is_worth_caching_pglwgeom_bbox(const PG_LWGEOM *);
671
+ char is_worth_caching_serialized_bbox(const uchar *);
672
+ char is_worth_caching_lwgeom_bbox(const LWGEOM *);
673
+
674
+ /*
675
+ * Use this macro to extract the char * required
676
+ * by most functions from an PG_LWGEOM struct.
677
+ * (which is an PG_LWGEOM w/out int32 size casted to char *)
678
+ */
679
+ #define SERIALIZED_FORM(x) ((uchar *)VARDATA((x)))
680
+
681
+ /*
682
+ * This function computes the size in bytes
683
+ * of the serialized geometries.
684
+ */
685
+ extern size_t lwgeom_size(const uchar *serialized_form);
686
+ extern size_t lwgeom_size_subgeom(const uchar *serialized_form, int geom_number);
687
+ extern size_t lwgeom_size_line(const uchar *serialized_line);
688
+ extern size_t lwgeom_size_circstring(const uchar *serialized_curve);
689
+ extern size_t lwgeom_size_point(const uchar *serialized_point);
690
+ extern size_t lwgeom_size_poly(const uchar *serialized_line);
691
+
692
+
693
+ /*--------------------------------------------------------
694
+ * all the base types (point/line/polygon) will have a
695
+ * basic constructor, basic de-serializer, basic serializer,
696
+ * bounding box finder and (TODO) serialized form size finder.
697
+ *--------------------------------------------------------*/
698
+
699
+ /*
700
+ * given the LWPOINT serialized form (or a pointer into a muli* one)
701
+ * construct a proper LWPOINT.
702
+ * serialized_form should point to the 8bit type format (with type = 1)
703
+ * Returns NULL if serialized form is not a point.
704
+ * See serialized form doc
705
+ */
706
+ extern LWPOINT *lwpoint_deserialize(uchar *serialized_form);
707
+
708
+ /*
709
+ * Find size this point would get when serialized (no BBOX)
710
+ */
711
+ extern size_t lwpoint_serialize_size(LWPOINT *point);
712
+
713
+ /*
714
+ * convert this point into its serialize form
715
+ * result's first char will be the 8bit type.
716
+ * See serialized form doc
717
+ */
718
+ extern uchar *lwpoint_serialize(LWPOINT *point);
719
+
720
+ /* same as above, writes to buf */
721
+ extern void lwpoint_serialize_buf(LWPOINT *point, uchar *buf, size_t *size);
722
+
723
+ /*
724
+ * find bounding box (standard one)
725
+ * zmin=zmax=0 if 2d (might change to NaN)
726
+ */
727
+ extern BOX3D *lwpoint_compute_box3d(LWPOINT *point);
728
+
729
+ /*
730
+ * convenience functions to hide the POINTARRAY
731
+ */
732
+ extern int lwpoint_getPoint2d_p(const LWPOINT *point, POINT2D *out);
733
+ extern int lwpoint_getPoint3dz_p(const LWPOINT *point, POINT3DZ *out);
734
+ extern int lwpoint_getPoint3dm_p(const LWPOINT *point, POINT3DM *out);
735
+ extern int lwpoint_getPoint4d_p(const LWPOINT *point, POINT4D *out);
736
+
737
+ /******************************************************************
738
+ * LWLINE functions
739
+ ******************************************************************/
740
+
741
+ /*
742
+ * given the LWGEOM serialized form (or a pointer into a muli* one)
743
+ * construct a proper LWLINE.
744
+ * serialized_form should point to the 8bit type format (with type = 2)
745
+ * See SERIALIZED_FORM doc
746
+ */
747
+ extern LWLINE *lwline_deserialize(uchar *serialized_form);
748
+
749
+ /* find the size this line would get when serialized */
750
+ extern size_t lwline_serialize_size(LWLINE *line);
751
+
752
+ /*
753
+ * convert this line into its serialize form
754
+ * result's first char will be the 8bit type. See serialized form doc
755
+ * copies data.
756
+ */
757
+ extern uchar *lwline_serialize(LWLINE *line);
758
+
759
+ /* same as above, writes to buf */
760
+ extern void lwline_serialize_buf(LWLINE *line, uchar *buf, size_t *size);
761
+
762
+ /*
763
+ * find bounding box (standard one) zmin=zmax=0 if 2d (might change to NaN)
764
+ */
765
+ extern BOX3D *lwline_compute_box3d(LWLINE *line);
766
+
767
+ /******************************************************************
768
+ * LWPOLY functions
769
+ ******************************************************************/
770
+
771
+ /*
772
+ * given the LWPOLY serialized form (or a pointer into a muli* one)
773
+ * construct a proper LWPOLY.
774
+ * serialized_form should point to the 8bit type format (with type = 3)
775
+ * See SERIALIZED_FORM doc
776
+ */
777
+ extern LWPOLY *lwpoly_deserialize(uchar *serialized_form);
778
+
779
+ /* find the size this polygon would get when serialized */
780
+ extern size_t lwpoly_serialize_size(LWPOLY *poly);
781
+
782
+ /*
783
+ * create the serialized form of the polygon
784
+ * result's first char will be the 8bit type. See serialized form doc
785
+ * points copied
786
+ */
787
+ extern uchar *lwpoly_serialize(LWPOLY *poly);
788
+
789
+ /* same as above, writes to buf */
790
+ extern void lwpoly_serialize_buf(LWPOLY *poly, uchar *buf, size_t *size);
791
+
792
+ /*
793
+ * find bounding box (standard one) zmin=zmax=0 if 2d (might change to NaN)
794
+ */
795
+ extern BOX3D *lwpoly_compute_box3d(LWPOLY *poly);
796
+
797
+ /******************************************************************
798
+ * LWCIRCSTRING functions
799
+ ******************************************************************/
800
+
801
+ /*
802
+ * given the LWGEOM serialized form (or a pointer into a muli* one)
803
+ * construct a proper LWCIRCSTRING.
804
+ * serialized_form should point to the 8bit type format (with type = 2)
805
+ * See SERIALIZED_FORM doc
806
+ */
807
+ extern LWCIRCSTRING *lwcircstring_deserialize(uchar *serialized_form);
808
+
809
+ /* find the size this curve would get when serialized */
810
+ extern size_t lwcircstring_serialize_size(LWCIRCSTRING *curve);
811
+
812
+ /*
813
+ * convert this circularstring into its serialize form
814
+ * result's first char will be the 8bit type. See serialized form doc
815
+ * copies data.
816
+ */
817
+ extern uchar *lwcircstring_serialize(LWCIRCSTRING *curve);
818
+
819
+ /* same as above, writes to buf */
820
+ extern void lwcircstring_serialize_buf(LWCIRCSTRING *curve, uchar *buf, size_t *size);
821
+
822
+ /*
823
+ * find bounding box (standard one) zmin=zmax=0 if 2d (might change to NaN)
824
+ */
825
+ extern BOX3D *lwcircstring_compute_box3d(LWCIRCSTRING *curve);
826
+
827
+
828
+
829
+ /******************************************************************
830
+ * LWGEOM functions
831
+ ******************************************************************/
832
+
833
+ extern size_t lwgeom_serialize_size(LWGEOM *geom);
834
+ extern size_t lwcollection_serialize_size(LWCOLLECTION *coll);
835
+ extern void lwgeom_serialize_buf(LWGEOM *geom, uchar *buf, size_t *size);
836
+ extern uchar *lwgeom_serialize(LWGEOM *geom);
837
+ extern void lwcollection_serialize_buf(LWCOLLECTION *mcoll, uchar *buf, size_t *size);
838
+ extern int lwcollection_ngeoms(const LWCOLLECTION *col);
839
+
840
+ /*
841
+ * Deserialize an lwgeom serialized form.
842
+ * The deserialized (recursive) structure will store
843
+ * pointers to the serialized form (POINTARRAYs).
844
+ */
845
+ LWGEOM *lwgeom_deserialize(uchar *serializedform);
846
+ BOX3D *lwgeom_compute_box3d(const LWGEOM *geom);
847
+
848
+
849
+ /******************************************************************
850
+ * LWMULTIx and LWCOLLECTION functions
851
+ ******************************************************************/
852
+
853
+ LWMPOINT *lwmpoint_deserialize(uchar *serializedform);
854
+ LWMLINE *lwmline_deserialize(uchar *serializedform);
855
+ LWMPOLY *lwmpoly_deserialize(uchar *serializedform);
856
+ LWCOLLECTION *lwcollection_deserialize(uchar *serializedform);
857
+ LWCOMPOUND *lwcompound_deserialize(uchar *serialized_form);
858
+ LWCURVEPOLY *lwcurvepoly_deserialize(uchar *serialized_form);
859
+ LWMCURVE *lwmcurve_deserialize(uchar *serialized_form);
860
+ LWMSURFACE *lwmsurface_deserialize(uchar *serialized_form);
861
+
862
+ LWGEOM *lwcollection_getsubgeom(LWCOLLECTION *col, int gnum);
863
+ BOX3D *lwcollection_compute_box3d(LWCOLLECTION *col);
864
+
865
+
866
+ /******************************************************************
867
+ * SERIALIZED FORM functions
868
+ ******************************************************************/
869
+
870
+
871
+ /******************************************************************
872
+ * Multi-geometries
873
+ *
874
+ * These are all handled equivelently so its easy to write iterator code.
875
+ * NOTE NOTE: you can hand in a non-multigeometry to most of these functions
876
+ * and get usual behavior (ie. get geometry 0 on a POINT
877
+ * will return the point).
878
+ * This makes coding even easier since you dont have to necessarily
879
+ * differenciate between the multi* and non-multi geometries.
880
+ *
881
+ * NOTE: these usually work directly off the serialized form, so
882
+ * they're a little more difficult to handle (and slower)
883
+ * NOTE NOTE: the get functions maybe slow, so we may want to have an
884
+ * "analysed" lwgeom that would just have pointer to the start
885
+ * of each sub-geometry.
886
+ *
887
+ ******************************************************************/
888
+
889
+ /* use this version for speed. READ-ONLY! */
890
+ typedef struct
891
+ {
892
+ int SRID;
893
+ const uchar *serialized_form; /* orginal structure */
894
+ uchar type; /* 8-bit type for the LWGEOM */
895
+ int ngeometries; /* number of sub-geometries */
896
+ uchar **sub_geoms; /* list of pointers (into serialized_form)
897
+ of the sub-geoms */
898
+ } LWGEOM_INSPECTED;
899
+
900
+ extern int lwgeom_size_inspected(const LWGEOM_INSPECTED *inspected, int geom_number);
901
+
902
+ /*
903
+ * note - for a simple type (ie. point), this will have
904
+ * sub_geom[0] = serialized_form.
905
+ * for multi-geomtries sub_geom[0] will be a few bytes into the
906
+ * serialized form.
907
+ * This function just computes the length of each sub-object and
908
+ * pre-caches this info.
909
+ * For a geometry collection of multi* geometries, you can inspect
910
+ * the sub-components as well.
911
+ */
912
+ extern LWGEOM_INSPECTED *lwgeom_inspect(const uchar *serialized_form);
913
+
914
+
915
+ /*
916
+ * 1st geometry has geom_number = 0
917
+ * if the actual sub-geometry isnt a POINT, null is returned (see _gettype()).
918
+ * if there arent enough geometries, return null.
919
+ * this is fine to call on a point (with geom_num=0), multipoint
920
+ * or geometrycollection
921
+ */
922
+ extern LWPOINT *lwgeom_getpoint(uchar *serialized_form, int geom_number);
923
+ extern LWPOINT *lwgeom_getpoint_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
924
+
925
+ /*
926
+ * 1st geometry has geom_number = 0
927
+ * if the actual geometry isnt a LINE, null is returned (see _gettype()).
928
+ * if there arent enough geometries, return null.
929
+ * this is fine to call on a line, multiline or geometrycollection
930
+ */
931
+ extern LWLINE *lwgeom_getline(uchar *serialized_form, int geom_number);
932
+ extern LWLINE *lwgeom_getline_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
933
+
934
+ /*
935
+ * 1st geometry has geom_number = 0
936
+ * if the actual geometry isnt a POLYGON, null is returned (see _gettype()).
937
+ * if there arent enough geometries, return null.
938
+ * this is fine to call on a polygon, multipolygon or geometrycollection
939
+ */
940
+ extern LWPOLY *lwgeom_getpoly(uchar *serialized_form, int geom_number);
941
+ extern LWPOLY *lwgeom_getpoly_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
942
+
943
+ /*
944
+ * 1st geometry has geom_number = 0
945
+ * if the actual geometry isnt a POLYGON, null is returned (see _gettype()).
946
+ * if there arent enough geometries, return null.
947
+ * this is fine to call on a polygon, multipolygon or geometrycollection
948
+ */
949
+ extern LWCIRCSTRING *lwgeom_getcircstring_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
950
+
951
+ extern LWGEOM *lwgeom_getgeom_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
952
+
953
+
954
+
955
+ /*
956
+ * this gets the serialized form of a sub-geometry
957
+ * 1st geometry has geom_number = 0
958
+ * if this isnt a multi* geometry, and geom_number ==0 then it returns
959
+ * itself
960
+ * returns null on problems.
961
+ * in the future this is how you would access a muli* portion of a
962
+ * geometry collection.
963
+ * GEOMETRYCOLLECTION(MULTIPOINT(0 0, 1 1), LINESTRING(0 0, 1 1))
964
+ * ie. lwgeom_getpoint( lwgeom_getsubgeometry( serialized, 0), 1)
965
+ * --> POINT(1 1)
966
+ * you can inspect the sub-geometry as well if you wish.
967
+ */
968
+ extern uchar *lwgeom_getsubgeometry(const uchar *serialized_form, int geom_number);
969
+ extern uchar *lwgeom_getsubgeometry_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
970
+
971
+
972
+ /*
973
+ * 1st geometry has geom_number = 0
974
+ * use geom_number = -1 to find the actual type of the serialized form.
975
+ * ie lwgeom_gettype( <'MULTIPOINT(0 0, 1 1)'>, -1)
976
+ * --> multipoint
977
+ * ie lwgeom_gettype( <'MULTIPOINT(0 0, 1 1)'>, 0)
978
+ * --> point
979
+ * gets the 8bit type of the geometry at location geom_number
980
+ */
981
+ extern uchar lwgeom_getsubtype(uchar *serialized_form, int geom_number);
982
+ extern uchar lwgeom_getsubtype_inspected(LWGEOM_INSPECTED *inspected, int geom_number);
983
+
984
+
985
+ /*
986
+ * how many sub-geometries are there?
987
+ * for point,line,polygon will return 1.
988
+ */
989
+ extern int lwgeom_getnumgeometries(uchar *serialized_form);
990
+ extern int lwgeom_getnumgeometries_inspected(LWGEOM_INSPECTED *inspected);
991
+
992
+
993
+
994
+ /*
995
+ * set finalType to COLLECTIONTYPE or 0 (0 means choose a best type)
996
+ * (ie. give it 2 points and ask it to be a multipoint)
997
+ * use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
998
+ * all subgeometries must have the same SRID
999
+ * if you want to construct an inspected, call this then inspect the result...
1000
+ */
1001
+ extern uchar *lwgeom_serialized_construct(int SRID, int finalType, char hasz, char hasm, int nsubgeometries, uchar **serialized_subs);
1002
+
1003
+
1004
+ /* construct the empty geometry (GEOMETRYCOLLECTION(EMPTY)) */
1005
+ extern uchar *lwgeom_constructempty(int SRID, char hasz, char hasm);
1006
+ extern void lwgeom_constructempty_buf(int SRID, char hasz, char hasm, uchar *buf, size_t *size);
1007
+ size_t lwgeom_empty_length(int SRID);
1008
+
1009
+ /*
1010
+ * get the SRID from the LWGEOM
1011
+ * none present => -1
1012
+ */
1013
+ extern int lwgeom_getsrid(uchar *serialized);
1014
+
1015
+
1016
+ /*------------------------------------------------------
1017
+ * other stuff
1018
+ *
1019
+ * handle the double-to-float conversion. The results of this
1020
+ * will usually be a slightly bigger box because of the difference
1021
+ * between float8 and float4 representations.
1022
+ */
1023
+
1024
+ extern BOX2DFLOAT4 *box3d_to_box2df(BOX3D *box);
1025
+ extern int box3d_to_box2df_p(BOX3D *box, BOX2DFLOAT4 *res);
1026
+
1027
+ extern BOX3D box2df_to_box3d(BOX2DFLOAT4 *box);
1028
+ extern void box2df_to_box3d_p(BOX2DFLOAT4 *box, BOX3D *box3d);
1029
+
1030
+ extern BOX3D *box3d_union(BOX3D *b1, BOX3D *b2);
1031
+ extern int box3d_union_p(BOX3D *b1, BOX3D *b2, BOX3D *ubox);
1032
+
1033
+ /*
1034
+ * Returns a pointer to the BBOX internal to the serialized form.
1035
+ * READ-ONLY!
1036
+ * Or NULL if serialized form does not have a BBOX
1037
+ * OBSOLETED to avoid memory alignment problems.
1038
+ */
1039
+ /*extern BOX2DFLOAT4 *getbox2d_internal(uchar *serialized_form);*/
1040
+
1041
+ /*
1042
+ * this function writes to 'box' and returns 0 if serialized_form
1043
+ * does not have a bounding box (empty geom)
1044
+ */
1045
+ extern int getbox2d_p(uchar *serialized_form, BOX2DFLOAT4 *box);
1046
+
1047
+ /* Expand given box of 'd' units in all directions */
1048
+ void expand_box2d(BOX2DFLOAT4 *box, double d);
1049
+ void expand_box3d(BOX3D *box, double d);
1050
+
1051
+ /* Check if to boxes are equal (considering FLOAT approximations) */
1052
+ char box2d_same(BOX2DFLOAT4 *box1, BOX2DFLOAT4 *box2);
1053
+
1054
+
1055
+
1056
+ /****************************************************************
1057
+ * MEMORY MANAGEMENT
1058
+ ****************************************************************/
1059
+
1060
+ /*
1061
+ * The lwfree_* family of functions frees *all* memory associated
1062
+ * with the pointer, including the serialized__pointlist in the
1063
+ * point arrays. Do not use these on LWGEOMs de-serialized from
1064
+ * PG_LWGEOMs or they will try to free an underlying structure
1065
+ * managed by PgSQL. Only use these on LWGEOMs you have
1066
+ * constructed yourself.
1067
+ */
1068
+
1069
+ extern void ptarray_free(POINTARRAY *pa);
1070
+ extern void lwpoint_free(LWPOINT *pt);
1071
+ extern void lwline_free(LWLINE *line);
1072
+ extern void lwpoly_free(LWPOLY *poly);
1073
+ extern void lwmpoint_free(LWMPOINT *mpt);
1074
+ extern void lwmline_free(LWMLINE *mline);
1075
+ extern void lwmpoly_free(LWMPOLY *mpoly);
1076
+ extern void lwcollection_free(LWCOLLECTION *col);
1077
+ extern void lwcircstring_free(LWCIRCSTRING *curve);
1078
+ extern void lwgeom_free(LWGEOM *geom);
1079
+
1080
+ extern void lwinspected_release(LWGEOM_INSPECTED *inspected); /* TODO: make this deep free... */
1081
+
1082
+ /*
1083
+ * The *_release family of functions frees the LWGEOM structures
1084
+ * surrounding the POINTARRAYs but leaves the POINTARRAYs
1085
+ * intact. Use these on LWGEOMs that have been de-serialized
1086
+ * from PG_LWGEOMs. Do not use these on LWGEOMs you have
1087
+ * constructed yourself, or you will leak lots of memory.
1088
+ */
1089
+
1090
+ extern void lwpoint_release(LWPOINT *lwpoint);
1091
+ extern void lwline_release(LWLINE *lwline);
1092
+ extern void lwpoly_release(LWPOLY *lwpoly);
1093
+ extern void lwmpoint_release(LWMPOINT *lwpoint);
1094
+ extern void lwmline_release(LWMLINE *lwline);
1095
+ extern void lwmpoly_release(LWMPOLY *lwpoly);
1096
+ extern void lwcollection_release(LWCOLLECTION *lwcollection);
1097
+ extern void lwgeom_release(LWGEOM *lwgeom);
1098
+
1099
+
1100
+ /****************************************************************
1101
+ * utility
1102
+ ****************************************************************/
1103
+
1104
+ extern uint32 lw_get_uint32(const uchar *loc);
1105
+ extern int32 lw_get_int32(const uchar *loc);
1106
+ extern void printBOX3D(BOX3D *b);
1107
+ extern void printPA(POINTARRAY *pa);
1108
+ extern void printLWPOINT(LWPOINT *point);
1109
+ extern void printLWLINE(LWLINE *line);
1110
+ extern void printLWPOLY(LWPOLY *poly);
1111
+ extern void printBYTES(uchar *a, int n);
1112
+ extern void printMULTI(uchar *serialized);
1113
+ extern void printType(uchar str);
1114
+
1115
+
1116
+ extern float LWGEOM_Minf(float a, float b);
1117
+ extern float LWGEOM_Maxf(float a, float b);
1118
+ extern double LWGEOM_Mind(double a, double b);
1119
+ extern double LWGEOM_Maxd(double a, double b);
1120
+
1121
+ extern float nextDown_f(double d);
1122
+ extern float nextUp_f(double d);
1123
+ extern double nextDown_d(float d);
1124
+ extern double nextUp_d(float d);
1125
+
1126
+ extern float nextafterf_custom(float x, float y);
1127
+
1128
+
1129
+ #define LW_MAX(a,b) ((a) > (b) ? (a) : (b))
1130
+ #define LW_MIN(a,b) ((a) <= (b) ? (a) : (b))
1131
+ #define LW_ABS(a) ((a) < (0) ? (-a) : (a))
1132
+
1133
+
1134
+ /* general utilities */
1135
+ extern double lwgeom_polygon_area(LWPOLY *poly);
1136
+ extern double lwgeom_polygon_perimeter(LWPOLY *poly);
1137
+ extern double lwgeom_polygon_perimeter2d(LWPOLY *poly);
1138
+ extern double lwgeom_pointarray_length2d(POINTARRAY *pts);
1139
+ extern double lwgeom_pointarray_length(POINTARRAY *pts);
1140
+ extern void lwgeom_force2d_recursive(uchar *serialized, uchar *optr, size_t *retsize);
1141
+ extern void lwgeom_force3dz_recursive(uchar *serialized, uchar *optr, size_t *retsize);
1142
+ extern void lwgeom_force3dm_recursive(uchar *serialized, uchar *optr, size_t *retsize);
1143
+ extern void lwgeom_force4d_recursive(uchar *serialized, uchar *optr, size_t *retsize);
1144
+ extern double distance2d_pt_pt(POINT2D *p1, POINT2D *p2);
1145
+ extern double distance2d_pt_seg(POINT2D *p, POINT2D *A, POINT2D *B);
1146
+ extern double distance2d_seg_seg(POINT2D *A, POINT2D *B, POINT2D *C, POINT2D *D);
1147
+ extern double distance2d_pt_ptarray(POINT2D *p, POINTARRAY *pa);
1148
+ extern double distance2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2);
1149
+ extern int pt_in_ring_2d(POINT2D *p, POINTARRAY *ring);
1150
+ extern int pt_in_poly_2d(POINT2D *p, LWPOLY *poly);
1151
+ extern double distance2d_ptarray_poly(POINTARRAY *pa, LWPOLY *poly);
1152
+ extern double distance2d_point_point(LWPOINT *point1, LWPOINT *point2);
1153
+ extern double distance2d_point_line(LWPOINT *point, LWLINE *line);
1154
+ extern double distance2d_line_line(LWLINE *line1, LWLINE *line2);
1155
+ extern double distance2d_point_poly(LWPOINT *point, LWPOLY *poly);
1156
+ extern double distance2d_poly_poly(LWPOLY *poly1, LWPOLY *poly2);
1157
+ extern double distance2d_line_poly(LWLINE *line, LWPOLY *poly);
1158
+ extern int azimuth_pt_pt(POINT2D *p1, POINT2D *p2, double *ret);
1159
+ extern double lwgeom_mindistance2d_recursive(uchar *lw1, uchar *lw2);
1160
+ extern double lwgeom_mindistance2d_recursive_tolerance(uchar *lw1, uchar *lw2, double tolerance);
1161
+ extern int lwgeom_pt_inside_circle(POINT2D *p, double cx, double cy, double rad);
1162
+ extern int32 lwgeom_npoints(uchar *serialized);
1163
+ extern char ptarray_isccw(const POINTARRAY *pa);
1164
+ extern void lwgeom_reverse(LWGEOM *lwgeom);
1165
+ extern void lwline_reverse(LWLINE *line);
1166
+ extern void lwpoly_reverse(LWPOLY *poly);
1167
+ extern void lwpoly_forceRHR(LWPOLY *poly);
1168
+ extern void lwgeom_forceRHR(LWGEOM *lwgeom);
1169
+ extern char *lwgeom_summary(LWGEOM *lwgeom, int offset);
1170
+ extern const char *lwgeom_typename(int type);
1171
+ extern int ptarray_compute_box2d_p(const POINTARRAY *pa, BOX2DFLOAT4 *result);
1172
+ extern BOX2DFLOAT4 *ptarray_compute_box2d(const POINTARRAY *pa);
1173
+ extern int lwpoint_compute_box2d_p(LWPOINT *point, BOX2DFLOAT4 *box);
1174
+ extern int lwline_compute_box2d_p(LWLINE *line, BOX2DFLOAT4 *box);
1175
+ extern int lwpoly_compute_box2d_p(LWPOLY *poly, BOX2DFLOAT4 *box);
1176
+ extern int lwcollection_compute_box2d_p(LWCOLLECTION *col, BOX2DFLOAT4 *box);
1177
+ extern int lwcircstring_compute_box2d_p(LWCIRCSTRING *curve, BOX2DFLOAT4 *box);
1178
+ extern BOX2DFLOAT4 *lwgeom_compute_box2d(LWGEOM *lwgeom);
1179
+
1180
+ extern void interpolate_point4d(POINT4D *A, POINT4D *B, POINT4D *I, double F);
1181
+
1182
+ /* return alloced memory */
1183
+ extern BOX2DFLOAT4 *box2d_union(BOX2DFLOAT4 *b1, BOX2DFLOAT4 *b2);
1184
+
1185
+ /* args may overlap ! */
1186
+ extern int box2d_union_p(BOX2DFLOAT4 *b1, BOX2DFLOAT4 *b2, BOX2DFLOAT4 *ubox);
1187
+ extern int lwgeom_compute_box2d_p(LWGEOM *lwgeom, BOX2DFLOAT4 *box);
1188
+ void lwgeom_longitude_shift(LWGEOM *lwgeom);
1189
+
1190
+ /* Is lwgeom1 geometrically equal to lwgeom2 ? */
1191
+ char lwgeom_same(const LWGEOM *lwgeom1, const LWGEOM *lwgeom2);
1192
+ char ptarray_same(const POINTARRAY *pa1, const POINTARRAY *pa2);
1193
+ char lwpoint_same(const LWPOINT *p1, const LWPOINT *p2);
1194
+ char lwline_same(const LWLINE *p1, const LWLINE *p2);
1195
+ char lwpoly_same(const LWPOLY *p1, const LWPOLY *p2);
1196
+ char lwcollection_same(const LWCOLLECTION *p1, const LWCOLLECTION *p2);
1197
+
1198
+ /*
1199
+ * Add 'what' to 'to' at position 'where'.
1200
+ * where=0 == prepend
1201
+ * where=-1 == append
1202
+ * Mix of dimensions is not allowed (TODO: allow it?).
1203
+ * Returns a newly allocated LWGEOM (with NO BBOX)
1204
+ */
1205
+ extern LWGEOM *lwgeom_add(const LWGEOM *to, uint32 where, const LWGEOM *what);
1206
+
1207
+ LWGEOM *lwpoint_add(const LWPOINT *to, uint32 where, const LWGEOM *what);
1208
+ LWGEOM *lwline_add(const LWLINE *to, uint32 where, const LWGEOM *what);
1209
+ LWGEOM *lwpoly_add(const LWPOLY *to, uint32 where, const LWGEOM *what);
1210
+ LWGEOM *lwmpoly_add(const LWMPOLY *to, uint32 where, const LWGEOM *what);
1211
+ LWGEOM *lwmline_add(const LWMLINE *to, uint32 where, const LWGEOM *what);
1212
+ LWGEOM *lwmpoint_add(const LWMPOINT *to, uint32 where, const LWGEOM *what);
1213
+ LWGEOM *lwcollection_add(const LWCOLLECTION *to, uint32 where, const LWGEOM *what);
1214
+ LWGEOM *lwcompound_add(const LWCOMPOUND *to, uint32 where, const LWGEOM *what);
1215
+ LWGEOM *lwcurvepoly_add(const LWCURVEPOLY *to, uint32 where, const LWGEOM *what);
1216
+ LWGEOM *lwmcurve_add(const LWMCURVE *to, uint32 where, const LWGEOM *what);
1217
+ LWGEOM *lwmsurface_add(const LWMSURFACE *to, uint32 where, const LWGEOM *what);
1218
+ LWGEOM *lwcircstring_add(const LWCIRCSTRING *to, uint32 where, const LWGEOM *what);
1219
+
1220
+ /*
1221
+ * Clone an LWGEOM
1222
+ * pointarray are not copied.
1223
+ * BBOXes are copied
1224
+ */
1225
+ extern LWGEOM *lwgeom_clone(const LWGEOM *lwgeom);
1226
+ extern LWPOINT *lwpoint_clone(const LWPOINT *lwgeom);
1227
+ extern LWLINE *lwline_clone(const LWLINE *lwgeom);
1228
+ extern LWPOLY *lwpoly_clone(const LWPOLY *lwgeom);
1229
+ extern LWCOLLECTION *lwcollection_clone(const LWCOLLECTION *lwgeom);
1230
+ extern LWCIRCSTRING *lwcircstring_clone(const LWCIRCSTRING *curve);
1231
+ extern BOX2DFLOAT4 *box2d_clone(const BOX2DFLOAT4 *lwgeom);
1232
+ extern POINTARRAY *ptarray_clone(const POINTARRAY *ptarray);
1233
+
1234
+ /*
1235
+ * Geometry constructors
1236
+ * Take ownership of arguments
1237
+ */
1238
+ extern LWPOINT *lwpoint_construct(int SRID, BOX2DFLOAT4 *bbox,
1239
+ POINTARRAY *point);
1240
+ extern LWLINE *lwline_construct(int SRID, BOX2DFLOAT4 *bbox,
1241
+ POINTARRAY *points);
1242
+
1243
+ /*
1244
+ * Construct a new LWPOLY. arrays (points/points per ring) will NOT be copied
1245
+ * use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
1246
+ */
1247
+ extern LWPOLY *lwpoly_construct(int SRID, BOX2DFLOAT4 *bbox,
1248
+ unsigned int nrings, POINTARRAY **points);
1249
+
1250
+ extern LWCOLLECTION *lwcollection_construct(unsigned int type, int SRID,
1251
+ BOX2DFLOAT4 *bbox, unsigned int ngeoms, LWGEOM **geoms);
1252
+ extern LWCOLLECTION *lwcollection_construct_empty(int SRID,
1253
+ char hasZ, char hasM);
1254
+
1255
+ /*
1256
+ * Construct a new LWCIRCSTRING. arrays (points/points per ring) will NOT be copied
1257
+ * use SRID=-1 for unknown SRID (will have 8bit type's S = 0)
1258
+ */
1259
+ extern LWCIRCSTRING *lwcircstring_construct(int SRID, BOX2DFLOAT4 *bbox, POINTARRAY *points);
1260
+
1261
+ /* Other constructors */
1262
+ extern LWPOINT *make_lwpoint2d(int SRID, double x, double y);
1263
+ extern LWPOINT *make_lwpoint3dz(int SRID, double x, double y, double z);
1264
+ extern LWPOINT *make_lwpoint3dm(int SRID, double x, double y, double m);
1265
+ extern LWPOINT *make_lwpoint4d(int SRID, double x, double y, double z, double m);
1266
+ extern LWLINE *lwline_from_lwpointarray(int SRID, unsigned int npoints, LWPOINT **points);
1267
+ extern LWLINE *lwline_from_lwmpoint(int SRID, LWMPOINT *mpoint);
1268
+ extern LWLINE *lwline_addpoint(LWLINE *line, LWPOINT *point, unsigned int where);
1269
+ extern LWLINE *lwline_removepoint(LWLINE *line, unsigned int which);
1270
+ extern void lwline_setPoint4d(LWLINE *line, unsigned int which, POINT4D *newpoint);
1271
+ extern LWPOLY *lwpoly_from_lwlines(const LWLINE *shell, unsigned int nholes, const LWLINE **holes);
1272
+
1273
+ /* Return a char string with ASCII versionf of type flags */
1274
+ extern const char *lwgeom_typeflags(uchar type);
1275
+
1276
+ /* Construct an empty pointarray */
1277
+ extern POINTARRAY *ptarray_construct(char hasz, char hasm, unsigned int npoints);
1278
+
1279
+ /*
1280
+ * extern POINTARRAY *ptarray_construct2d(uint32 npoints, const POINT2D *pts);
1281
+ * extern POINTARRAY *ptarray_construct3dz(uint32 npoints, const POINT3DZ *pts);
1282
+ * extern POINTARRAY *ptarray_construct3dm(uint32 npoints, const POINT3DM *pts);
1283
+ * extern POINTARRAY *ptarray_construct4d(uint32 npoints, const POINT4D *pts);
1284
+ */
1285
+
1286
+ extern POINTARRAY *ptarray_addPoint(POINTARRAY *pa, uchar *p, size_t pdims,
1287
+ unsigned int where);
1288
+ extern POINTARRAY *ptarray_removePoint(POINTARRAY *pa, unsigned int where);
1289
+
1290
+ extern int ptarray_isclosed2d(const POINTARRAY *pa);
1291
+
1292
+ extern void ptarray_longitude_shift(POINTARRAY *pa);
1293
+
1294
+ extern int32 lwgeom_nrings_recursive(uchar *serialized);
1295
+ extern void ptarray_reverse(POINTARRAY *pa);
1296
+ extern POINTARRAY *ptarray_substring(POINTARRAY *, double, double);
1297
+ extern double ptarray_locate_point(POINTARRAY *, POINT2D *);
1298
+ extern void closest_point_on_segment(POINT2D *p, POINT2D *A, POINT2D *B, POINT2D *ret);
1299
+
1300
+ /*
1301
+ * Ensure every segment is at most 'dist' long.
1302
+ * Returned LWGEOM might is unchanged if a POINT.
1303
+ */
1304
+ extern LWGEOM *lwgeom_segmentize2d(LWGEOM *line, double dist);
1305
+ extern POINTARRAY *ptarray_segmentize2d(POINTARRAY *ipa, double dist);
1306
+ extern LWLINE *lwline_segmentize2d(LWLINE *line, double dist);
1307
+ extern LWPOLY *lwpoly_segmentize2d(LWPOLY *line, double dist);
1308
+ extern LWCOLLECTION *lwcollection_segmentize2d(LWCOLLECTION *coll, double dist);
1309
+
1310
+ extern uchar parse_hex(char *str);
1311
+ extern void deparse_hex(uchar str, char *result);
1312
+
1313
+ /* Parser check flags */
1314
+ #define PARSER_CHECK_MINPOINTS 1
1315
+ #define PARSER_CHECK_ODD 2
1316
+ #define PARSER_CHECK_CLOSURE 4
1317
+
1318
+ #define PARSER_CHECK_NONE 0
1319
+ #define PARSER_CHECK_ALL (PARSER_CHECK_MINPOINTS | PARSER_CHECK_ODD | PARSER_CHECK_CLOSURE)
1320
+
1321
+ /*
1322
+ * Parser result structure: returns the result of attempting to convert (E)WKT/(E)WKB to LWGEOM
1323
+ */
1324
+ typedef struct struct_lwgeom_parser_result
1325
+ {
1326
+ const char *wkinput; /* Copy of pointer to input WKT/WKB */
1327
+ uchar *serialized_lwgeom; /* Pointer to serialized LWGEOM */
1328
+ int size; /* Size of serialized LWGEOM in bytes */
1329
+ const char *message; /* Error/warning message */
1330
+ int errlocation; /* Location of error */
1331
+ } LWGEOM_PARSER_RESULT;
1332
+
1333
+ /*
1334
+ * Parser error messages (these must match the message array in lwgparse.c)
1335
+ */
1336
+ #define PARSER_ERROR_MOREPOINTS 1
1337
+ #define PARSER_ERROR_ODDPOINTS 2
1338
+ #define PARSER_ERROR_UNCLOSED 3
1339
+ #define PARSER_ERROR_MIXDIMS 4
1340
+ #define PARSER_ERROR_INVALIDGEOM 5
1341
+ #define PARSER_ERROR_INVALIDWKBTYPE 6
1342
+
1343
+
1344
+ /*
1345
+ * Unparser result structure: returns the result of attempting to convert LWGEOM to (E)WKT/(E)WKB
1346
+ */
1347
+ typedef struct struct_lwgeom_unparser_result
1348
+ {
1349
+ uchar *serialized_lwgeom; /* Copy of pointer to input serialized LWGEOM */
1350
+ char *wkoutput; /* Pointer to WKT or WKB output */
1351
+ int size; /* Size of serialized LWGEOM in bytes */
1352
+ const char *message; /* Error/warning message */
1353
+ int errlocation; /* Location of error */
1354
+ } LWGEOM_UNPARSER_RESULT;
1355
+
1356
+ /*
1357
+ * Unparser error messages (these must match the message array in lwgunparse.c)
1358
+ */
1359
+ #define UNPARSER_ERROR_MOREPOINTS 1
1360
+ #define UNPARSER_ERROR_ODDPOINTS 2
1361
+ #define UNPARSER_ERROR_UNCLOSED 3
1362
+
1363
+
1364
+ /* Parser access routines */
1365
+ extern char *lwgeom_to_ewkt(LWGEOM *lwgeom, int flags);
1366
+ extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder);
1367
+ extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen);
1368
+ extern LWGEOM *lwgeom_from_ewkt(char *ewkt, int flags);
1369
+ extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *ewkblen);
1370
+
1371
+ extern int serialized_lwgeom_to_ewkt(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags);
1372
+ extern int serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_input, int flags);
1373
+ extern int serialized_lwgeom_to_hexwkb(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags, unsigned int byteorder);
1374
+ extern int serialized_lwgeom_from_hexwkb(LWGEOM_PARSER_RESULT *lwg_parser_result, char *hexwkb_input, int flags);
1375
+ extern int serialized_lwgeom_to_ewkb(LWGEOM_UNPARSER_RESULT *lwg_unparser_result, uchar *serialized, int flags, unsigned int byteorder);
1376
+
1377
+ extern void *lwalloc(size_t size);
1378
+ extern void *lwrealloc(void *mem, size_t size);
1379
+ extern void lwfree(void *mem);
1380
+
1381
+ /* Utilities */
1382
+ extern void trim_trailing_zeros(char *num);
1383
+ extern char *lwmessage_truncate(char *str, int startpos, int endpos, int maxlength, int truncdirection);
1384
+
1385
+ /* Machine endianness */
1386
+ #define XDR 0
1387
+ #define NDR 1
1388
+ extern char getMachineEndian(void);
1389
+
1390
+ void errorIfSRIDMismatch(int srid1, int srid2);
1391
+
1392
+
1393
+ /*******************************************************************************
1394
+ * SQLMM internal functions - TODO: Move into separate header files
1395
+ ******************************************************************************/
1396
+
1397
+ uint32 has_arc(LWGEOM *geom);
1398
+ double lwcircle_center(POINT4D *p1, POINT4D *p2, POINT4D *p3, POINT4D **result);
1399
+ LWGEOM *lwgeom_segmentize(LWGEOM *geom, uint32 perQuad);
1400
+ LWGEOM *lwgeom_desegmentize(LWGEOM *geom);
1401
+ extern double lwgeom_curvepolygon_area(LWCURVEPOLY *curvepoly);
1402
+ double lwcircle_center(POINT4D *p1, POINT4D *p2, POINT4D *p3, POINT4D **result);
1403
+
1404
+ #endif /* !defined _LIBLWGEOM_H */
1405
+