3
GeoPackage extensions for SpatiaLite / SQLite
5
Version: MPL 1.1/GPL 2.0/LGPL 2.1
7
The contents of this file are subject to the Mozilla Public License Version
8
1.1 (the "License"); you may not use this file except in compliance with
9
the License. You may obtain a copy of the License at
10
http://www.mozilla.org/MPL/
12
Software distributed under the License is distributed on an "AS IS" basis,
13
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14
for the specific language governing rights and limitations under the
17
The Original Code is GeoPackage Extensions
19
The Initial Developer of the Original Code is Brad Hards (bradh@frogmouth.net)
21
Portions created by the Initial Developer are Copyright (C) 2012-2015
22
the Initial Developer. All Rights Reserved.
26
Alternatively, the contents of this file may be used under the terms of
27
either the GNU General Public License Version 2 or later (the "GPL"), or
28
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
in which case the provisions of the GPL or the LGPL are applicable instead
30
of those above. If you wish to allow use of your version of this file only
31
under the terms of either the GPL or the LGPL, and not to allow others to
32
use your version of this file under the terms of the MPL, indicate your
33
decision by deleting the provisions above and replace them with the notice
34
and other provisions required by the GPL or the LGPL. If you do not delete
35
the provisions above, a recipient may use your version of this file under
36
the terms of any one of the MPL, the GPL or the LGPL.
40
#include "spatialite/geopackage.h"
42
#include "geopackage_internal.h"
44
#ifdef ENABLE_GEOPACKAGE
46
#define GEOPACKAGE_UNUSED() if (argc || argv) argc = argc;
49
gpkgMakePoint (double x, double y, int srid, unsigned char **result,
52
/* build a Blob encoded Geometry representing a POINT */
54
int endian_arch = gaiaEndianArch ();
56
/* computing the Blob size and then allocating it */
57
*size = GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN;
58
*size += GEOPACKAGE_WKB_HEADER_LEN;
59
*size += (sizeof (double) * 2); /* [x,y] coords */
60
*result = malloc (*size);
65
memset (*result, 0xD9, *size);
68
/* setting the Blob value */
69
gpkgSetHeader2DLittleEndian (ptr, srid, endian_arch);
71
gpkgSetHeader2DMbr (ptr + GEOPACKAGE_HEADER_LEN, x, y, x, y, endian_arch);
73
*(ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN) =
74
GEOPACKAGE_WKB_LITTLEENDIAN;
75
gaiaExport32 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN + 1,
76
GEOPACKAGE_WKB_POINT, 1, endian_arch);
77
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN +
78
GEOPACKAGE_WKB_HEADER_LEN, x, 1, endian_arch);
79
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN +
80
GEOPACKAGE_WKB_HEADER_LEN + sizeof (double), y, 1,
85
gpkgMakePointZ (double x, double y, double z, int srid, unsigned char **result,
88
/* build a Blob encoded Geometry representing a POINT */
90
int endian_arch = gaiaEndianArch ();
91
/* computing the Blob size and then allocating it */
92
*size = GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN;
93
*size += GEOPACKAGE_WKB_HEADER_LEN;
94
*size += (sizeof (double) * 3); /* [x,y,z] coords */
95
*result = malloc (*size);
100
memset (*result, 0xD9, *size); /* just a flag value */
102
/* setting the Blob value */
103
*ptr = GEOPACKAGE_MAGIC1;
104
*(ptr + 1) = GEOPACKAGE_MAGIC2;
105
*(ptr + 2) = GEOPACKAGE_VERSION;
106
*(ptr + 3) = GEOPACKAGE_FLAGS_3D_LITTLEENDIAN;
107
gaiaExport32 (ptr + 4, srid, 1, endian_arch); /* the SRID */
108
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN, x, 1, endian_arch); /* MBR - minimum X */
109
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + sizeof (double), x, 1, endian_arch); /* MBR - maximum x */
110
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 2 * sizeof (double), y, 1, endian_arch); /* MBR - minimum Y */
111
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 3 * sizeof (double), y, 1, endian_arch); /* MBR - maximum Y */
112
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 4 * sizeof (double), z, 1, endian_arch); /* MBR - maximum Z */
113
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 5 * sizeof (double), z, 1, endian_arch); /* MBR - maximum Z */
114
*(ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN) =
115
GEOPACKAGE_WKB_LITTLEENDIAN;
116
gaiaExport32 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN + 1,
117
GEOPACKAGE_WKB_POINTZ, 1, endian_arch);
118
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN +
119
GEOPACKAGE_WKB_HEADER_LEN, x, 1, endian_arch);
120
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN +
121
GEOPACKAGE_WKB_HEADER_LEN + sizeof (double), y, 1,
123
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN +
124
GEOPACKAGE_WKB_HEADER_LEN + (2 * sizeof (double)), z, 1,
129
gpkgMakePointM (double x, double y, double m, int srid, unsigned char **result,
132
/* build a Blob encoded Geometry representing a POINT */
134
int endian_arch = gaiaEndianArch ();
135
/* computing the Blob size and then allocating it */
136
*size = GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN;
137
*size += GEOPACKAGE_WKB_HEADER_LEN;
138
*size += (sizeof (double) * 3); /* [x,y,m] coords */
139
*result = malloc (*size);
144
memset (*result, 0xD9, *size); /* just a flag value */
146
/* setting the Blob value */
147
*ptr = GEOPACKAGE_MAGIC1;
148
*(ptr + 1) = GEOPACKAGE_MAGIC2;
149
*(ptr + 2) = GEOPACKAGE_VERSION;
150
*(ptr + 3) = GEOPACKAGE_FLAGS_2DM_LITTLEENDIAN;
151
gaiaExport32 (ptr + 4, srid, 1, endian_arch); /* the SRID */
152
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN, x, 1, endian_arch); /* MBR - minimum X */
153
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + sizeof (double), x, 1, endian_arch); /* MBR - maximum X */
154
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 2 * sizeof (double), y, 1, endian_arch); /* MBR - minimum Y */
155
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 3 * sizeof (double), y, 1, endian_arch); /* MBR - maximum Y */
156
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 4 * sizeof (double), m, 1, endian_arch); /* MBR - maximum M */
157
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 5 * sizeof (double), m, 1, endian_arch); /* MBR - maximum M */
158
*(ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN) =
159
GEOPACKAGE_WKB_LITTLEENDIAN;
160
gaiaExport32 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN + 1,
161
GEOPACKAGE_WKB_POINTM, 1, endian_arch);
162
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN +
163
GEOPACKAGE_WKB_HEADER_LEN, x, 1, endian_arch);
164
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN +
165
GEOPACKAGE_WKB_HEADER_LEN + sizeof (double), y, 1,
167
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_3D_ENVELOPE_LEN +
168
GEOPACKAGE_WKB_HEADER_LEN + (2 * sizeof (double)), m, 1,
173
gpkgMakePointZM (double x, double y, double z, double m, int srid,
174
unsigned char **result, unsigned int *size)
176
/* build a Blob encoded Geometry representing a POINT */
178
int endian_arch = gaiaEndianArch ();
179
/* computing the Blob size and then allocating it */
180
*size = GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN;
181
*size += GEOPACKAGE_WKB_HEADER_LEN;
182
*size += (sizeof (double) * 4); /* [x,y,z,m] coords */
183
*result = malloc (*size);
188
memset (*result, 0xD9, *size); /* just a flag value */
190
/* setting the Blob value */
191
*ptr = GEOPACKAGE_MAGIC1;
192
*(ptr + 1) = GEOPACKAGE_MAGIC2;
193
*(ptr + 2) = GEOPACKAGE_VERSION;
194
*(ptr + 3) = GEOPACKAGE_FLAGS_3DM_LITTLEENDIAN;
195
gaiaExport32 (ptr + 4, srid, 1, endian_arch); /* the SRID */
196
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN, x, 1, endian_arch); /* MBR - minimum X */
197
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 1 * sizeof (double), x, 1, endian_arch); /* MBR - maximum X */
198
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 2 * sizeof (double), y, 1, endian_arch); /* MBR - minimum Y */
199
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 3 * sizeof (double), y, 1, endian_arch); /* MBR - maximum Y */
200
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 4 * sizeof (double), z, 1, endian_arch); /* MBR - minimum Z */
201
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 5 * sizeof (double), z, 1, endian_arch); /* MBR - maximum Z */
202
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 6 * sizeof (double), m, 1, endian_arch); /* MBR - minimum M */
203
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 7 * sizeof (double), m, 1, endian_arch); /* MBR - maximum M */
204
*(ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN) =
205
GEOPACKAGE_WKB_LITTLEENDIAN;
206
gaiaExport32 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN + 1,
207
GEOPACKAGE_WKB_POINTZM, 1, endian_arch);
208
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN +
209
GEOPACKAGE_WKB_HEADER_LEN, x, 1, endian_arch);
210
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN +
211
GEOPACKAGE_WKB_HEADER_LEN + sizeof (double), y, 1,
213
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN +
214
GEOPACKAGE_WKB_HEADER_LEN + (2 * sizeof (double)), z, 1,
216
gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN +
217
GEOPACKAGE_WKB_HEADER_LEN + (3 * sizeof (double)), m, 1,
221
GEOPACKAGE_PRIVATE void
222
fnct_gpkgMakePoint (sqlite3_context * context, int argc UNUSED,
223
sqlite3_value ** argv)
226
/ gpkgMakePoint(x, y)
228
/ Creates a GeoPackage geometry POINT
230
/ returns nothing on success, raises exception on error
234
unsigned char *p_result = NULL;
237
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
238
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
240
x = sqlite3_value_double (argv[0]);
242
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
244
int_value = sqlite3_value_int (argv[0]);
249
sqlite3_result_null (context);
252
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
254
y = sqlite3_value_double (argv[1]);
256
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
258
int_value = sqlite3_value_int (argv[1]);
263
sqlite3_result_null (context);
266
gpkgMakePoint (x, y, GEOPACKAGE_DEFAULT_UNDEFINED_SRID, &p_result, &len);
269
sqlite3_result_null (context);
273
sqlite3_result_blob (context, p_result, len, free);
277
GEOPACKAGE_PRIVATE void
278
fnct_gpkgMakePointWithSRID (sqlite3_context * context, int argc UNUSED,
279
sqlite3_value ** argv)
282
/ gpkgMakePoint(x, y, srid)
284
/ Creates a GeoPackage geometry POINT
286
/ returns nothing on success, raises exception on error
290
unsigned char *p_result = NULL;
294
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
295
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
297
x = sqlite3_value_double (argv[0]);
299
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
301
int_value = sqlite3_value_int (argv[0]);
306
sqlite3_result_null (context);
309
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
311
y = sqlite3_value_double (argv[1]);
313
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
315
int_value = sqlite3_value_int (argv[1]);
320
sqlite3_result_null (context);
323
if (sqlite3_value_type (argv[2]) != SQLITE_INTEGER)
325
sqlite3_result_null (context);
328
srid = sqlite3_value_int (argv[2]);
330
gpkgMakePoint (x, y, srid, &p_result, &len);
333
sqlite3_result_null (context);
337
sqlite3_result_blob (context, p_result, len, free);
341
GEOPACKAGE_PRIVATE void
342
fnct_gpkgMakePointZ (sqlite3_context * context, int argc UNUSED,
343
sqlite3_value ** argv)
346
/ gpkgMakePointZ(x, y, z)
348
/ Creates a GeoPackage geometry POINT Z
350
/ returns nothing on success, raises exception on error
354
unsigned char *p_result = NULL;
358
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
359
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
361
x = sqlite3_value_double (argv[0]);
363
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
365
int_value = sqlite3_value_int (argv[0]);
370
sqlite3_result_null (context);
373
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
375
y = sqlite3_value_double (argv[1]);
377
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
379
int_value = sqlite3_value_int (argv[1]);
384
sqlite3_result_null (context);
387
if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
389
z = sqlite3_value_double (argv[2]);
391
else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
393
int_value = sqlite3_value_int (argv[2]);
398
sqlite3_result_null (context);
402
gpkgMakePointZ (x, y, z, GEOPACKAGE_DEFAULT_UNDEFINED_SRID, &p_result,
406
sqlite3_result_null (context);
410
sqlite3_result_blob (context, p_result, len, free);
414
GEOPACKAGE_PRIVATE void
415
fnct_gpkgMakePointZWithSRID (sqlite3_context * context, int argc UNUSED,
416
sqlite3_value ** argv)
419
/ gpkgMakePointZ(x, y, z, srid)
421
/ Creates a GeoPackage geometry POINT Z
423
/ returns nothing on success, raises exception on error
427
unsigned char *p_result = NULL;
432
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
433
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
435
x = sqlite3_value_double (argv[0]);
437
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
439
int_value = sqlite3_value_int (argv[0]);
444
sqlite3_result_null (context);
447
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
449
y = sqlite3_value_double (argv[1]);
451
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
453
int_value = sqlite3_value_int (argv[1]);
458
sqlite3_result_null (context);
461
if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
463
z = sqlite3_value_double (argv[2]);
465
else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
467
int_value = sqlite3_value_int (argv[2]);
472
sqlite3_result_null (context);
475
if (sqlite3_value_type (argv[3]) != SQLITE_INTEGER)
477
sqlite3_result_null (context);
480
srid = sqlite3_value_int (argv[3]);
482
gpkgMakePointZ (x, y, z, srid, &p_result, &len);
485
sqlite3_result_null (context);
489
sqlite3_result_blob (context, p_result, len, free);
493
GEOPACKAGE_PRIVATE void
494
fnct_gpkgMakePointM (sqlite3_context * context, int argc UNUSED,
495
sqlite3_value ** argv)
498
/ gpkgMakePointM(x, y, m)
500
/ Creates a GeoPackage geometry POINT M
502
/ returns nothing on success, raises exception on error
506
unsigned char *p_result = NULL;
510
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
511
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
513
x = sqlite3_value_double (argv[0]);
515
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
517
int_value = sqlite3_value_int (argv[0]);
522
sqlite3_result_null (context);
525
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
527
y = sqlite3_value_double (argv[1]);
529
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
531
int_value = sqlite3_value_int (argv[1]);
536
sqlite3_result_null (context);
539
if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
541
m = sqlite3_value_double (argv[2]);
543
else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
545
int_value = sqlite3_value_int (argv[2]);
550
sqlite3_result_null (context);
554
gpkgMakePointM (x, y, m, GEOPACKAGE_DEFAULT_UNDEFINED_SRID, &p_result,
558
sqlite3_result_null (context);
562
sqlite3_result_blob (context, p_result, len, free);
566
GEOPACKAGE_PRIVATE void
567
fnct_gpkgMakePointMWithSRID (sqlite3_context * context, int argc UNUSED,
568
sqlite3_value ** argv)
571
/ gpkgMakePointM(x, y, m, srid)
573
/ Creates a GeoPackage geometry POINT M
575
/ returns nothing on success, raises exception on error
579
unsigned char *p_result = NULL;
584
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
585
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
587
x = sqlite3_value_double (argv[0]);
589
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
591
int_value = sqlite3_value_int (argv[0]);
596
sqlite3_result_null (context);
599
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
601
y = sqlite3_value_double (argv[1]);
603
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
605
int_value = sqlite3_value_int (argv[1]);
610
sqlite3_result_null (context);
613
if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
615
m = sqlite3_value_double (argv[2]);
617
else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
619
int_value = sqlite3_value_int (argv[2]);
624
sqlite3_result_null (context);
627
if (sqlite3_value_type (argv[3]) != SQLITE_INTEGER)
629
sqlite3_result_null (context);
632
srid = sqlite3_value_int (argv[3]);
634
gpkgMakePointM (x, y, m, srid, &p_result, &len);
637
sqlite3_result_null (context);
641
sqlite3_result_blob (context, p_result, len, free);
645
GEOPACKAGE_PRIVATE void
646
fnct_gpkgMakePointZM (sqlite3_context * context, int argc UNUSED,
647
sqlite3_value ** argv)
650
/ gpkgMakePointM(x, y, z, m)
652
/ Creates a GeoPackage geometry POINT ZM
654
/ returns nothing on success, raises exception on error
658
unsigned char *p_result = NULL;
663
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
664
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
666
x = sqlite3_value_double (argv[0]);
668
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
670
int_value = sqlite3_value_int (argv[0]);
675
sqlite3_result_null (context);
678
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
680
y = sqlite3_value_double (argv[1]);
682
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
684
int_value = sqlite3_value_int (argv[1]);
689
sqlite3_result_null (context);
692
if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
694
z = sqlite3_value_double (argv[2]);
696
else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
698
int_value = sqlite3_value_int (argv[2]);
703
sqlite3_result_null (context);
706
if (sqlite3_value_type (argv[3]) == SQLITE_FLOAT)
708
m = sqlite3_value_double (argv[3]);
710
else if (sqlite3_value_type (argv[3]) == SQLITE_INTEGER)
712
int_value = sqlite3_value_int (argv[3]);
717
sqlite3_result_null (context);
721
gpkgMakePointZM (x, y, z, m, GEOPACKAGE_DEFAULT_UNDEFINED_SRID, &p_result,
725
sqlite3_result_null (context);
729
sqlite3_result_blob (context, p_result, len, free);
733
GEOPACKAGE_PRIVATE void
734
fnct_gpkgMakePointZMWithSRID (sqlite3_context * context, int argc UNUSED,
735
sqlite3_value ** argv)
738
/ gpkgMakePointZM(x, y, z, m, srid)
740
/ Creates a GeoPackage geometry POINT ZM
742
/ returns nothing on success, raises exception on error
746
unsigned char *p_result = NULL;
752
GEOPACKAGE_UNUSED (); /* LCOV_EXCL_LINE */
753
if (sqlite3_value_type (argv[0]) == SQLITE_FLOAT)
755
x = sqlite3_value_double (argv[0]);
757
else if (sqlite3_value_type (argv[0]) == SQLITE_INTEGER)
759
int_value = sqlite3_value_int (argv[0]);
764
sqlite3_result_null (context);
767
if (sqlite3_value_type (argv[1]) == SQLITE_FLOAT)
769
y = sqlite3_value_double (argv[1]);
771
else if (sqlite3_value_type (argv[1]) == SQLITE_INTEGER)
773
int_value = sqlite3_value_int (argv[1]);
778
sqlite3_result_null (context);
781
if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
783
z = sqlite3_value_double (argv[2]);
785
else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
787
int_value = sqlite3_value_int (argv[2]);
792
sqlite3_result_null (context);
795
if (sqlite3_value_type (argv[3]) == SQLITE_FLOAT)
797
m = sqlite3_value_double (argv[3]);
799
else if (sqlite3_value_type (argv[3]) == SQLITE_INTEGER)
801
int_value = sqlite3_value_int (argv[3]);
806
sqlite3_result_null (context);
809
if (sqlite3_value_type (argv[4]) != SQLITE_INTEGER)
811
sqlite3_result_null (context);
814
srid = sqlite3_value_int (argv[4]);
816
gpkgMakePointZM (x, y, z, m, srid, &p_result, &len);
819
sqlite3_result_null (context);
823
sqlite3_result_blob (context, p_result, len, free);