3
gg_wkb.c -- Gaia common support for WKB encoded geometries
5
version 3.0, 2011 July 20
7
Author: Sandro Furieri a.furieri@lqt.it
9
-----------------------------------------------------------------------------
11
Version: MPL 1.1/GPL 2.0/LGPL 2.1
13
The contents of this file are subject to the Mozilla Public License Version
14
1.1 (the "License"); you may not use this file except in compliance with
15
the License. You may obtain a copy of the License at
16
http://www.mozilla.org/MPL/
18
Software distributed under the License is distributed on an "AS IS" basis,
19
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
20
for the specific language governing rights and limitations under the
23
The Original Code is the SpatiaLite library
25
The Initial Developer of the Original Code is Alessandro Furieri
27
Portions created by the Initial Developer are Copyright (C) 2008
28
the Initial Developer. All Rights Reserved.
32
Alternatively, the contents of this file may be used under the terms of
33
either the GNU General Public License Version 2 or later (the "GPL"), or
34
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
35
in which case the provisions of the GPL or the LGPL are applicable instead
36
of those above. If you wish to allow use of your version of this file only
37
under the terms of either the GPL or the LGPL, and not to allow others to
38
use your version of this file under the terms of the MPL, indicate your
39
decision by deleting the provisions above and replace them with the notice
40
and other provisions required by the GPL or the LGPL. If you do not delete
41
the provisions above, a recipient may use your version of this file under
42
the terms of any one of the MPL, the GPL or the LGPL.
46
#include <sys/types.h>
52
#ifdef SPL_AMALGAMATION /* spatialite-amalgamation */
53
#include <spatialite/sqlite3ext.h>
55
#include <sqlite3ext.h>
58
#include <spatialite/gaiageo.h>
61
ParseWkbPoint (gaiaGeomCollPtr geo)
63
/* decodes a POINT from WKB */
66
if (geo->size < geo->offset + 16)
68
x = gaiaImport64 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
69
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
72
gaiaAddPointToGeomColl (geo, x, y);
76
ParseWkbPointZ (gaiaGeomCollPtr geo)
78
/* decodes a POINTZ from WKB */
82
if (geo->size < geo->offset + 24)
84
x = gaiaImport64 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
85
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
87
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
90
gaiaAddPointToGeomCollXYZ (geo, x, y, z);
94
ParseWkbPointM (gaiaGeomCollPtr geo)
96
/* decodes a POINTM from WKB */
100
if (geo->size < geo->offset + 24)
102
x = gaiaImport64 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
103
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
105
m = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
108
gaiaAddPointToGeomCollXYM (geo, x, y, m);
112
ParseWkbPointZM (gaiaGeomCollPtr geo)
114
/* decodes a POINTZM from WKB */
119
if (geo->size < geo->offset + 32)
121
x = gaiaImport64 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
122
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
124
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
126
m = gaiaImport64 (geo->blob + (geo->offset + 24), geo->endian,
129
gaiaAddPointToGeomCollXYZM (geo, x, y, z, m);
133
ParseWkbLine (gaiaGeomCollPtr geo)
135
/* decodes a LINESTRING from WKB */
140
gaiaLinestringPtr line;
141
if (geo->size < geo->offset + 4)
144
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
146
if (geo->size < geo->offset + (16 * points))
148
line = gaiaAddLinestringToGeomColl (geo, points);
149
for (iv = 0; iv < points; iv++)
151
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
153
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
155
gaiaSetPoint (line->Coords, iv, x, y);
161
ParseWkbLineZ (gaiaGeomCollPtr geo)
163
/* decodes a LINESTRINGZ from WKB */
169
gaiaLinestringPtr line;
170
if (geo->size < geo->offset + 4)
173
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
175
if (geo->size < geo->offset + (24 * points))
177
line = gaiaAddLinestringToGeomColl (geo, points);
178
for (iv = 0; iv < points; iv++)
180
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
182
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
184
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
186
gaiaSetPointXYZ (line->Coords, iv, x, y, z);
192
ParseWkbLineM (gaiaGeomCollPtr geo)
194
/* decodes a LINESTRINGM from WKB */
200
gaiaLinestringPtr line;
201
if (geo->size < geo->offset + 4)
204
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
206
if (geo->size < geo->offset + (24 * points))
208
line = gaiaAddLinestringToGeomColl (geo, points);
209
for (iv = 0; iv < points; iv++)
211
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
213
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
215
m = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
217
gaiaSetPointXYM (line->Coords, iv, x, y, m);
223
ParseWkbLineZM (gaiaGeomCollPtr geo)
225
/* decodes a LINESTRINGZM from WKB */
232
gaiaLinestringPtr line;
233
if (geo->size < geo->offset + 4)
236
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
238
if (geo->size < geo->offset + (32 * points))
240
line = gaiaAddLinestringToGeomColl (geo, points);
241
for (iv = 0; iv < points; iv++)
243
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
245
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
247
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
249
m = gaiaImport64 (geo->blob + (geo->offset + 24), geo->endian,
251
gaiaSetPointXYZM (line->Coords, iv, x, y, z, m);
257
ParseWkbPolygon (gaiaGeomCollPtr geo)
259
/* decodes a POLYGON from WKB */
266
gaiaPolygonPtr polyg = NULL;
268
if (geo->size < geo->offset + 4)
271
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
273
for (ib = 0; ib < rings; ib++)
275
if (geo->size < geo->offset + 4)
278
gaiaImport32 (geo->blob + geo->offset, geo->endian,
281
if (geo->size < geo->offset + (16 * nverts))
285
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
286
ring = polyg->Exterior;
289
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
290
for (iv = 0; iv < nverts; iv++)
292
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
294
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
297
gaiaSetPoint (ring->Coords, iv, x, y);
303
ParseWkbPolygonZ (gaiaGeomCollPtr geo)
305
/* decodes a POLYGONZ from WKB */
313
gaiaPolygonPtr polyg = NULL;
315
if (geo->size < geo->offset + 4)
318
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
320
for (ib = 0; ib < rings; ib++)
322
if (geo->size < geo->offset + 4)
325
gaiaImport32 (geo->blob + geo->offset, geo->endian,
328
if (geo->size < geo->offset + (24 * nverts))
332
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
333
ring = polyg->Exterior;
336
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
337
for (iv = 0; iv < nverts; iv++)
339
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
341
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
343
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
346
gaiaSetPointXYZ (ring->Coords, iv, x, y, z);
352
ParseWkbPolygonM (gaiaGeomCollPtr geo)
354
/* decodes a POLYGONM from WKB */
362
gaiaPolygonPtr polyg = NULL;
364
if (geo->size < geo->offset + 4)
367
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
369
for (ib = 0; ib < rings; ib++)
371
if (geo->size < geo->offset + 4)
374
gaiaImport32 (geo->blob + geo->offset, geo->endian,
377
if (geo->size < geo->offset + (24 * nverts))
381
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
382
ring = polyg->Exterior;
385
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
386
for (iv = 0; iv < nverts; iv++)
388
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
390
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
392
m = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
395
gaiaSetPointXYM (ring->Coords, iv, x, y, m);
401
ParseWkbPolygonZM (gaiaGeomCollPtr geo)
403
/* decodes a POLYGONZM from WKB */
412
gaiaPolygonPtr polyg = NULL;
414
if (geo->size < geo->offset + 4)
417
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
419
for (ib = 0; ib < rings; ib++)
421
if (geo->size < geo->offset + 4)
424
gaiaImport32 (geo->blob + geo->offset, geo->endian,
427
if (geo->size < geo->offset + (32 * nverts))
431
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
432
ring = polyg->Exterior;
435
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
436
for (iv = 0; iv < nverts; iv++)
438
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
440
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
442
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
444
m = gaiaImport64 (geo->blob + (geo->offset + 24), geo->endian,
447
gaiaSetPointXYZM (ring->Coords, iv, x, y, z, m);
453
ParseCompressedWkbLine (gaiaGeomCollPtr geo)
455
/* decodes a COMPRESSED LINESTRING from WKB */
464
gaiaLinestringPtr line;
465
if (geo->size < geo->offset + 4)
468
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
470
if (geo->size < geo->offset + (8 * points) + 16)
472
line = gaiaAddLinestringToGeomColl (geo, points);
473
for (iv = 0; iv < points; iv++)
475
if (iv == 0 || iv == (points - 1))
477
/* first and last vertices are uncompressed */
478
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
480
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
486
/* any other intermediate vertex is compressed */
487
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
489
fy = gaiaImportF32 (geo->blob + (geo->offset + 4), geo->endian,
495
gaiaSetPoint (line->Coords, iv, x, y);
502
ParseCompressedWkbLineZ (gaiaGeomCollPtr geo)
504
/* decodes a COMPRESSED LINESTRINGZ from WKB */
516
gaiaLinestringPtr line;
517
if (geo->size < geo->offset + 4)
520
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
522
if (geo->size < geo->offset + (12 * points) + 24)
524
line = gaiaAddLinestringToGeomColl (geo, points);
525
for (iv = 0; iv < points; iv++)
527
if (iv == 0 || iv == (points - 1))
529
/* first and last vertices are uncompressed */
530
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
532
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
534
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
540
/* any other intermediate vertex is compressed */
541
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
543
fy = gaiaImportF32 (geo->blob + (geo->offset + 4), geo->endian,
545
fz = gaiaImportF32 (geo->blob + (geo->offset + 8), geo->endian,
552
gaiaSetPointXYZ (line->Coords, iv, x, y, z);
560
ParseCompressedWkbLineM (gaiaGeomCollPtr geo)
562
/* decodes a COMPRESSED LINESTRINGM from WKB */
572
gaiaLinestringPtr line;
573
if (geo->size < geo->offset + 4)
576
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
578
if (geo->size < geo->offset + (16 * points) + 16)
580
line = gaiaAddLinestringToGeomColl (geo, points);
581
for (iv = 0; iv < points; iv++)
583
if (iv == 0 || iv == (points - 1))
585
/* first and last vertices are uncompressed */
586
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
588
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
590
m = gaiaImport64 (geo->blob + (geo->offset + 24), geo->endian,
596
/* any other intermediate vertex is compressed */
597
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
599
fy = gaiaImportF32 (geo->blob + (geo->offset + 4), geo->endian,
601
m = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
607
gaiaSetPointXYM (line->Coords, iv, x, y, m);
614
ParseCompressedWkbLineZM (gaiaGeomCollPtr geo)
616
/* decodes a COMPRESSED LINESTRINGZM from WKB */
629
gaiaLinestringPtr line;
630
if (geo->size < geo->offset + 4)
633
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
635
if (geo->size < geo->offset + (20 * points) + 24)
637
line = gaiaAddLinestringToGeomColl (geo, points);
638
for (iv = 0; iv < points; iv++)
640
if (iv == 0 || iv == (points - 1))
642
/* first and last vertices are uncompressed */
643
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
645
y = gaiaImport64 (geo->blob + (geo->offset + 8), geo->endian,
647
z = gaiaImport64 (geo->blob + (geo->offset + 16), geo->endian,
649
m = gaiaImport64 (geo->blob + (geo->offset + 24), geo->endian,
655
/* any other intermediate vertex is compressed */
656
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
658
fy = gaiaImportF32 (geo->blob + (geo->offset + 4), geo->endian,
660
fz = gaiaImportF32 (geo->blob + (geo->offset + 8), geo->endian,
662
m = gaiaImport64 (geo->blob + (geo->offset + 12), geo->endian,
669
gaiaSetPointXYZM (line->Coords, iv, x, y, z, m);
677
ParseCompressedWkbPolygon (gaiaGeomCollPtr geo)
679
/* decodes a COMPRESSED POLYGON from WKB */
690
gaiaPolygonPtr polyg = NULL;
692
if (geo->size < geo->offset + 4)
695
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
697
for (ib = 0; ib < rings; ib++)
699
if (geo->size < geo->offset + 4)
702
gaiaImport32 (geo->blob + geo->offset, geo->endian,
705
if (geo->size < geo->offset + (8 * nverts) + 16)
709
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
710
ring = polyg->Exterior;
713
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
714
for (iv = 0; iv < nverts; iv++)
716
if (iv == 0 || iv == (nverts - 1))
718
/* first and last vertices are uncompressed */
719
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
721
y = gaiaImport64 (geo->blob + (geo->offset + 8),
722
geo->endian, geo->endian_arch);
727
/* any other intermediate vertex is compressed */
728
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
730
fy = gaiaImportF32 (geo->blob + (geo->offset + 4),
731
geo->endian, geo->endian_arch);
736
gaiaSetPoint (ring->Coords, iv, x, y);
744
ParseCompressedWkbPolygonZ (gaiaGeomCollPtr geo)
746
/* decodes a COMPRESSED POLYGONZ from WKB */
760
gaiaPolygonPtr polyg = NULL;
762
if (geo->size < geo->offset + 4)
765
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
767
for (ib = 0; ib < rings; ib++)
769
if (geo->size < geo->offset + 4)
772
gaiaImport32 (geo->blob + geo->offset, geo->endian,
775
if (geo->size < geo->offset + (12 * nverts) + 24)
779
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
780
ring = polyg->Exterior;
783
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
784
for (iv = 0; iv < nverts; iv++)
786
if (iv == 0 || iv == (nverts - 1))
788
/* first and last vertices are uncompressed */
789
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
791
y = gaiaImport64 (geo->blob + (geo->offset + 8),
792
geo->endian, geo->endian_arch);
793
z = gaiaImport64 (geo->blob + (geo->offset + 16),
794
geo->endian, geo->endian_arch);
799
/* any other intermediate vertex is compressed */
800
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
802
fy = gaiaImportF32 (geo->blob + (geo->offset + 4),
803
geo->endian, geo->endian_arch);
804
fz = gaiaImportF32 (geo->blob + (geo->offset + 8),
805
geo->endian, geo->endian_arch);
811
gaiaSetPointXYZ (ring->Coords, iv, x, y, z);
820
ParseCompressedWkbPolygonM (gaiaGeomCollPtr geo)
822
/* decodes a COMPRESSED POLYGONM from WKB */
834
gaiaPolygonPtr polyg = NULL;
836
if (geo->size < geo->offset + 4)
839
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
841
for (ib = 0; ib < rings; ib++)
843
if (geo->size < geo->offset + 4)
846
gaiaImport32 (geo->blob + geo->offset, geo->endian,
849
if (geo->size < geo->offset + (16 * nverts) + 16)
853
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
854
ring = polyg->Exterior;
857
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
858
for (iv = 0; iv < nverts; iv++)
860
if (iv == 0 || iv == (nverts - 1))
862
/* first and last vertices are uncompressed */
863
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
865
y = gaiaImport64 (geo->blob + (geo->offset + 8),
866
geo->endian, geo->endian_arch);
867
m = gaiaImport64 (geo->blob + (geo->offset + 24),
868
geo->endian, geo->endian_arch);
873
/* any other intermediate vertex is compressed */
874
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
876
fy = gaiaImportF32 (geo->blob + (geo->offset + 4),
877
geo->endian, geo->endian_arch);
878
m = gaiaImport64 (geo->blob + (geo->offset + 8),
879
geo->endian, geo->endian_arch);
884
gaiaSetPointXYM (ring->Coords, iv, x, y, m);
892
ParseCompressedWkbPolygonZM (gaiaGeomCollPtr geo)
894
/* decodes a COMPRESSED POLYGONZM from WKB */
909
gaiaPolygonPtr polyg = NULL;
911
if (geo->size < geo->offset + 4)
914
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
916
for (ib = 0; ib < rings; ib++)
918
if (geo->size < geo->offset + 4)
921
gaiaImport32 (geo->blob + geo->offset, geo->endian,
924
if (geo->size < geo->offset + (20 * nverts) + 24)
928
polyg = gaiaAddPolygonToGeomColl (geo, nverts, rings - 1);
929
ring = polyg->Exterior;
932
ring = gaiaAddInteriorRing (polyg, ib - 1, nverts);
933
for (iv = 0; iv < nverts; iv++)
935
if (iv == 0 || iv == (nverts - 1))
937
/* first and last vertices are uncompressed */
938
x = gaiaImport64 (geo->blob + geo->offset, geo->endian,
940
y = gaiaImport64 (geo->blob + (geo->offset + 8),
941
geo->endian, geo->endian_arch);
942
z = gaiaImport64 (geo->blob + (geo->offset + 16),
943
geo->endian, geo->endian_arch);
944
m = gaiaImport64 (geo->blob + (geo->offset + 24),
945
geo->endian, geo->endian_arch);
950
/* any other intermediate vertex is compressed */
951
fx = gaiaImportF32 (geo->blob + geo->offset, geo->endian,
953
fy = gaiaImportF32 (geo->blob + (geo->offset + 4),
954
geo->endian, geo->endian_arch);
955
fz = gaiaImportF32 (geo->blob + (geo->offset + 8),
956
geo->endian, geo->endian_arch);
957
m = gaiaImport64 (geo->blob + (geo->offset + 12),
958
geo->endian, geo->endian_arch);
964
gaiaSetPointXYZM (ring->Coords, iv, x, y, z, m);
973
ParseWkbGeometry (gaiaGeomCollPtr geo)
975
/* decodes a MULTIxx or GEOMETRYCOLLECTION from SpatiaLite BLOB */
979
if (geo->size < geo->offset + 4)
982
gaiaImport32 (geo->blob + geo->offset, geo->endian, geo->endian_arch);
984
for (ie = 0; ie < entities; ie++)
986
if (geo->size < geo->offset + 5)
989
gaiaImport32 (geo->blob + geo->offset + 1, geo->endian,
998
case GAIA_GEOSWKB_POINTZ:
999
ParseWkbPointZ (geo);
1002
ParseWkbPointM (geo);
1005
ParseWkbPointZM (geo);
1007
case GAIA_LINESTRING:
1010
case GAIA_LINESTRINGZ:
1011
case GAIA_GEOSWKB_LINESTRINGZ:
1012
ParseWkbLineZ (geo);
1014
case GAIA_LINESTRINGM:
1015
ParseWkbLineM (geo);
1017
case GAIA_LINESTRINGZM:
1018
ParseWkbLineZM (geo);
1021
ParseWkbPolygon (geo);
1024
case GAIA_GEOSWKB_POLYGONZ:
1025
ParseWkbPolygonZ (geo);
1028
ParseWkbPolygonM (geo);
1030
case GAIA_POLYGONZM:
1031
ParseWkbPolygonZM (geo);
1033
case GAIA_COMPRESSED_LINESTRING:
1034
ParseCompressedWkbLine (geo);
1036
case GAIA_COMPRESSED_LINESTRINGZ:
1037
ParseCompressedWkbLineZ (geo);
1039
case GAIA_COMPRESSED_LINESTRINGM:
1040
ParseCompressedWkbLineM (geo);
1042
case GAIA_COMPRESSED_LINESTRINGZM:
1043
ParseCompressedWkbLineZM (geo);
1045
case GAIA_COMPRESSED_POLYGON:
1046
ParseCompressedWkbPolygon (geo);
1048
case GAIA_COMPRESSED_POLYGONZ:
1049
ParseCompressedWkbPolygonZ (geo);
1051
case GAIA_COMPRESSED_POLYGONM:
1052
ParseCompressedWkbPolygonM (geo);
1054
case GAIA_COMPRESSED_POLYGONZM:
1055
ParseCompressedWkbPolygonZM (geo);
1063
GAIAGEO_DECLARE gaiaGeomCollPtr
1064
gaiaFromSpatiaLiteBlobWkb (const unsigned char *blob, unsigned int size)
1066
/* decoding from SpatiaLite BLOB to GEOMETRY */
1069
int endian_arch = gaiaEndianArch ();
1070
gaiaGeomCollPtr geo = NULL;
1072
return NULL; /* cannot be an internal BLOB WKB geometry */
1073
if (*(blob + 0) != GAIA_MARK_START)
1074
return NULL; /* failed to recognize START signature */
1075
if (*(blob + (size - 1)) != GAIA_MARK_END)
1076
return NULL; /* failed to recognize END signature */
1077
if (*(blob + 38) != GAIA_MARK_MBR)
1078
return NULL; /* failed to recognize MBR signature */
1079
if (*(blob + 1) == GAIA_LITTLE_ENDIAN)
1081
else if (*(blob + 1) == GAIA_BIG_ENDIAN)
1084
return NULL; /* unknown encoding; nor litte-endian neither big-endian */
1085
type = gaiaImport32 (blob + 39, little_endian, endian_arch);
1086
geo = gaiaAllocGeomColl ();
1087
geo->Srid = gaiaImport32 (blob + 2, little_endian, endian_arch);
1088
geo->endian_arch = (char) endian_arch;
1089
geo->endian = (char) little_endian;
1095
/* setting up DimensionModel */
1097
case GAIA_LINESTRINGZ:
1099
case GAIA_MULTIPOINTZ:
1100
case GAIA_MULTILINESTRINGZ:
1101
case GAIA_MULTIPOLYGONZ:
1102
case GAIA_GEOMETRYCOLLECTIONZ:
1103
case GAIA_COMPRESSED_LINESTRINGZ:
1104
case GAIA_COMPRESSED_POLYGONZ:
1105
geo->DimensionModel = GAIA_XY_Z;
1108
case GAIA_LINESTRINGM:
1110
case GAIA_MULTIPOINTM:
1111
case GAIA_MULTILINESTRINGM:
1112
case GAIA_MULTIPOLYGONM:
1113
case GAIA_GEOMETRYCOLLECTIONM:
1114
case GAIA_COMPRESSED_LINESTRINGM:
1115
case GAIA_COMPRESSED_POLYGONM:
1116
geo->DimensionModel = GAIA_XY_M;
1119
case GAIA_LINESTRINGZM:
1120
case GAIA_POLYGONZM:
1121
case GAIA_MULTIPOINTZM:
1122
case GAIA_MULTILINESTRINGZM:
1123
case GAIA_MULTIPOLYGONZM:
1124
case GAIA_GEOMETRYCOLLECTIONZM:
1125
case GAIA_COMPRESSED_LINESTRINGZM:
1126
case GAIA_COMPRESSED_POLYGONZM:
1127
geo->DimensionModel = GAIA_XY_Z_M;
1130
geo->DimensionModel = GAIA_XY;
1135
/* parsing elementary geometries */
1137
ParseWkbPoint (geo);
1140
ParseWkbPointZ (geo);
1143
ParseWkbPointM (geo);
1146
ParseWkbPointZM (geo);
1148
case GAIA_LINESTRING:
1151
case GAIA_LINESTRINGZ:
1152
ParseWkbLineZ (geo);
1154
case GAIA_LINESTRINGM:
1155
ParseWkbLineM (geo);
1157
case GAIA_LINESTRINGZM:
1158
ParseWkbLineZM (geo);
1161
ParseWkbPolygon (geo);
1164
ParseWkbPolygonZ (geo);
1167
ParseWkbPolygonM (geo);
1169
case GAIA_POLYGONZM:
1170
ParseWkbPolygonZM (geo);
1172
case GAIA_COMPRESSED_LINESTRING:
1173
ParseCompressedWkbLine (geo);
1175
case GAIA_COMPRESSED_LINESTRINGZ:
1176
ParseCompressedWkbLineZ (geo);
1178
case GAIA_COMPRESSED_LINESTRINGM:
1179
ParseCompressedWkbLineM (geo);
1181
case GAIA_COMPRESSED_LINESTRINGZM:
1182
ParseCompressedWkbLineZM (geo);
1184
case GAIA_COMPRESSED_POLYGON:
1185
ParseCompressedWkbPolygon (geo);
1187
case GAIA_COMPRESSED_POLYGONZ:
1188
ParseCompressedWkbPolygonZ (geo);
1190
case GAIA_COMPRESSED_POLYGONM:
1191
ParseCompressedWkbPolygonM (geo);
1193
case GAIA_COMPRESSED_POLYGONZM:
1194
ParseCompressedWkbPolygonZM (geo);
1196
case GAIA_MULTIPOINT:
1197
case GAIA_MULTIPOINTZ:
1198
case GAIA_MULTIPOINTM:
1199
case GAIA_MULTIPOINTZM:
1200
case GAIA_MULTILINESTRING:
1201
case GAIA_MULTILINESTRINGZ:
1202
case GAIA_MULTILINESTRINGM:
1203
case GAIA_MULTILINESTRINGZM:
1204
case GAIA_MULTIPOLYGON:
1205
case GAIA_MULTIPOLYGONZ:
1206
case GAIA_MULTIPOLYGONM:
1207
case GAIA_MULTIPOLYGONZM:
1208
case GAIA_GEOMETRYCOLLECTION:
1209
case GAIA_GEOMETRYCOLLECTIONZ:
1210
case GAIA_GEOMETRYCOLLECTIONM:
1211
case GAIA_GEOMETRYCOLLECTIONZM:
1212
ParseWkbGeometry (geo);
1217
geo->MinX = gaiaImport64 (blob + 6, little_endian, endian_arch);
1218
geo->MinY = gaiaImport64 (blob + 14, little_endian, endian_arch);
1219
geo->MaxX = gaiaImport64 (blob + 22, little_endian, endian_arch);
1220
geo->MaxY = gaiaImport64 (blob + 30, little_endian, endian_arch);
1223
/* setting up DeclaredType */
1228
geo->DeclaredType = GAIA_POINT;
1230
case GAIA_LINESTRING:
1231
case GAIA_LINESTRINGZ:
1232
case GAIA_LINESTRINGM:
1233
case GAIA_LINESTRINGZM:
1234
case GAIA_COMPRESSED_LINESTRING:
1235
case GAIA_COMPRESSED_LINESTRINGZ:
1236
case GAIA_COMPRESSED_LINESTRINGM:
1237
case GAIA_COMPRESSED_LINESTRINGZM:
1238
geo->DeclaredType = GAIA_LINESTRING;
1243
case GAIA_POLYGONZM:
1244
case GAIA_COMPRESSED_POLYGON:
1245
case GAIA_COMPRESSED_POLYGONZ:
1246
case GAIA_COMPRESSED_POLYGONM:
1247
case GAIA_COMPRESSED_POLYGONZM:
1248
geo->DeclaredType = GAIA_POLYGON;
1250
case GAIA_MULTIPOINT:
1251
case GAIA_MULTIPOINTZ:
1252
case GAIA_MULTIPOINTM:
1253
case GAIA_MULTIPOINTZM:
1254
geo->DeclaredType = GAIA_MULTIPOINT;
1256
case GAIA_MULTILINESTRING:
1257
case GAIA_MULTILINESTRINGZ:
1258
case GAIA_MULTILINESTRINGM:
1259
case GAIA_MULTILINESTRINGZM:
1260
geo->DeclaredType = GAIA_MULTILINESTRING;
1262
case GAIA_MULTIPOLYGON:
1263
case GAIA_MULTIPOLYGONZ:
1264
case GAIA_MULTIPOLYGONM:
1265
case GAIA_MULTIPOLYGONZM:
1266
geo->DeclaredType = GAIA_MULTIPOLYGON;
1268
case GAIA_GEOMETRYCOLLECTION:
1269
case GAIA_GEOMETRYCOLLECTIONZ:
1270
case GAIA_GEOMETRYCOLLECTIONM:
1271
case GAIA_GEOMETRYCOLLECTIONZM:
1272
geo->DeclaredType = GAIA_GEOMETRYCOLLECTION;
1275
geo->DeclaredType = GAIA_UNKNOWN;
1281
GAIAGEO_DECLARE gaiaGeomCollPtr
1282
gaiaFromSpatiaLiteBlobMbr (const unsigned char *blob, unsigned int size)
1284
/* decoding from SpatiaLite BLOB to GEOMETRY [MBR only] */
1287
int endian_arch = gaiaEndianArch ();
1292
gaiaGeomCollPtr geo = NULL;
1293
gaiaPolygonPtr polyg;
1296
return NULL; /* cannot be an internal BLOB WKB geometry */
1297
if (*(blob + 0) != GAIA_MARK_START)
1298
return NULL; /* failed to recognize START signature */
1299
if (*(blob + (size - 1)) != GAIA_MARK_END)
1300
return NULL; /* failed to recognize END signature */
1301
if (*(blob + 38) != GAIA_MARK_MBR)
1302
return NULL; /* failed to recognize MBR signature */
1303
if (*(blob + 1) == GAIA_LITTLE_ENDIAN)
1305
else if (*(blob + 1) == GAIA_BIG_ENDIAN)
1308
return NULL; /* unknown encoding; nor litte-endian neither big-endian */
1309
type = gaiaImport32 (blob + 39, little_endian, endian_arch);
1310
geo = gaiaAllocGeomColl ();
1311
polyg = gaiaAddPolygonToGeomColl (geo, 5, 0);
1312
ring = polyg->Exterior;
1313
minx = gaiaImport64 (blob + 6, little_endian, endian_arch);
1314
miny = gaiaImport64 (blob + 14, little_endian, endian_arch);
1315
maxx = gaiaImport64 (blob + 22, little_endian, endian_arch);
1316
maxy = gaiaImport64 (blob + 30, little_endian, endian_arch);
1317
gaiaSetPoint (ring->Coords, 0, minx, miny); /* vertex # 1 */
1318
gaiaSetPoint (ring->Coords, 1, maxx, miny); /* vertex # 2 */
1319
gaiaSetPoint (ring->Coords, 2, maxx, maxy); /* vertex # 3 */
1320
gaiaSetPoint (ring->Coords, 3, minx, maxy); /* vertex # 4 */
1321
gaiaSetPoint (ring->Coords, 4, minx, miny); /* vertex # 5 [same as vertex # 1 to close the polygon] */
1325
GAIAGEO_DECLARE void
1326
gaiaToSpatiaLiteBlobWkb (gaiaGeomCollPtr geom, unsigned char **result,
1329
/* builds the SpatiaLite BLOB representation for this GEOMETRY */
1338
int n_linestrings = 0;
1343
gaiaLinestringPtr ln;
1346
gaiaPointPtr point = NULL;
1347
gaiaLinestringPtr line = NULL;
1348
gaiaPolygonPtr polyg = NULL;
1349
int endian_arch = gaiaEndianArch ();
1350
gaiaMbrGeometry (geom);
1351
/* how many entities, and of what kind, do we have ? */
1352
pt = geom->FirstPoint;
1360
ln = geom->FirstLinestring;
1368
pg = geom->FirstPolygon;
1378
if (n_points == 0 && n_polygons == 0 && n_linestrings == 0)
1380
/* ok, we can determine the geometry class */
1381
if (n_points == 1 && n_linestrings == 0 && n_polygons == 0)
1383
if (geom->DeclaredType == GAIA_MULTIPOINT)
1385
if (geom->DimensionModel == GAIA_XY_Z)
1386
type = GAIA_MULTIPOINTZ;
1387
else if (geom->DimensionModel == GAIA_XY_M)
1388
type = GAIA_MULTIPOINTM;
1389
else if (geom->DimensionModel == GAIA_XY_Z_M)
1390
type = GAIA_MULTIPOINTZM;
1392
type = GAIA_MULTIPOINT;
1394
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
1396
if (geom->DimensionModel == GAIA_XY_Z)
1397
type = GAIA_GEOMETRYCOLLECTIONZ;
1398
else if (geom->DimensionModel == GAIA_XY_M)
1399
type = GAIA_GEOMETRYCOLLECTIONM;
1400
else if (geom->DimensionModel == GAIA_XY_Z_M)
1401
type = GAIA_GEOMETRYCOLLECTIONZM;
1403
type = GAIA_GEOMETRYCOLLECTION;
1407
if (geom->DimensionModel == GAIA_XY_Z)
1409
else if (geom->DimensionModel == GAIA_XY_M)
1411
else if (geom->DimensionModel == GAIA_XY_Z_M)
1412
type = GAIA_POINTZM;
1417
else if (n_points > 1 && n_linestrings == 0 && n_polygons == 0)
1419
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
1421
if (geom->DimensionModel == GAIA_XY_Z)
1422
type = GAIA_GEOMETRYCOLLECTIONZ;
1423
else if (geom->DimensionModel == GAIA_XY_M)
1424
type = GAIA_GEOMETRYCOLLECTIONM;
1425
else if (geom->DimensionModel == GAIA_XY_Z_M)
1426
type = GAIA_GEOMETRYCOLLECTIONZM;
1428
type = GAIA_GEOMETRYCOLLECTION;
1432
if (geom->DimensionModel == GAIA_XY_Z)
1433
type = GAIA_MULTIPOINTZ;
1434
else if (geom->DimensionModel == GAIA_XY_M)
1435
type = GAIA_MULTIPOINTM;
1436
else if (geom->DimensionModel == GAIA_XY_Z_M)
1437
type = GAIA_MULTIPOINTZM;
1439
type = GAIA_MULTIPOINT;
1442
else if (n_points == 0 && n_linestrings == 1 && n_polygons == 0)
1444
if (geom->DeclaredType == GAIA_MULTILINESTRING)
1446
if (geom->DimensionModel == GAIA_XY_Z)
1447
type = GAIA_MULTILINESTRINGZ;
1448
else if (geom->DimensionModel == GAIA_XY_M)
1449
type = GAIA_MULTILINESTRINGM;
1450
else if (geom->DimensionModel == GAIA_XY_Z_M)
1451
type = GAIA_MULTILINESTRINGZM;
1453
type = GAIA_MULTILINESTRING;
1455
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
1457
if (geom->DimensionModel == GAIA_XY_Z)
1458
type = GAIA_GEOMETRYCOLLECTIONZ;
1459
else if (geom->DimensionModel == GAIA_XY_M)
1460
type = GAIA_GEOMETRYCOLLECTIONM;
1461
else if (geom->DimensionModel == GAIA_XY_Z_M)
1462
type = GAIA_GEOMETRYCOLLECTIONZM;
1464
type = GAIA_GEOMETRYCOLLECTION;
1468
if (geom->DimensionModel == GAIA_XY_Z)
1469
type = GAIA_LINESTRINGZ;
1470
else if (geom->DimensionModel == GAIA_XY_M)
1471
type = GAIA_LINESTRINGM;
1472
else if (geom->DimensionModel == GAIA_XY_Z_M)
1473
type = GAIA_LINESTRINGZM;
1475
type = GAIA_LINESTRING;
1478
else if (n_points == 0 && n_linestrings > 1 && n_polygons == 0)
1480
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
1482
if (geom->DimensionModel == GAIA_XY_Z)
1483
type = GAIA_GEOMETRYCOLLECTIONZ;
1484
else if (geom->DimensionModel == GAIA_XY_M)
1485
type = GAIA_GEOMETRYCOLLECTIONM;
1486
else if (geom->DimensionModel == GAIA_XY_Z_M)
1487
type = GAIA_GEOMETRYCOLLECTIONZM;
1489
type = GAIA_GEOMETRYCOLLECTION;
1493
if (geom->DimensionModel == GAIA_XY_Z)
1494
type = GAIA_MULTILINESTRINGZ;
1495
else if (geom->DimensionModel == GAIA_XY_M)
1496
type = GAIA_MULTILINESTRINGM;
1497
else if (geom->DimensionModel == GAIA_XY_Z_M)
1498
type = GAIA_MULTILINESTRINGZM;
1500
type = GAIA_MULTILINESTRING;
1503
else if (n_points == 0 && n_linestrings == 0 && n_polygons == 1)
1505
if (geom->DeclaredType == GAIA_MULTIPOLYGON)
1507
if (geom->DimensionModel == GAIA_XY_Z)
1508
type = GAIA_MULTIPOLYGONZ;
1509
else if (geom->DimensionModel == GAIA_XY_M)
1510
type = GAIA_MULTIPOLYGONM;
1511
else if (geom->DimensionModel == GAIA_XY_Z_M)
1512
type = GAIA_MULTIPOLYGONZM;
1514
type = GAIA_MULTIPOLYGON;
1516
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
1518
if (geom->DimensionModel == GAIA_XY_Z)
1519
type = GAIA_GEOMETRYCOLLECTIONZ;
1520
else if (geom->DimensionModel == GAIA_XY_M)
1521
type = GAIA_GEOMETRYCOLLECTIONM;
1522
else if (geom->DimensionModel == GAIA_XY_Z_M)
1523
type = GAIA_GEOMETRYCOLLECTIONZM;
1525
type = GAIA_GEOMETRYCOLLECTION;
1529
if (geom->DimensionModel == GAIA_XY_Z)
1530
type = GAIA_POLYGONZ;
1531
else if (geom->DimensionModel == GAIA_XY_M)
1532
type = GAIA_POLYGONM;
1533
else if (geom->DimensionModel == GAIA_XY_Z_M)
1534
type = GAIA_POLYGONZM;
1536
type = GAIA_POLYGON;
1539
else if (n_points == 0 && n_linestrings == 0 && n_polygons > 1)
1541
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
1543
if (geom->DimensionModel == GAIA_XY_Z)
1544
type = GAIA_GEOMETRYCOLLECTIONZ;
1545
else if (geom->DimensionModel == GAIA_XY_M)
1546
type = GAIA_GEOMETRYCOLLECTIONM;
1547
else if (geom->DimensionModel == GAIA_XY_Z_M)
1548
type = GAIA_GEOMETRYCOLLECTIONZM;
1550
type = GAIA_GEOMETRYCOLLECTION;
1554
if (geom->DimensionModel == GAIA_XY_Z)
1555
type = GAIA_MULTIPOLYGONZ;
1556
else if (geom->DimensionModel == GAIA_XY_M)
1557
type = GAIA_MULTIPOLYGONM;
1558
else if (geom->DimensionModel == GAIA_XY_Z_M)
1559
type = GAIA_MULTIPOLYGONZM;
1561
type = GAIA_MULTIPOLYGON;
1566
if (geom->DimensionModel == GAIA_XY_Z)
1567
type = GAIA_GEOMETRYCOLLECTIONZ;
1568
else if (geom->DimensionModel == GAIA_XY_M)
1569
type = GAIA_GEOMETRYCOLLECTIONM;
1570
else if (geom->DimensionModel == GAIA_XY_Z_M)
1571
type = GAIA_GEOMETRYCOLLECTIONZM;
1573
type = GAIA_GEOMETRYCOLLECTION;
1575
/* and now we compute the size of BLOB */
1576
*size = 44; /* header size */
1580
*size += (sizeof (double) * 2); /* [x,y] coords */
1583
*size += (sizeof (double) * 3); /* [x,y,z] coords */
1586
*size += (sizeof (double) * 3); /* [x,y,m] coords */
1589
*size += (sizeof (double) * 4); /* [x,y,z,m] coords */
1591
case GAIA_LINESTRING:
1592
*size += (4 + ((sizeof (double) * 2) * line->Points)); /* # points + [x,y] for each vertex */
1594
case GAIA_LINESTRINGZ:
1595
*size += (4 + ((sizeof (double) * 3) * line->Points)); /* # points + [x,y,z] for each vertex */
1597
case GAIA_LINESTRINGM:
1598
*size += (4 + ((sizeof (double) * 3) * line->Points)); /* # points + [x,y,m] for each vertex */
1600
case GAIA_LINESTRINGZM:
1601
*size += (4 + ((sizeof (double) * 4) * line->Points)); /* # points + [x,y,z,m] for each vertex */
1604
rng = polyg->Exterior;
1605
*size += (8 + ((sizeof (double) * 2) * rng->Points)); /* # rings + # points + [x.y] array - exterior ring */
1606
for (ib = 0; ib < polyg->NumInteriors; ib++)
1608
rng = polyg->Interiors + ib;
1609
*size += (4 + ((sizeof (double) * 2) * rng->Points)); /* # points + [x,y] array - interior ring */
1613
rng = polyg->Exterior;
1614
*size += (8 + ((sizeof (double) * 3) * rng->Points)); /* # rings + # points + [x,y,z] array - exterior ring */
1615
for (ib = 0; ib < polyg->NumInteriors; ib++)
1617
rng = polyg->Interiors + ib;
1618
*size += (4 + ((sizeof (double) * 3) * rng->Points)); /* # points + [x,y,z] array - interior ring */
1622
rng = polyg->Exterior;
1623
*size += (8 + ((sizeof (double) * 3) * rng->Points)); /* # rings + # points + [x,y,m] array - exterior ring */
1624
for (ib = 0; ib < polyg->NumInteriors; ib++)
1626
rng = polyg->Interiors + ib;
1627
*size += (4 + ((sizeof (double) * 3) * rng->Points)); /* # points + [x,y,m] array - interior ring */
1630
case GAIA_POLYGONZM:
1631
rng = polyg->Exterior;
1632
*size += (8 + ((sizeof (double) * 4) * rng->Points)); /* # rings + # points + [x,y,z,m] array - exterior ring */
1633
for (ib = 0; ib < polyg->NumInteriors; ib++)
1635
rng = polyg->Interiors + ib;
1636
*size += (4 + ((sizeof (double) * 4) * rng->Points)); /* # points + [x,y,z,m] array - interior ring */
1640
/* this one is not a simple geometry; should be a MULTIxxxx or a GEOMETRYCOLLECTION */
1641
*size += 4; /* # entities */
1642
point = geom->FirstPoint;
1645
*size += 5; /* entity header */
1646
if (geom->DimensionModel == GAIA_XY_Z
1647
|| geom->DimensionModel == GAIA_XY_M)
1648
*size += (sizeof (double) * 3); /* three doubles for each POINT */
1649
else if (geom->DimensionModel == GAIA_XY_Z_M)
1650
*size += (sizeof (double) * 4); /* four doubles for each POINT */
1652
*size += (sizeof (double) * 2); /* two doubles for each POINT */
1653
point = point->Next;
1655
line = geom->FirstLinestring;
1658
*size += 5; /* entity header */
1659
if (geom->DimensionModel == GAIA_XY_Z
1660
|| geom->DimensionModel == GAIA_XY_M)
1661
*size += (4 + ((sizeof (double) * 3) * line->Points)); /* # points + [x,y,z] for each vertex */
1662
else if (geom->DimensionModel == GAIA_XY_Z_M)
1663
*size += (4 + ((sizeof (double) * 4) * line->Points)); /* # points + [x,y,z,m] for each vertex */
1665
*size += (4 + ((sizeof (double) * 2) * line->Points)); /* # points + [x,y] for each vertex */
1668
polyg = geom->FirstPolygon;
1671
*size += 5; /* entity header */
1672
rng = polyg->Exterior;
1673
if (geom->DimensionModel == GAIA_XY_Z
1674
|| geom->DimensionModel == GAIA_XY_M)
1675
*size += (8 + ((sizeof (double) * 3) * rng->Points)); /* # rings + # points + [x,y,z] array - exterior ring */
1676
else if (geom->DimensionModel == GAIA_XY_Z_M)
1677
*size += (8 + ((sizeof (double) * 4) * rng->Points)); /* # rings + # points + [x,y,z,m] array - exterior ring */
1679
*size += (8 + ((sizeof (double) * 2) * rng->Points)); /* # rings + # points + [x,y] array - exterior ring */
1680
for (ib = 0; ib < polyg->NumInteriors; ib++)
1682
rng = polyg->Interiors + ib;
1683
if (geom->DimensionModel == GAIA_XY_Z
1684
|| geom->DimensionModel == GAIA_XY_M)
1685
*size += (4 + ((sizeof (double) * 3) * rng->Points)); /* # points + [x,y,z] array - interior ring */
1686
else if (geom->DimensionModel == GAIA_XY_Z_M)
1687
*size += (4 + ((sizeof (double) * 4) * rng->Points)); /* # points + [x,y,z,m] array - interior ring */
1689
*size += (4 + ((sizeof (double) * 2) * rng->Points)); /* # points + [x,y] array - interior ring */
1691
polyg = polyg->Next;
1694
*result = malloc (*size);
1696
/* and finally we build the BLOB */
1700
*ptr = GAIA_MARK_START; /* START signature */
1701
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1702
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1703
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1704
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1705
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1706
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1707
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1708
gaiaExport32 (ptr + 39, GAIA_POINT, 1, endian_arch); /* class POINT */
1709
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
1710
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
1711
*(ptr + 59) = GAIA_MARK_END; /* END signature */
1714
*ptr = GAIA_MARK_START; /* START signature */
1715
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1716
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1717
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1718
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1719
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1720
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1721
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1722
gaiaExport32 (ptr + 39, GAIA_POINTZ, 1, endian_arch); /* class POINT XYZ */
1723
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
1724
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
1725
gaiaExport64 (ptr + 59, point->Z, 1, endian_arch); /* Z */
1726
*(ptr + 67) = GAIA_MARK_END; /* END signature */
1729
*ptr = GAIA_MARK_START; /* START signature */
1730
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1731
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1732
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1733
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1734
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1735
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1736
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1737
gaiaExport32 (ptr + 39, GAIA_POINTM, 1, endian_arch); /* class POINT XYM */
1738
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
1739
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
1740
gaiaExport64 (ptr + 59, point->M, 1, endian_arch); /* M */
1741
*(ptr + 67) = GAIA_MARK_END; /* END signature */
1744
*ptr = GAIA_MARK_START; /* START signature */
1745
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1746
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1747
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1748
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1749
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1750
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1751
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1752
gaiaExport32 (ptr + 39, GAIA_POINTZM, 1, endian_arch); /* class POINT XYZM */
1753
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
1754
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
1755
gaiaExport64 (ptr + 59, point->Z, 1, endian_arch); /* M */
1756
gaiaExport64 (ptr + 67, point->M, 1, endian_arch); /* Z */
1757
*(ptr + 75) = GAIA_MARK_END; /* END signature */
1759
case GAIA_LINESTRING:
1760
*ptr = GAIA_MARK_START; /* START signatue */
1761
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1762
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1763
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1764
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1765
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1766
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1767
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1768
gaiaExport32 (ptr + 39, GAIA_LINESTRING, 1, endian_arch); /* class LINESTRING */
1769
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
1771
for (iv = 0; iv < line->Points; iv++)
1773
gaiaGetPoint (line->Coords, iv, &x, &y);
1774
gaiaExport64 (ptr, x, 1, endian_arch);
1775
gaiaExport64 (ptr + 8, y, 1, endian_arch);
1778
*ptr = GAIA_MARK_END; /* END signature */
1780
case GAIA_LINESTRINGZ:
1781
*ptr = GAIA_MARK_START; /* START signatue */
1782
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1783
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1784
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1785
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1786
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1787
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1788
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1789
gaiaExport32 (ptr + 39, GAIA_LINESTRINGZ, 1, endian_arch); /* class LINESTRING XYZ */
1790
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
1792
for (iv = 0; iv < line->Points; iv++)
1794
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
1795
gaiaExport64 (ptr, x, 1, endian_arch);
1796
gaiaExport64 (ptr + 8, y, 1, endian_arch);
1797
gaiaExport64 (ptr + 16, z, 1, endian_arch);
1800
*ptr = GAIA_MARK_END; /* END signature */
1802
case GAIA_LINESTRINGM:
1803
*ptr = GAIA_MARK_START; /* START signatue */
1804
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1805
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1806
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1807
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1808
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1809
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1810
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1811
gaiaExport32 (ptr + 39, GAIA_LINESTRINGM, 1, endian_arch); /* class LINESTRING XYM */
1812
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
1814
for (iv = 0; iv < line->Points; iv++)
1816
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
1817
gaiaExport64 (ptr, x, 1, endian_arch);
1818
gaiaExport64 (ptr + 8, y, 1, endian_arch);
1819
gaiaExport64 (ptr + 16, m, 1, endian_arch);
1822
*ptr = GAIA_MARK_END; /* END signature */
1824
case GAIA_LINESTRINGZM:
1825
*ptr = GAIA_MARK_START; /* START signatue */
1826
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1827
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1828
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1829
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1830
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1831
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1832
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1833
gaiaExport32 (ptr + 39, GAIA_LINESTRINGZM, 1, endian_arch); /* class LINESTRING XYZM */
1834
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
1836
for (iv = 0; iv < line->Points; iv++)
1838
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
1839
gaiaExport64 (ptr, x, 1, endian_arch);
1840
gaiaExport64 (ptr + 8, y, 1, endian_arch);
1841
gaiaExport64 (ptr + 16, z, 1, endian_arch);
1842
gaiaExport64 (ptr + 24, m, 1, endian_arch);
1845
*ptr = GAIA_MARK_END; /* END signature */
1848
*ptr = GAIA_MARK_START; /* START signatue */
1849
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1850
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1851
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1852
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1853
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1854
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1855
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1856
gaiaExport32 (ptr + 39, GAIA_POLYGON, 1, endian_arch); /* class POLYGON */
1857
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
1858
rng = polyg->Exterior;
1859
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
1861
for (iv = 0; iv < rng->Points; iv++)
1863
gaiaGetPoint (rng->Coords, iv, &x, &y);
1864
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
1865
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
1868
for (ib = 0; ib < polyg->NumInteriors; ib++)
1870
rng = polyg->Interiors + ib;
1871
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
1873
for (iv = 0; iv < rng->Points; iv++)
1875
gaiaGetPoint (rng->Coords, iv, &x, &y);
1876
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
1877
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
1881
*ptr = GAIA_MARK_END; /* END signature */
1884
*ptr = GAIA_MARK_START; /* START signatue */
1885
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1886
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1887
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1888
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1889
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1890
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1891
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1892
gaiaExport32 (ptr + 39, GAIA_POLYGONZ, 1, endian_arch); /* class POLYGON XYZ */
1893
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
1894
rng = polyg->Exterior;
1895
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
1897
for (iv = 0; iv < rng->Points; iv++)
1899
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
1900
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
1901
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
1902
gaiaExport64 (ptr + 16, z, 1, endian_arch); /* Z - exterior ring */
1905
for (ib = 0; ib < polyg->NumInteriors; ib++)
1907
rng = polyg->Interiors + ib;
1908
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
1910
for (iv = 0; iv < rng->Points; iv++)
1912
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
1913
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
1914
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
1915
gaiaExport64 (ptr + 16, z, 1, endian_arch); /* Z - interior ring */
1919
*ptr = GAIA_MARK_END; /* END signature */
1922
*ptr = GAIA_MARK_START; /* START signatue */
1923
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1924
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1925
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1926
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1927
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1928
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1929
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1930
gaiaExport32 (ptr + 39, GAIA_POLYGONM, 1, endian_arch); /* class POLYGON XYM */
1931
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
1932
rng = polyg->Exterior;
1933
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
1935
for (iv = 0; iv < rng->Points; iv++)
1937
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
1938
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
1939
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
1940
gaiaExport64 (ptr + 16, m, 1, endian_arch); /* M - exterior ring */
1943
for (ib = 0; ib < polyg->NumInteriors; ib++)
1945
rng = polyg->Interiors + ib;
1946
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
1948
for (iv = 0; iv < rng->Points; iv++)
1950
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
1951
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
1952
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
1953
gaiaExport64 (ptr + 16, m, 1, endian_arch); /* M - interior ring */
1957
*ptr = GAIA_MARK_END; /* END signature */
1959
case GAIA_POLYGONZM:
1960
*ptr = GAIA_MARK_START; /* START signatue */
1961
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
1962
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
1963
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
1964
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
1965
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
1966
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
1967
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
1968
gaiaExport32 (ptr + 39, GAIA_POLYGONZM, 1, endian_arch); /* class POLYGON */
1969
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
1970
rng = polyg->Exterior;
1971
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
1973
for (iv = 0; iv < rng->Points; iv++)
1975
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
1976
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
1977
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
1978
gaiaExport64 (ptr + 16, z, 1, endian_arch); /* Z - exterior ring */
1979
gaiaExport64 (ptr + 24, m, 1, endian_arch); /* M - exterior ring */
1982
for (ib = 0; ib < polyg->NumInteriors; ib++)
1984
rng = polyg->Interiors + ib;
1985
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
1987
for (iv = 0; iv < rng->Points; iv++)
1989
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
1990
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
1991
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
1992
gaiaExport64 (ptr + 16, z, 1, endian_arch); /* Z - exterior ring */
1993
gaiaExport64 (ptr + 24, m, 1, endian_arch); /* M - exterior ring */
1997
*ptr = GAIA_MARK_END; /* END signature */
2000
/* this one is a MULTIxxxx or a GEOMETRYCOLLECTION - building the main header */
2001
*ptr = GAIA_MARK_START; /* START signatue */
2002
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2003
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2004
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2005
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2006
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2007
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2008
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2009
gaiaExport32 (ptr + 39, type, 1, endian_arch); /* geometric class */
2010
gaiaExport32 (ptr + 43, entities, 1, endian_arch); /* # entities */
2012
point = geom->FirstPoint;
2015
*ptr = GAIA_MARK_ENTITY; /* ENTITY signature */
2016
if (geom->DimensionModel == GAIA_XY_Z)
2018
gaiaExport32 (ptr + 1, GAIA_POINTZ, 1, endian_arch); /* class POINT XYZ */
2019
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
2020
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
2021
gaiaExport64 (ptr + 21, point->Z, 1, endian_arch); /* Z */
2024
else if (geom->DimensionModel == GAIA_XY_M)
2026
gaiaExport32 (ptr + 1, GAIA_POINTM, 1, endian_arch); /* class POINT XYM */
2027
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
2028
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
2029
gaiaExport64 (ptr + 21, point->M, 1, endian_arch); /* M */
2032
else if (geom->DimensionModel == GAIA_XY_Z_M)
2034
gaiaExport32 (ptr + 1, GAIA_POINTZM, 1, endian_arch); /* class POINT XYZM */
2035
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
2036
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
2037
gaiaExport64 (ptr + 21, point->Z, 1, endian_arch); /* Z */
2038
gaiaExport64 (ptr + 29, point->M, 1, endian_arch); /* M */
2043
gaiaExport32 (ptr + 1, GAIA_POINT, 1, endian_arch); /* class POINT */
2044
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
2045
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
2048
point = point->Next;
2050
line = geom->FirstLinestring;
2053
*ptr = GAIA_MARK_ENTITY; /* ENTITY signature */
2054
if (geom->DimensionModel == GAIA_XY_Z)
2055
gaiaExport32 (ptr + 1, GAIA_LINESTRINGZ, 1, endian_arch); /* class LINESTRING XYZ */
2056
else if (geom->DimensionModel == GAIA_XY_M)
2057
gaiaExport32 (ptr + 1, GAIA_LINESTRINGM, 1, endian_arch); /* class LINESTRING XYM */
2058
else if (geom->DimensionModel == GAIA_XY_Z_M)
2059
gaiaExport32 (ptr + 1, GAIA_LINESTRINGZM, 1, endian_arch); /* class LINESTRING XYZM */
2061
gaiaExport32 (ptr + 1, GAIA_LINESTRING, 1, endian_arch); /* class LINESTRING */
2062
gaiaExport32 (ptr + 5, line->Points, 1, endian_arch); /* # points */
2064
for (iv = 0; iv < line->Points; iv++)
2066
if (geom->DimensionModel == GAIA_XY_Z)
2068
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
2070
else if (geom->DimensionModel == GAIA_XY_M)
2072
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
2074
else if (geom->DimensionModel == GAIA_XY_Z_M)
2076
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
2080
gaiaGetPoint (line->Coords, iv, &x, &y);
2082
gaiaExport64 (ptr, x, 1, endian_arch); /* X */
2083
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y */
2085
if (geom->DimensionModel == GAIA_XY_Z)
2087
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
2090
if (geom->DimensionModel == GAIA_XY_M)
2092
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
2095
if (geom->DimensionModel == GAIA_XY_Z_M)
2097
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
2098
gaiaExport64 (ptr + 8, m, 1, endian_arch); /* M */
2104
polyg = geom->FirstPolygon;
2107
*ptr = GAIA_MARK_ENTITY; /* ENTITY signature */
2108
if (geom->DimensionModel == GAIA_XY_Z)
2109
gaiaExport32 (ptr + 1, GAIA_POLYGONZ, 1, endian_arch); /* class POLYGON XYZ */
2110
else if (geom->DimensionModel == GAIA_XY_M)
2111
gaiaExport32 (ptr + 1, GAIA_POLYGONM, 1, endian_arch); /* class POLYGON XYM */
2112
else if (geom->DimensionModel == GAIA_XY_Z_M)
2113
gaiaExport32 (ptr + 1, GAIA_POLYGONZM, 1, endian_arch); /* class POLYGON XYZM */
2115
gaiaExport32 (ptr + 1, GAIA_POLYGON, 1, endian_arch); /* class POLYGON */
2116
gaiaExport32 (ptr + 5, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
2117
rng = polyg->Exterior;
2118
gaiaExport32 (ptr + 9, rng->Points, 1, endian_arch); /* # points - exterior ring */
2120
for (iv = 0; iv < rng->Points; iv++)
2122
if (geom->DimensionModel == GAIA_XY_Z)
2124
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
2126
else if (geom->DimensionModel == GAIA_XY_M)
2128
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
2130
else if (geom->DimensionModel == GAIA_XY_Z_M)
2132
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
2136
gaiaGetPoint (rng->Coords, iv, &x, &y);
2138
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
2139
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
2141
if (geom->DimensionModel == GAIA_XY_Z)
2143
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
2146
if (geom->DimensionModel == GAIA_XY_M)
2148
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
2151
if (geom->DimensionModel == GAIA_XY_Z_M)
2153
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
2154
gaiaExport64 (ptr + 8, m, 1, endian_arch); /* M */
2158
for (ib = 0; ib < polyg->NumInteriors; ib++)
2160
rng = polyg->Interiors + ib;
2161
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
2163
for (iv = 0; iv < rng->Points; iv++)
2165
if (geom->DimensionModel == GAIA_XY_Z)
2167
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
2169
else if (geom->DimensionModel == GAIA_XY_M)
2171
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
2173
else if (geom->DimensionModel == GAIA_XY_Z_M)
2175
gaiaGetPointXYZM (rng->Coords, iv, &x, &y,
2180
gaiaGetPoint (rng->Coords, iv, &x, &y);
2182
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
2183
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
2185
if (geom->DimensionModel == GAIA_XY_Z)
2187
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
2190
if (geom->DimensionModel == GAIA_XY_M)
2192
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
2195
if (geom->DimensionModel == GAIA_XY_Z_M)
2197
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
2198
gaiaExport64 (ptr + 8, m, 1, endian_arch); /* M */
2203
polyg = polyg->Next;
2205
*ptr = GAIA_MARK_END; /* END signature */
2209
GAIAGEO_DECLARE void
2210
gaiaToCompressedBlobWkb (gaiaGeomCollPtr geom, unsigned char **result,
2214
/ builds the SpatiaLite BLOB representation for this GEOMETRY
2215
/ geometry-compression will be applied to LINESTRINGs and RINGs
2223
double last_x = 0.0;
2224
double last_y = 0.0;
2225
double last_z = 0.0;
2231
int n_linestrings = 0;
2236
gaiaLinestringPtr ln;
2239
gaiaPointPtr point = NULL;
2240
gaiaLinestringPtr line = NULL;
2241
gaiaPolygonPtr polyg = NULL;
2242
int endian_arch = gaiaEndianArch ();
2243
gaiaMbrGeometry (geom);
2244
/* how many entities, and of what kind, do we have ? */
2245
pt = geom->FirstPoint;
2253
ln = geom->FirstLinestring;
2261
pg = geom->FirstPolygon;
2271
if (n_points == 0 && n_polygons == 0 && n_linestrings == 0)
2273
/* ok, we can determine the geometry class */
2274
if (n_points == 1 && n_linestrings == 0 && n_polygons == 0)
2276
if (geom->DeclaredType == GAIA_MULTIPOINT)
2278
if (geom->DimensionModel == GAIA_XY_Z)
2279
type = GAIA_MULTIPOINTZ;
2280
else if (geom->DimensionModel == GAIA_XY_M)
2281
type = GAIA_MULTIPOINTM;
2282
else if (geom->DimensionModel == GAIA_XY_Z_M)
2283
type = GAIA_MULTIPOINTZM;
2285
type = GAIA_MULTIPOINT;
2287
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
2289
if (geom->DimensionModel == GAIA_XY_Z)
2290
type = GAIA_GEOMETRYCOLLECTIONZ;
2291
else if (geom->DimensionModel == GAIA_XY_M)
2292
type = GAIA_GEOMETRYCOLLECTIONM;
2293
else if (geom->DimensionModel == GAIA_XY_Z_M)
2294
type = GAIA_GEOMETRYCOLLECTIONZM;
2296
type = GAIA_GEOMETRYCOLLECTION;
2300
if (geom->DimensionModel == GAIA_XY_Z)
2302
else if (geom->DimensionModel == GAIA_XY_M)
2304
else if (geom->DimensionModel == GAIA_XY_Z_M)
2305
type = GAIA_POINTZM;
2310
else if (n_points > 1 && n_linestrings == 0 && n_polygons == 0)
2312
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
2314
if (geom->DimensionModel == GAIA_XY_Z)
2315
type = GAIA_GEOMETRYCOLLECTIONZ;
2316
else if (geom->DimensionModel == GAIA_XY_M)
2317
type = GAIA_GEOMETRYCOLLECTIONM;
2318
else if (geom->DimensionModel == GAIA_XY_Z_M)
2319
type = GAIA_GEOMETRYCOLLECTIONZM;
2321
type = GAIA_GEOMETRYCOLLECTION;
2325
if (geom->DimensionModel == GAIA_XY_Z)
2326
type = GAIA_MULTIPOINTZ;
2327
else if (geom->DimensionModel == GAIA_XY_M)
2328
type = GAIA_MULTIPOINTM;
2329
else if (geom->DimensionModel == GAIA_XY_Z_M)
2330
type = GAIA_MULTIPOINTZM;
2332
type = GAIA_MULTIPOINT;
2335
else if (n_points == 0 && n_linestrings == 1 && n_polygons == 0)
2337
if (geom->DeclaredType == GAIA_MULTILINESTRING)
2339
if (geom->DimensionModel == GAIA_XY_Z)
2340
type = GAIA_MULTILINESTRINGZ;
2341
else if (geom->DimensionModel == GAIA_XY_M)
2342
type = GAIA_MULTILINESTRINGM;
2343
else if (geom->DimensionModel == GAIA_XY_Z_M)
2344
type = GAIA_MULTILINESTRINGZM;
2346
type = GAIA_MULTILINESTRING;
2348
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
2350
if (geom->DimensionModel == GAIA_XY_Z)
2351
type = GAIA_GEOMETRYCOLLECTIONZ;
2352
else if (geom->DimensionModel == GAIA_XY_M)
2353
type = GAIA_GEOMETRYCOLLECTIONM;
2354
else if (geom->DimensionModel == GAIA_XY_Z_M)
2355
type = GAIA_GEOMETRYCOLLECTIONZM;
2357
type = GAIA_GEOMETRYCOLLECTION;
2361
if (geom->DimensionModel == GAIA_XY_Z)
2362
type = GAIA_LINESTRINGZ;
2363
else if (geom->DimensionModel == GAIA_XY_M)
2364
type = GAIA_LINESTRINGM;
2365
else if (geom->DimensionModel == GAIA_XY_Z_M)
2366
type = GAIA_LINESTRINGZM;
2368
type = GAIA_LINESTRING;
2371
else if (n_points == 0 && n_linestrings > 1 && n_polygons == 0)
2373
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
2375
if (geom->DimensionModel == GAIA_XY_Z)
2376
type = GAIA_GEOMETRYCOLLECTIONZ;
2377
else if (geom->DimensionModel == GAIA_XY_M)
2378
type = GAIA_GEOMETRYCOLLECTIONM;
2379
else if (geom->DimensionModel == GAIA_XY_Z_M)
2380
type = GAIA_GEOMETRYCOLLECTIONZM;
2382
type = GAIA_GEOMETRYCOLLECTION;
2386
if (geom->DimensionModel == GAIA_XY_Z)
2387
type = GAIA_MULTILINESTRINGZ;
2388
else if (geom->DimensionModel == GAIA_XY_M)
2389
type = GAIA_MULTILINESTRINGM;
2390
else if (geom->DimensionModel == GAIA_XY_Z_M)
2391
type = GAIA_MULTILINESTRINGZM;
2393
type = GAIA_MULTILINESTRING;
2396
else if (n_points == 0 && n_linestrings == 0 && n_polygons == 1)
2398
if (geom->DeclaredType == GAIA_MULTIPOLYGON)
2400
if (geom->DimensionModel == GAIA_XY_Z)
2401
type = GAIA_MULTIPOLYGONZ;
2402
else if (geom->DimensionModel == GAIA_XY_M)
2403
type = GAIA_MULTIPOLYGONM;
2404
else if (geom->DimensionModel == GAIA_XY_Z_M)
2405
type = GAIA_MULTIPOLYGONZM;
2407
type = GAIA_MULTIPOLYGON;
2409
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
2411
if (geom->DimensionModel == GAIA_XY_Z)
2412
type = GAIA_GEOMETRYCOLLECTIONZ;
2413
else if (geom->DimensionModel == GAIA_XY_M)
2414
type = GAIA_GEOMETRYCOLLECTIONM;
2415
else if (geom->DimensionModel == GAIA_XY_Z_M)
2416
type = GAIA_GEOMETRYCOLLECTIONZM;
2418
type = GAIA_GEOMETRYCOLLECTION;
2422
if (geom->DimensionModel == GAIA_XY_Z)
2423
type = GAIA_POLYGONZ;
2424
else if (geom->DimensionModel == GAIA_XY_M)
2425
type = GAIA_POLYGONM;
2426
else if (geom->DimensionModel == GAIA_XY_Z_M)
2427
type = GAIA_POLYGONZM;
2429
type = GAIA_POLYGON;
2432
else if (n_points == 0 && n_linestrings == 0 && n_polygons > 1)
2434
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
2436
if (geom->DimensionModel == GAIA_XY_Z)
2437
type = GAIA_GEOMETRYCOLLECTIONZ;
2438
else if (geom->DimensionModel == GAIA_XY_M)
2439
type = GAIA_GEOMETRYCOLLECTIONM;
2440
else if (geom->DimensionModel == GAIA_XY_Z_M)
2441
type = GAIA_GEOMETRYCOLLECTIONZM;
2443
type = GAIA_GEOMETRYCOLLECTION;
2447
if (geom->DimensionModel == GAIA_XY_Z)
2448
type = GAIA_MULTIPOLYGONZ;
2449
else if (geom->DimensionModel == GAIA_XY_M)
2450
type = GAIA_MULTIPOLYGONM;
2451
else if (geom->DimensionModel == GAIA_XY_Z_M)
2452
type = GAIA_MULTIPOLYGONZM;
2454
type = GAIA_MULTIPOLYGON;
2459
if (geom->DimensionModel == GAIA_XY_Z)
2460
type = GAIA_GEOMETRYCOLLECTIONZ;
2461
else if (geom->DimensionModel == GAIA_XY_M)
2462
type = GAIA_GEOMETRYCOLLECTIONM;
2463
else if (geom->DimensionModel == GAIA_XY_Z_M)
2464
type = GAIA_GEOMETRYCOLLECTIONZM;
2466
type = GAIA_GEOMETRYCOLLECTION;
2468
/* and now we compute the size of BLOB */
2469
*size = 44; /* header size */
2473
*size += (sizeof (double) * 2); /* [x,y] coords */
2476
*size += (sizeof (double) * 3); /* [x,y,z] coords */
2479
*size += (sizeof (double) * 3); /* [x,y,m] coords */
2482
*size += (sizeof (double) * 4); /* [x,y,z,m] coords */
2484
case GAIA_LINESTRING:
2485
*size += (4 + (8 * line->Points) + 16); /* # points + [x,y] for each vertex */
2487
case GAIA_LINESTRINGZ:
2488
*size += (4 + (12 * line->Points) + 24); /* # points + [x,y,z] for each vertex */
2490
case GAIA_LINESTRINGM:
2491
*size += (4 + (16 * line->Points) + 16); /* # points + [x,y,m] for each vertex */
2493
case GAIA_LINESTRINGZM:
2494
*size += (4 + (20 * line->Points) + 24); /* # points + [x,y,z,m] for each vertex */
2497
rng = polyg->Exterior;
2498
*size += (8 + (8 * rng->Points) + 16); /* # rings + # points + [x.y] array - exterior ring */
2499
for (ib = 0; ib < polyg->NumInteriors; ib++)
2501
rng = polyg->Interiors + ib;
2502
*size += (4 + (8 * rng->Points) + 16); /* # points + [x,y] array - interior ring */
2506
rng = polyg->Exterior;
2507
*size += (8 + (12 * rng->Points) + 24); /* # rings + # points + [x,y,z] array - exterior ring */
2508
for (ib = 0; ib < polyg->NumInteriors; ib++)
2510
rng = polyg->Interiors + ib;
2511
*size += (4 + (12 * rng->Points) + 24); /* # points + [x,y,z] array - interior ring */
2515
rng = polyg->Exterior;
2516
*size += (8 + (16 * rng->Points) + 16); /* # rings + # points + [x,y,m] array - exterior ring */
2517
for (ib = 0; ib < polyg->NumInteriors; ib++)
2519
rng = polyg->Interiors + ib;
2520
*size += (4 + (16 * rng->Points) + 16); /* # points + [x,y,m] array - interior ring */
2523
case GAIA_POLYGONZM:
2524
rng = polyg->Exterior;
2525
*size += (8 + (20 * rng->Points) + 24); /* # rings + # points + [x,y,z,m] array - exterior ring */
2526
for (ib = 0; ib < polyg->NumInteriors; ib++)
2528
rng = polyg->Interiors + ib;
2529
*size += (4 + (20 * rng->Points) + 24); /* # points + [x,y,z,m] array - interior ring */
2533
/* this one is not a simple geometry; should be a MULTIxxxx or a GEOMETRYCOLLECTION */
2534
*size += 4; /* # entities */
2535
point = geom->FirstPoint;
2538
*size += 5; /* entity header */
2539
if (geom->DimensionModel == GAIA_XY_Z
2540
|| geom->DimensionModel == GAIA_XY_M)
2541
*size += (sizeof (double) * 3); /* three doubles for each POINT */
2542
else if (geom->DimensionModel == GAIA_XY_Z_M)
2543
*size += (sizeof (double) * 4); /* four doubles for each POINT */
2545
*size += (sizeof (double) * 2); /* two doubles for each POINT */
2546
point = point->Next;
2548
line = geom->FirstLinestring;
2551
*size += 5; /* entity header */
2552
if (geom->DimensionModel == GAIA_XY_Z)
2553
*size += (4 + (12 * line->Points) + 24); /* # points + [x,y,z] for each vertex */
2554
else if (geom->DimensionModel == GAIA_XY_M)
2555
*size += (4 + (16 * line->Points) + 16); /* # points + [x,y,m] for each vertex */
2556
else if (geom->DimensionModel == GAIA_XY_Z_M)
2557
*size += (4 + (20 * line->Points) + 24); /* # points + [x,y,z,m] for each vertex */
2559
*size += (4 + (8 * line->Points) + 16); /* # points + [x,y] for each vertex */
2562
polyg = geom->FirstPolygon;
2565
*size += 5; /* entity header */
2566
rng = polyg->Exterior;
2567
if (geom->DimensionModel == GAIA_XY_Z)
2568
*size += (8 + (12 * rng->Points) + 24); /* # rings + # points + [x,y,z] array - exterior ring */
2569
else if (geom->DimensionModel == GAIA_XY_M)
2570
*size += (8 + (16 * rng->Points) + 16); /* # rings + # points + [x,y,m] array - exterior ring */
2571
else if (geom->DimensionModel == GAIA_XY_Z_M)
2572
*size += (8 + (20 * rng->Points) + 24); /* # rings + # points + [x,y,z,m] array - exterior ring */
2574
*size += (8 + (8 * rng->Points) + 16); /* # rings + # points + [x,y] array - exterior ring */
2575
for (ib = 0; ib < polyg->NumInteriors; ib++)
2577
rng = polyg->Interiors + ib;
2578
if (geom->DimensionModel == GAIA_XY_Z)
2579
*size += (4 + (12 * rng->Points) + 24); /* # points + [x,y,z] array - interior ring */
2580
else if (geom->DimensionModel == GAIA_XY_M)
2581
*size += (4 + (16 * rng->Points) + 16); /* # points + [x,y,m] array - interior ring */
2582
else if (geom->DimensionModel == GAIA_XY_Z_M)
2583
*size += (4 + (20 * rng->Points) + 24); /* # points + [x,y,z,m] array - interior ring */
2585
*size += (4 + (8 * rng->Points) + 16); /* # points + [x,y] array - interior ring */
2587
polyg = polyg->Next;
2590
*result = malloc (*size);
2592
/* and finally we build the BLOB */
2596
*ptr = GAIA_MARK_START; /* START signature */
2597
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2598
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2599
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2600
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2601
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2602
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2603
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2604
gaiaExport32 (ptr + 39, GAIA_POINT, 1, endian_arch); /* class POINT */
2605
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
2606
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
2607
*(ptr + 59) = GAIA_MARK_END; /* END signature */
2610
*ptr = GAIA_MARK_START; /* START signature */
2611
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2612
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2613
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2614
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2615
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2616
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2617
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2618
gaiaExport32 (ptr + 39, GAIA_POINTZ, 1, endian_arch); /* class POINT XYZ */
2619
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
2620
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
2621
gaiaExport64 (ptr + 59, point->Z, 1, endian_arch); /* Z */
2622
*(ptr + 67) = GAIA_MARK_END; /* END signature */
2625
*ptr = GAIA_MARK_START; /* START signature */
2626
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2627
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2628
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2629
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2630
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2631
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2632
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2633
gaiaExport32 (ptr + 39, GAIA_POINTM, 1, endian_arch); /* class POINT XYM */
2634
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
2635
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
2636
gaiaExport64 (ptr + 59, point->M, 1, endian_arch); /* M */
2637
*(ptr + 67) = GAIA_MARK_END; /* END signature */
2640
*ptr = GAIA_MARK_START; /* START signature */
2641
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2642
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2643
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2644
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2645
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2646
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2647
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2648
gaiaExport32 (ptr + 39, GAIA_POINTZM, 1, endian_arch); /* class POINT XYZM */
2649
gaiaExport64 (ptr + 43, point->X, 1, endian_arch); /* X */
2650
gaiaExport64 (ptr + 51, point->Y, 1, endian_arch); /* Y */
2651
gaiaExport64 (ptr + 59, point->Z, 1, endian_arch); /* M */
2652
gaiaExport64 (ptr + 67, point->M, 1, endian_arch); /* Z */
2653
*(ptr + 75) = GAIA_MARK_END; /* END signature */
2655
case GAIA_LINESTRING:
2656
*ptr = GAIA_MARK_START; /* START signatue */
2657
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2658
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2659
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2660
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2661
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2662
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2663
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2664
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_LINESTRING, 1, endian_arch); /* class LINESTRING */
2665
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
2667
for (iv = 0; iv < line->Points; iv++)
2669
gaiaGetPoint (line->Coords, iv, &x, &y);
2670
if (iv == 0 || iv == (line->Points - 1))
2672
/* first and last vertices are uncompressed */
2673
gaiaExport64 (ptr, x, 1, endian_arch);
2674
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2679
/* compressing any other intermediate vertex */
2680
fx = (float) (x - last_x);
2681
fy = (float) (y - last_y);
2682
gaiaExportF32 (ptr, fx, 1, endian_arch);
2683
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2689
*ptr = GAIA_MARK_END; /* END signature */
2691
case GAIA_LINESTRINGZ:
2692
*ptr = GAIA_MARK_START; /* START signatue */
2693
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2694
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2695
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2696
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2697
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2698
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2699
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2700
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_LINESTRINGZ, 1, endian_arch); /* class LINESTRING XYZ */
2701
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
2703
for (iv = 0; iv < line->Points; iv++)
2705
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
2706
if (iv == 0 || iv == (line->Points - 1))
2708
/* first and last vertices are uncompressed */
2709
gaiaExport64 (ptr, x, 1, endian_arch);
2710
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2711
gaiaExport64 (ptr + 16, z, 1, endian_arch);
2716
/* compressing any other intermediate vertex */
2717
fx = (float) (x - last_x);
2718
fy = (float) (y - last_y);
2719
fz = (float) (z - last_z);
2720
gaiaExportF32 (ptr, fx, 1, endian_arch);
2721
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2722
gaiaExportF32 (ptr + 8, fz, 1, endian_arch);
2729
*ptr = GAIA_MARK_END; /* END signature */
2731
case GAIA_LINESTRINGM:
2732
*ptr = GAIA_MARK_START; /* START signatue */
2733
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2734
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2735
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2736
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2737
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2738
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2739
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2740
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_LINESTRINGM, 1, endian_arch); /* class LINESTRING XYM */
2741
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
2743
for (iv = 0; iv < line->Points; iv++)
2745
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
2746
if (iv == 0 || iv == (line->Points - 1))
2748
/* first and last vertices are uncompressed */
2749
gaiaExport64 (ptr, x, 1, endian_arch);
2750
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2751
gaiaExport64 (ptr + 16, m, 1, endian_arch);
2756
/* compressing any other intermediate vertex */
2757
fx = (float) (x - last_x);
2758
fy = (float) (y - last_y);
2759
gaiaExportF32 (ptr, fx, 1, endian_arch);
2760
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2761
gaiaExport64 (ptr + 8, m, 1, endian_arch);
2767
*ptr = GAIA_MARK_END; /* END signature */
2769
case GAIA_LINESTRINGZM:
2770
*ptr = GAIA_MARK_START; /* START signatue */
2771
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2772
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2773
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2774
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2775
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2776
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2777
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2778
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_LINESTRINGZM, 1, endian_arch); /* class LINESTRING XYZM */
2779
gaiaExport32 (ptr + 43, line->Points, 1, endian_arch); /* # points */
2781
for (iv = 0; iv < line->Points; iv++)
2783
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
2784
if (iv == 0 || iv == (line->Points - 1))
2786
/* first and last vertices are uncompressed */
2787
gaiaExport64 (ptr, x, 1, endian_arch);
2788
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2789
gaiaExport64 (ptr + 16, z, 1, endian_arch);
2790
gaiaExport64 (ptr + 24, m, 1, endian_arch);
2795
/* compressing any other intermediate vertex */
2796
fx = (float) (x - last_x);
2797
fy = (float) (y - last_y);
2798
fz = (float) (z - last_z);
2799
gaiaExportF32 (ptr, fx, 1, endian_arch);
2800
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2801
gaiaExportF32 (ptr + 8, fz, 1, endian_arch);
2802
gaiaExport64 (ptr + 12, m, 1, endian_arch);
2809
*ptr = GAIA_MARK_END; /* END signature */
2812
*ptr = GAIA_MARK_START; /* START signatue */
2813
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2814
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2815
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2816
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2817
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2818
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2819
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2820
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_POLYGON, 1, endian_arch); /* class POLYGON */
2821
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
2822
rng = polyg->Exterior;
2823
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
2825
for (iv = 0; iv < rng->Points; iv++)
2827
gaiaGetPoint (rng->Coords, iv, &x, &y);
2828
if (iv == 0 || iv == (rng->Points - 1))
2830
/* first and last vertices are uncompressed */
2831
gaiaExport64 (ptr, x, 1, endian_arch);
2832
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2837
/* compressing any other intermediate vertex */
2838
fx = (float) (x - last_x);
2839
fy = (float) (y - last_y);
2840
gaiaExportF32 (ptr, fx, 1, endian_arch);
2841
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2847
for (ib = 0; ib < polyg->NumInteriors; ib++)
2849
rng = polyg->Interiors + ib;
2850
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
2852
for (iv = 0; iv < rng->Points; iv++)
2854
gaiaGetPoint (rng->Coords, iv, &x, &y);
2855
if (iv == 0 || iv == (rng->Points - 1))
2857
/* first and last vertices are uncompressed */
2858
gaiaExport64 (ptr, x, 1, endian_arch);
2859
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2864
/* compressing any other intermediate vertex */
2865
fx = (float) (x - last_x);
2866
fy = (float) (y - last_y);
2867
gaiaExportF32 (ptr, fx, 1, endian_arch);
2868
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2875
*ptr = GAIA_MARK_END; /* END signature */
2878
*ptr = GAIA_MARK_START; /* START signatue */
2879
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2880
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2881
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2882
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2883
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2884
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2885
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2886
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_POLYGONZ, 1, endian_arch); /* class POLYGON XYZ */
2887
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
2888
rng = polyg->Exterior;
2889
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
2891
for (iv = 0; iv < rng->Points; iv++)
2893
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
2894
if (iv == 0 || iv == (rng->Points - 1))
2896
/* first and last vertices are uncompressed */
2897
gaiaExport64 (ptr, x, 1, endian_arch);
2898
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2899
gaiaExport64 (ptr + 16, z, 1, endian_arch);
2904
/* compressing any other intermediate vertex */
2905
fx = (float) (x - last_x);
2906
fy = (float) (y - last_y);
2907
fz = (float) (z - last_z);
2908
gaiaExportF32 (ptr, fx, 1, endian_arch);
2909
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2910
gaiaExportF32 (ptr + 8, fz, 1, endian_arch);
2917
for (ib = 0; ib < polyg->NumInteriors; ib++)
2919
rng = polyg->Interiors + ib;
2920
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
2922
for (iv = 0; iv < rng->Points; iv++)
2924
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
2925
if (iv == 0 || iv == (rng->Points - 1))
2927
/* first and last vertices are uncompressed */
2928
gaiaExport64 (ptr, x, 1, endian_arch);
2929
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2930
gaiaExport64 (ptr + 16, z, 1, endian_arch);
2935
/* compressing any other intermediate vertex */
2936
fx = (float) (x - last_x);
2937
fy = (float) (y - last_y);
2938
fz = (float) (z - last_z);
2939
gaiaExportF32 (ptr, fx, 1, endian_arch);
2940
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2941
gaiaExportF32 (ptr + 8, fz, 1, endian_arch);
2949
*ptr = GAIA_MARK_END; /* END signature */
2952
*ptr = GAIA_MARK_START; /* START signatue */
2953
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
2954
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
2955
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
2956
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
2957
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
2958
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
2959
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
2960
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_POLYGONM, 1, endian_arch); /* class POLYGON XYM */
2961
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
2962
rng = polyg->Exterior;
2963
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
2965
for (iv = 0; iv < rng->Points; iv++)
2967
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
2968
if (iv == 0 || iv == (rng->Points - 1))
2970
/* first and last vertices are uncompressed */
2971
gaiaExport64 (ptr, x, 1, endian_arch);
2972
gaiaExport64 (ptr + 8, y, 1, endian_arch);
2973
gaiaExport64 (ptr + 16, m, 1, endian_arch);
2978
/* compressing any other intermediate vertex */
2979
fx = (float) (x - last_x);
2980
fy = (float) (y - last_y);
2981
gaiaExportF32 (ptr, fx, 1, endian_arch);
2982
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
2983
gaiaExport64 (ptr + 8, m, 1, endian_arch);
2989
for (ib = 0; ib < polyg->NumInteriors; ib++)
2991
rng = polyg->Interiors + ib;
2992
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
2994
for (iv = 0; iv < rng->Points; iv++)
2996
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
2997
if (iv == 0 || iv == (rng->Points - 1))
2999
/* first and last vertices are uncompressed */
3000
gaiaExport64 (ptr, x, 1, endian_arch);
3001
gaiaExport64 (ptr + 8, y, 1, endian_arch);
3002
gaiaExport64 (ptr + 16, m, 1, endian_arch);
3007
/* compressing any other intermediate vertex */
3008
fx = (float) (x - last_x);
3009
fy = (float) (y - last_y);
3010
gaiaExportF32 (ptr, fx, 1, endian_arch);
3011
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
3012
gaiaExport64 (ptr + 8, m, 1, endian_arch);
3019
*ptr = GAIA_MARK_END; /* END signature */
3021
case GAIA_POLYGONZM:
3022
*ptr = GAIA_MARK_START; /* START signatue */
3023
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
3024
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
3025
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
3026
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
3027
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
3028
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
3029
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
3030
gaiaExport32 (ptr + 39, GAIA_COMPRESSED_POLYGONZM, 1, endian_arch); /* class POLYGON */
3031
gaiaExport32 (ptr + 43, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
3032
rng = polyg->Exterior;
3033
gaiaExport32 (ptr + 47, rng->Points, 1, endian_arch); /* # points - exterior ring */
3035
for (iv = 0; iv < rng->Points; iv++)
3037
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
3038
if (iv == 0 || iv == (rng->Points - 1))
3040
/* first and last vertices are uncompressed */
3041
gaiaExport64 (ptr, x, 1, endian_arch);
3042
gaiaExport64 (ptr + 8, y, 1, endian_arch);
3043
gaiaExport64 (ptr + 16, z, 1, endian_arch);
3044
gaiaExport64 (ptr + 24, m, 1, endian_arch);
3049
/* compressing any other intermediate vertex */
3050
fx = (float) (x - last_x);
3051
fy = (float) (y - last_y);
3052
fz = (float) (z - last_z);
3053
gaiaExportF32 (ptr, fx, 1, endian_arch);
3054
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
3055
gaiaExportF32 (ptr + 8, fz, 1, endian_arch);
3056
gaiaExport64 (ptr + 12, m, 1, endian_arch);
3063
for (ib = 0; ib < polyg->NumInteriors; ib++)
3065
rng = polyg->Interiors + ib;
3066
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
3068
for (iv = 0; iv < rng->Points; iv++)
3070
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
3071
if (iv == 0 || iv == (rng->Points - 1))
3073
/* first and last vertices are uncompressed */
3074
gaiaExport64 (ptr, x, 1, endian_arch);
3075
gaiaExport64 (ptr + 8, y, 1, endian_arch);
3076
gaiaExport64 (ptr + 16, z, 1, endian_arch);
3077
gaiaExport64 (ptr + 24, m, 1, endian_arch);
3082
/* compressing any other intermediate vertex */
3083
fx = (float) (x - last_x);
3084
fy = (float) (y - last_y);
3085
fz = (float) (z - last_z);
3086
gaiaExportF32 (ptr, fx, 1, endian_arch);
3087
gaiaExportF32 (ptr + 4, fy, 1, endian_arch);
3088
gaiaExportF32 (ptr + 8, fz, 1, endian_arch);
3089
gaiaExport64 (ptr + 12, m, 1, endian_arch);
3097
*ptr = GAIA_MARK_END; /* END signature */
3100
/* this one is a MULTIxxxx or a GEOMETRYCOLLECTION - building the main header */
3101
*ptr = GAIA_MARK_START; /* START signatue */
3102
*(ptr + 1) = GAIA_LITTLE_ENDIAN; /* byte ordering */
3103
gaiaExport32 (ptr + 2, geom->Srid, 1, endian_arch); /* the SRID */
3104
gaiaExport64 (ptr + 6, geom->MinX, 1, endian_arch); /* MBR - minimun X */
3105
gaiaExport64 (ptr + 14, geom->MinY, 1, endian_arch); /* MBR - minimun Y */
3106
gaiaExport64 (ptr + 22, geom->MaxX, 1, endian_arch); /* MBR - maximun X */
3107
gaiaExport64 (ptr + 30, geom->MaxY, 1, endian_arch); /* MBR - maximun Y */
3108
*(ptr + 38) = GAIA_MARK_MBR; /* MBR signature */
3109
gaiaExport32 (ptr + 39, type, 1, endian_arch); /* geometric class */
3110
gaiaExport32 (ptr + 43, entities, 1, endian_arch); /* # entities */
3112
point = geom->FirstPoint;
3115
*ptr = GAIA_MARK_ENTITY; /* ENTITY signature */
3116
if (geom->DimensionModel == GAIA_XY_Z)
3118
gaiaExport32 (ptr + 1, GAIA_POINTZ, 1, endian_arch); /* class POINT XYZ */
3119
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
3120
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
3121
gaiaExport64 (ptr + 21, point->Z, 1, endian_arch); /* Z */
3124
else if (geom->DimensionModel == GAIA_XY_M)
3126
gaiaExport32 (ptr + 1, GAIA_POINTM, 1, endian_arch); /* class POINT XYM */
3127
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
3128
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
3129
gaiaExport64 (ptr + 21, point->M, 1, endian_arch); /* M */
3132
else if (geom->DimensionModel == GAIA_XY_Z_M)
3134
gaiaExport32 (ptr + 1, GAIA_POINTZM, 1, endian_arch); /* class POINT XYZM */
3135
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
3136
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
3137
gaiaExport64 (ptr + 21, point->Z, 1, endian_arch); /* Z */
3138
gaiaExport64 (ptr + 29, point->M, 1, endian_arch); /* M */
3143
gaiaExport32 (ptr + 1, GAIA_POINT, 1, endian_arch); /* class POINT */
3144
gaiaExport64 (ptr + 5, point->X, 1, endian_arch); /* X */
3145
gaiaExport64 (ptr + 13, point->Y, 1, endian_arch); /* Y */
3148
point = point->Next;
3150
line = geom->FirstLinestring;
3153
*ptr = GAIA_MARK_ENTITY; /* ENTITY signature */
3154
if (geom->DimensionModel == GAIA_XY_Z)
3155
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_LINESTRINGZ, 1, endian_arch); /* class LINESTRING XYZ */
3156
else if (geom->DimensionModel == GAIA_XY_M)
3157
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_LINESTRINGM, 1, endian_arch); /* class LINESTRING XYM */
3158
else if (geom->DimensionModel == GAIA_XY_Z_M)
3159
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_LINESTRINGZM, 1, endian_arch); /* class LINESTRING XYZM */
3161
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_LINESTRING, 1, endian_arch); /* class LINESTRING */
3162
gaiaExport32 (ptr + 5, line->Points, 1, endian_arch); /* # points */
3164
for (iv = 0; iv < line->Points; iv++)
3168
if (geom->DimensionModel == GAIA_XY_Z)
3170
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
3172
else if (geom->DimensionModel == GAIA_XY_M)
3174
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
3176
else if (geom->DimensionModel == GAIA_XY_Z_M)
3178
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
3182
gaiaGetPoint (line->Coords, iv, &x, &y);
3184
if (iv == 0 || iv == (line->Points - 1))
3186
/* first and last vertices are uncompressed */
3187
gaiaExport64 (ptr, x, 1, endian_arch); /* X */
3188
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y */
3193
/* compressing any other intermediate vertex */
3194
fx = (float) (x - last_x);
3195
fy = (float) (y - last_y);
3196
gaiaExportF32 (ptr, fx, 1, endian_arch); /* X */
3197
gaiaExportF32 (ptr + 4, fy, 1, endian_arch); /* Y */
3200
if (geom->DimensionModel == GAIA_XY_Z)
3202
if (iv == 0 || iv == (line->Points - 1))
3204
/* first and last vertices are uncompressed */
3205
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
3210
/* compressing any other intermediate vertex */
3211
fz = (float) (z - last_z);
3212
gaiaExportF32 (ptr, fz, 1, endian_arch); /* Z */
3216
if (geom->DimensionModel == GAIA_XY_M)
3218
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
3221
if (geom->DimensionModel == GAIA_XY_Z_M)
3223
if (iv == 0 || iv == (line->Points - 1))
3225
/* first and last vertices are uncompressed */
3226
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
3231
/* compressing any other intermediate vertex */
3232
fz = (float) (z - last_z);
3233
gaiaExportF32 (ptr, fz, 1, endian_arch); /* Z */
3236
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
3245
polyg = geom->FirstPolygon;
3248
*ptr = GAIA_MARK_ENTITY; /* ENTITY signature */
3249
if (geom->DimensionModel == GAIA_XY_Z)
3250
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_POLYGONZ, 1, endian_arch); /* class POLYGON XYZ */
3251
else if (geom->DimensionModel == GAIA_XY_M)
3252
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_POLYGONM, 1, endian_arch); /* class POLYGON XYM */
3253
else if (geom->DimensionModel == GAIA_XY_Z_M)
3254
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_POLYGONZM, 1, endian_arch); /* class POLYGON XYZM */
3256
gaiaExport32 (ptr + 1, GAIA_COMPRESSED_POLYGON, 1, endian_arch); /* class POLYGON */
3257
gaiaExport32 (ptr + 5, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
3258
rng = polyg->Exterior;
3259
gaiaExport32 (ptr + 9, rng->Points, 1, endian_arch); /* # points - exterior ring */
3261
for (iv = 0; iv < rng->Points; iv++)
3265
if (geom->DimensionModel == GAIA_XY_Z)
3267
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
3269
else if (geom->DimensionModel == GAIA_XY_M)
3271
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
3273
else if (geom->DimensionModel == GAIA_XY_Z_M)
3275
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
3279
gaiaGetPoint (rng->Coords, iv, &x, &y);
3281
if (iv == 0 || iv == (rng->Points - 1))
3283
/* first and last vertices are uncompressed */
3284
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
3285
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
3290
/* compressing any other intermediate vertex */
3291
fx = (float) (x - last_x);
3292
fy = (float) (y - last_y);
3293
gaiaExportF32 (ptr, fx, 1, endian_arch); /* X */
3294
gaiaExportF32 (ptr + 4, fy, 1, endian_arch); /* Y */
3297
if (geom->DimensionModel == GAIA_XY_Z)
3299
if (iv == 0 || iv == (rng->Points - 1))
3301
/* first and last vertices are uncompressed */
3302
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
3307
/* compressing any other intermediate vertex */
3308
fz = (float) (z - last_z);
3309
gaiaExportF32 (ptr, fz, 1, endian_arch); /* Z */
3313
if (geom->DimensionModel == GAIA_XY_M)
3315
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
3318
if (geom->DimensionModel == GAIA_XY_Z_M)
3320
if (iv == 0 || iv == (rng->Points - 1))
3322
/* first and last vertices are uncompressed */
3323
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
3328
/* compressing any other intermediate vertex */
3329
fz = (float) (z - last_z);
3330
gaiaExportF32 (ptr, fz, 1, endian_arch); /* Z */
3333
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
3340
for (ib = 0; ib < polyg->NumInteriors; ib++)
3342
rng = polyg->Interiors + ib;
3343
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
3345
for (iv = 0; iv < rng->Points; iv++)
3349
if (geom->DimensionModel == GAIA_XY_Z)
3351
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
3353
else if (geom->DimensionModel == GAIA_XY_M)
3355
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
3357
else if (geom->DimensionModel == GAIA_XY_Z_M)
3359
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z,
3364
gaiaGetPoint (rng->Coords, iv, &x, &y);
3366
if (iv == 0 || iv == (rng->Points - 1))
3368
/* first and last vertices are uncompressed */
3369
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
3370
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
3375
/* compressing any other intermediate vertex */
3376
fx = (float) (x - last_x);
3377
fy = (float) (y - last_y);
3378
gaiaExportF32 (ptr, fx, 1, endian_arch); /* X */
3379
gaiaExportF32 (ptr + 4, fy, 1, endian_arch); /* Y */
3382
if (geom->DimensionModel == GAIA_XY_Z)
3384
if (iv == 0 || iv == (rng->Points - 1))
3386
/* first and last vertices are uncompressed */
3387
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
3392
/* compressing any other intermediate vertex */
3393
fz = (float) (z - last_z);
3394
gaiaExportF32 (ptr, fz, 1, endian_arch); /* Z */
3398
if (geom->DimensionModel == GAIA_XY_M)
3400
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
3403
if (geom->DimensionModel == GAIA_XY_Z_M)
3405
if (iv == 0 || iv == (rng->Points - 1))
3407
/* first and last vertices are uncompressed */
3408
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
3413
/* compressing any other intermediate vertex */
3414
fz = (float) (z - last_z);
3415
gaiaExportF32 (ptr, fz, 1, endian_arch); /* Z */
3418
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
3426
polyg = polyg->Next;
3428
*ptr = GAIA_MARK_END; /* END signature */
3432
GAIAGEO_DECLARE gaiaGeomCollPtr
3433
gaiaFromWkb (const unsigned char *blob, unsigned int size)
3435
/* decoding from WKB to GEOMETRY */
3438
gaiaGeomCollPtr geo = NULL;
3439
int endian_arch = gaiaEndianArch ();
3442
if (*(blob + 0) == 0x01)
3443
little_endian = GAIA_LITTLE_ENDIAN;
3445
little_endian = GAIA_BIG_ENDIAN;
3446
type = gaiaImport32 (blob + 1, little_endian, endian_arch);
3447
if (type == GAIA_POINTZ || type == GAIA_LINESTRINGZ || type == GAIA_POLYGONZ
3448
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
3449
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
3450
|| type == GAIA_GEOSWKB_POINTZ || type == GAIA_GEOSWKB_LINESTRINGZ
3451
|| type == GAIA_GEOSWKB_POLYGONZ || type == GAIA_GEOSWKB_MULTIPOINTZ
3452
|| type == GAIA_GEOSWKB_MULTILINESTRINGZ
3453
|| type == GAIA_GEOSWKB_MULTIPOLYGONZ
3454
|| type == GAIA_GEOSWKB_GEOMETRYCOLLECTIONZ)
3455
geo = gaiaAllocGeomCollXYZ ();
3456
else if (type == GAIA_POINTM || type == GAIA_LINESTRINGM
3457
|| type == GAIA_POLYGONM || type == GAIA_MULTIPOINTM
3458
|| type == GAIA_MULTILINESTRINGM || type == GAIA_MULTIPOLYGONM
3459
|| type == GAIA_GEOMETRYCOLLECTIONM)
3460
geo = gaiaAllocGeomCollXYM ();
3461
else if (type == GAIA_POINTZM || type == GAIA_LINESTRINGZM
3462
|| type == GAIA_POLYGONZM || type == GAIA_MULTIPOINTZM
3463
|| type == GAIA_MULTILINESTRINGZM || type == GAIA_MULTIPOLYGONZM
3464
|| type == GAIA_GEOMETRYCOLLECTIONZM)
3465
geo = gaiaAllocGeomCollXYZM ();
3467
geo = gaiaAllocGeomColl ();
3469
geo->endian_arch = (char) endian_arch;
3470
geo->endian = (char) little_endian;
3477
ParseWkbPoint (geo);
3480
case GAIA_GEOSWKB_POINTZ:
3481
ParseWkbPointZ (geo);
3484
ParseWkbPointM (geo);
3487
ParseWkbPointZM (geo);
3489
case GAIA_LINESTRING:
3492
case GAIA_LINESTRINGZ:
3493
case GAIA_GEOSWKB_LINESTRINGZ:
3494
ParseWkbLineZ (geo);
3496
case GAIA_LINESTRINGM:
3497
ParseWkbLineM (geo);
3499
case GAIA_LINESTRINGZM:
3500
ParseWkbLineZM (geo);
3503
ParseWkbPolygon (geo);
3506
case GAIA_GEOSWKB_POLYGONZ:
3507
ParseWkbPolygonZ (geo);
3510
ParseWkbPolygonM (geo);
3512
case GAIA_POLYGONZM:
3513
ParseWkbPolygonZM (geo);
3515
case GAIA_MULTIPOINT:
3516
case GAIA_MULTILINESTRING:
3517
case GAIA_MULTIPOLYGON:
3518
case GAIA_GEOMETRYCOLLECTION:
3519
case GAIA_MULTIPOINTZ:
3520
case GAIA_MULTILINESTRINGZ:
3521
case GAIA_MULTIPOLYGONZ:
3522
case GAIA_GEOMETRYCOLLECTIONZ:
3523
case GAIA_GEOSWKB_MULTIPOINTZ:
3524
case GAIA_GEOSWKB_MULTILINESTRINGZ:
3525
case GAIA_GEOSWKB_MULTIPOLYGONZ:
3526
case GAIA_GEOSWKB_GEOMETRYCOLLECTIONZ:
3527
case GAIA_MULTIPOINTM:
3528
case GAIA_MULTILINESTRINGM:
3529
case GAIA_MULTIPOLYGONM:
3530
case GAIA_GEOMETRYCOLLECTIONM:
3531
case GAIA_MULTIPOINTZM:
3532
case GAIA_MULTILINESTRINGZM:
3533
case GAIA_MULTIPOLYGONZM:
3534
case GAIA_GEOMETRYCOLLECTIONZM:
3535
ParseWkbGeometry (geo);
3540
gaiaMbrGeometry (geo);
3545
case GAIA_GEOSWKB_POINTZ:
3548
geo->DeclaredType = GAIA_POINT;
3550
case GAIA_LINESTRING:
3551
case GAIA_LINESTRINGZ:
3552
case GAIA_GEOSWKB_LINESTRINGZ:
3553
case GAIA_LINESTRINGM:
3554
case GAIA_LINESTRINGZM:
3555
geo->DeclaredType = GAIA_LINESTRING;
3559
case GAIA_GEOSWKB_POLYGONZ:
3561
case GAIA_POLYGONZM:
3562
geo->DeclaredType = GAIA_POLYGON;
3564
case GAIA_MULTIPOINT:
3565
case GAIA_MULTIPOINTZ:
3566
case GAIA_GEOSWKB_MULTIPOINTZ:
3567
case GAIA_MULTIPOINTM:
3568
case GAIA_MULTIPOINTZM:
3569
geo->DeclaredType = GAIA_MULTIPOINT;
3571
case GAIA_MULTILINESTRING:
3572
case GAIA_MULTILINESTRINGZ:
3573
case GAIA_GEOSWKB_MULTILINESTRINGZ:
3574
case GAIA_MULTILINESTRINGM:
3575
case GAIA_MULTILINESTRINGZM:
3576
geo->DeclaredType = GAIA_MULTILINESTRING;
3578
case GAIA_MULTIPOLYGON:
3579
case GAIA_MULTIPOLYGONZ:
3580
case GAIA_GEOSWKB_MULTIPOLYGONZ:
3581
case GAIA_MULTIPOLYGONM:
3582
case GAIA_MULTIPOLYGONZM:
3583
geo->DeclaredType = GAIA_MULTIPOLYGON;
3585
case GAIA_GEOMETRYCOLLECTION:
3586
case GAIA_GEOMETRYCOLLECTIONZ:
3587
case GAIA_GEOSWKB_GEOMETRYCOLLECTIONZ:
3588
case GAIA_GEOMETRYCOLLECTIONM:
3589
case GAIA_GEOMETRYCOLLECTIONZM:
3590
geo->DeclaredType = GAIA_GEOMETRYCOLLECTION;
3596
GAIAGEO_DECLARE char *
3597
gaiaToHexWkb (gaiaGeomCollPtr geom)
3599
/* builds the hexadecimal WKB representation for this GEOMETRY */
3600
unsigned char *wkb = NULL;
3602
char *hexbuf = NULL;
3606
gaiaToWkb (geom, &wkb, &size);
3609
hexbuf = malloc ((size * 2) + 1);
3611
for (i = 0; i < size; i++)
3613
sprintf (hex, "%02X", *(wkb + i));
3621
GAIAGEO_DECLARE void
3622
gaiaToWkb (gaiaGeomCollPtr geom, unsigned char **result, int *size)
3624
/* builds the WKB representation for this GEOMETRY */
3633
int n_linestrings = 0;
3638
gaiaLinestringPtr ln;
3641
gaiaPointPtr point = NULL;
3642
gaiaLinestringPtr line = NULL;
3643
gaiaPolygonPtr polyg = NULL;
3644
int endian_arch = gaiaEndianArch ();
3645
gaiaMbrGeometry (geom);
3646
/* how many entities, and of what kind, do we have ? */
3647
pt = geom->FirstPoint;
3655
ln = geom->FirstLinestring;
3663
pg = geom->FirstPolygon;
3673
if (n_points == 0 && n_polygons == 0 && n_linestrings == 0)
3675
/* ok, we can determine the geometry class */
3676
if (n_points == 1 && n_linestrings == 0 && n_polygons == 0)
3678
if (geom->DeclaredType == GAIA_MULTIPOINT)
3680
if (geom->DimensionModel == GAIA_XY_Z)
3681
type = GAIA_MULTIPOINTZ;
3682
else if (geom->DimensionModel == GAIA_XY_M)
3683
type = GAIA_MULTIPOINTM;
3684
else if (geom->DimensionModel == GAIA_XY_Z_M)
3685
type = GAIA_MULTIPOINTZM;
3687
type = GAIA_MULTIPOINT;
3689
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
3691
if (geom->DimensionModel == GAIA_XY_Z)
3692
type = GAIA_GEOMETRYCOLLECTIONZ;
3693
else if (geom->DimensionModel == GAIA_XY_M)
3694
type = GAIA_GEOMETRYCOLLECTIONM;
3695
else if (geom->DimensionModel == GAIA_XY_Z_M)
3696
type = GAIA_GEOMETRYCOLLECTIONZM;
3698
type = GAIA_GEOMETRYCOLLECTION;
3702
if (geom->DimensionModel == GAIA_XY_Z)
3704
else if (geom->DimensionModel == GAIA_XY_M)
3706
else if (geom->DimensionModel == GAIA_XY_Z_M)
3707
type = GAIA_POINTZM;
3712
else if (n_points > 1 && n_linestrings == 0 && n_polygons == 0)
3714
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
3716
if (geom->DimensionModel == GAIA_XY_Z)
3717
type = GAIA_GEOMETRYCOLLECTIONZ;
3718
else if (geom->DimensionModel == GAIA_XY_M)
3719
type = GAIA_GEOMETRYCOLLECTIONM;
3720
else if (geom->DimensionModel == GAIA_XY_Z_M)
3721
type = GAIA_GEOMETRYCOLLECTIONZM;
3723
type = GAIA_GEOMETRYCOLLECTION;
3727
if (geom->DimensionModel == GAIA_XY_Z)
3728
type = GAIA_MULTIPOINTZ;
3729
else if (geom->DimensionModel == GAIA_XY_M)
3730
type = GAIA_MULTIPOINTM;
3731
else if (geom->DimensionModel == GAIA_XY_Z_M)
3732
type = GAIA_MULTIPOINTZM;
3734
type = GAIA_MULTIPOINT;
3737
else if (n_points == 0 && n_linestrings == 1 && n_polygons == 0)
3739
if (geom->DeclaredType == GAIA_MULTILINESTRING)
3741
if (geom->DimensionModel == GAIA_XY_Z)
3742
type = GAIA_MULTILINESTRINGZ;
3743
else if (geom->DimensionModel == GAIA_XY_M)
3744
type = GAIA_MULTILINESTRINGM;
3745
else if (geom->DimensionModel == GAIA_XY_Z_M)
3746
type = GAIA_MULTILINESTRINGZM;
3748
type = GAIA_MULTILINESTRING;
3750
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
3752
if (geom->DimensionModel == GAIA_XY_Z)
3753
type = GAIA_GEOMETRYCOLLECTIONZ;
3754
else if (geom->DimensionModel == GAIA_XY_M)
3755
type = GAIA_GEOMETRYCOLLECTIONM;
3756
else if (geom->DimensionModel == GAIA_XY_Z_M)
3757
type = GAIA_GEOMETRYCOLLECTIONZM;
3759
type = GAIA_GEOMETRYCOLLECTION;
3763
if (geom->DimensionModel == GAIA_XY_Z)
3764
type = GAIA_LINESTRINGZ;
3765
else if (geom->DimensionModel == GAIA_XY_M)
3766
type = GAIA_LINESTRINGM;
3767
else if (geom->DimensionModel == GAIA_XY_Z_M)
3768
type = GAIA_LINESTRINGZM;
3770
type = GAIA_LINESTRING;
3773
else if (n_points == 0 && n_linestrings > 1 && n_polygons == 0)
3775
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
3777
if (geom->DimensionModel == GAIA_XY_Z)
3778
type = GAIA_GEOMETRYCOLLECTIONZ;
3779
else if (geom->DimensionModel == GAIA_XY_M)
3780
type = GAIA_GEOMETRYCOLLECTIONM;
3781
else if (geom->DimensionModel == GAIA_XY_Z_M)
3782
type = GAIA_GEOMETRYCOLLECTIONZM;
3784
type = GAIA_GEOMETRYCOLLECTION;
3788
if (geom->DimensionModel == GAIA_XY_Z)
3789
type = GAIA_MULTILINESTRINGZ;
3790
else if (geom->DimensionModel == GAIA_XY_M)
3791
type = GAIA_MULTILINESTRINGM;
3792
else if (geom->DimensionModel == GAIA_XY_Z_M)
3793
type = GAIA_MULTILINESTRINGZM;
3795
type = GAIA_MULTILINESTRING;
3798
else if (n_points == 0 && n_linestrings == 0 && n_polygons == 1)
3800
if (geom->DeclaredType == GAIA_MULTIPOLYGON)
3802
if (geom->DimensionModel == GAIA_XY_Z)
3803
type = GAIA_MULTIPOLYGONZ;
3804
else if (geom->DimensionModel == GAIA_XY_M)
3805
type = GAIA_MULTIPOLYGONM;
3806
else if (geom->DimensionModel == GAIA_XY_Z_M)
3807
type = GAIA_MULTIPOLYGONZM;
3809
type = GAIA_MULTIPOLYGON;
3811
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
3813
if (geom->DimensionModel == GAIA_XY_Z)
3814
type = GAIA_GEOMETRYCOLLECTIONZ;
3815
else if (geom->DimensionModel == GAIA_XY_M)
3816
type = GAIA_GEOMETRYCOLLECTIONM;
3817
else if (geom->DimensionModel == GAIA_XY_Z_M)
3818
type = GAIA_GEOMETRYCOLLECTIONZM;
3820
type = GAIA_GEOMETRYCOLLECTION;
3824
if (geom->DimensionModel == GAIA_XY_Z)
3825
type = GAIA_POLYGONZ;
3826
else if (geom->DimensionModel == GAIA_XY_M)
3827
type = GAIA_POLYGONM;
3828
else if (geom->DimensionModel == GAIA_XY_Z_M)
3829
type = GAIA_POLYGONZM;
3831
type = GAIA_POLYGON;
3834
else if (n_points == 0 && n_linestrings == 0 && n_polygons > 1)
3836
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
3838
if (geom->DimensionModel == GAIA_XY_Z)
3839
type = GAIA_GEOMETRYCOLLECTIONZ;
3840
else if (geom->DimensionModel == GAIA_XY_M)
3841
type = GAIA_GEOMETRYCOLLECTIONM;
3842
else if (geom->DimensionModel == GAIA_XY_Z_M)
3843
type = GAIA_GEOMETRYCOLLECTIONZM;
3845
type = GAIA_GEOMETRYCOLLECTION;
3849
if (geom->DimensionModel == GAIA_XY_Z)
3850
type = GAIA_MULTIPOLYGONZ;
3851
else if (geom->DimensionModel == GAIA_XY_M)
3852
type = GAIA_MULTIPOLYGONM;
3853
else if (geom->DimensionModel == GAIA_XY_Z_M)
3854
type = GAIA_MULTIPOLYGONZM;
3856
type = GAIA_MULTIPOLYGON;
3861
if (geom->DimensionModel == GAIA_XY_Z)
3862
type = GAIA_GEOMETRYCOLLECTIONZ;
3863
else if (geom->DimensionModel == GAIA_XY_M)
3864
type = GAIA_GEOMETRYCOLLECTIONM;
3865
else if (geom->DimensionModel == GAIA_XY_Z_M)
3866
type = GAIA_GEOMETRYCOLLECTIONZM;
3868
type = GAIA_GEOMETRYCOLLECTION;
3870
/* and now we compute the size of WKB */
3871
*size = 5; /* header size */
3872
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
3873
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION
3874
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
3875
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
3876
|| type == GAIA_MULTIPOINTM || type == GAIA_MULTILINESTRINGM
3877
|| type == GAIA_MULTIPOLYGONM || type == GAIA_GEOMETRYCOLLECTIONM
3878
|| type == GAIA_MULTIPOINTZM || type == GAIA_MULTILINESTRINGZM
3879
|| type == GAIA_MULTIPOLYGONZM || type == GAIA_GEOMETRYCOLLECTIONZM)
3881
point = geom->FirstPoint;
3884
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
3885
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION
3886
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
3887
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
3888
|| type == GAIA_MULTIPOINTM || type == GAIA_MULTILINESTRINGM
3889
|| type == GAIA_MULTIPOLYGONM || type == GAIA_GEOMETRYCOLLECTIONM
3890
|| type == GAIA_MULTIPOINTZM || type == GAIA_MULTILINESTRINGZM
3891
|| type == GAIA_MULTIPOLYGONZM
3892
|| type == GAIA_GEOMETRYCOLLECTIONZM)
3894
if (geom->DimensionModel == GAIA_XY_Z
3895
|| geom->DimensionModel == GAIA_XY_M)
3896
*size += (sizeof (double) * 3); /* three doubles for each POINT */
3897
else if (geom->DimensionModel == GAIA_XY_Z_M)
3898
*size += (sizeof (double) * 4); /* four doubles for each POINT */
3900
*size += (sizeof (double) * 2); /* two doubles for each POINT */
3901
point = point->Next;
3903
line = geom->FirstLinestring;
3906
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
3907
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION
3908
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
3909
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
3910
|| type == GAIA_MULTIPOINTM || type == GAIA_MULTILINESTRINGM
3911
|| type == GAIA_MULTIPOLYGONM || type == GAIA_GEOMETRYCOLLECTIONM
3912
|| type == GAIA_MULTIPOINTZM || type == GAIA_MULTILINESTRINGZM
3913
|| type == GAIA_MULTIPOLYGONZM
3914
|| type == GAIA_GEOMETRYCOLLECTIONZM)
3916
if (geom->DimensionModel == GAIA_XY_Z
3917
|| geom->DimensionModel == GAIA_XY_M)
3918
*size += (4 + ((sizeof (double) * 3) * line->Points)); /* # points + [x,y,z] for each vertex */
3919
else if (geom->DimensionModel == GAIA_XY_Z_M)
3920
*size += (4 + ((sizeof (double) * 4) * line->Points)); /* # points + [x,y,z,m] for each vertex */
3922
*size += (4 + ((sizeof (double) * 2) * line->Points)); /* # points + [x,y] for each vertex */
3925
polyg = geom->FirstPolygon;
3928
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
3929
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION
3930
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
3931
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
3932
|| type == GAIA_MULTIPOINTM || type == GAIA_MULTILINESTRINGM
3933
|| type == GAIA_MULTIPOLYGONM || type == GAIA_GEOMETRYCOLLECTIONM
3934
|| type == GAIA_MULTIPOINTZM || type == GAIA_MULTILINESTRINGZM
3935
|| type == GAIA_MULTIPOLYGONZM
3936
|| type == GAIA_GEOMETRYCOLLECTIONZM)
3938
rng = polyg->Exterior;
3939
if (geom->DimensionModel == GAIA_XY_Z
3940
|| geom->DimensionModel == GAIA_XY_M)
3941
*size += (8 + ((sizeof (double) * 3) * rng->Points)); /* # rings + # points + [x,y,z] array - exterior ring */
3942
else if (geom->DimensionModel == GAIA_XY_Z_M)
3943
*size += (8 + ((sizeof (double) * 4) * rng->Points)); /* # rings + # points + [x,y,z,m] array - exterior ring */
3945
*size += (8 + ((sizeof (double) * 2) * rng->Points)); /* # rings + # points + [x,y] array - exterior ring */
3946
for (ib = 0; ib < polyg->NumInteriors; ib++)
3948
rng = polyg->Interiors + ib;
3949
if (geom->DimensionModel == GAIA_XY_Z
3950
|| geom->DimensionModel == GAIA_XY_M)
3951
*size += (4 + ((sizeof (double) * 3) * rng->Points)); /* # points + [x,y,z] array - interior ring */
3952
else if (geom->DimensionModel == GAIA_XY_Z_M)
3953
*size += (4 + ((sizeof (double) * 4) * rng->Points)); /* # points + [x,y,z,m] array - interior ring */
3955
*size += (4 + ((sizeof (double) * 2) * rng->Points)); /* # points + [x,y] array - interior ring */
3957
polyg = polyg->Next;
3959
*result = malloc (*size);
3961
/* and finally we build the WKB */
3962
*ptr = 0x01; /* little endian byte order */
3963
gaiaExport32 (ptr + 1, type, 1, endian_arch); /* the main CLASS TYPE */
3965
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
3966
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION
3967
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
3968
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
3969
|| type == GAIA_MULTIPOINTM || type == GAIA_MULTILINESTRINGM
3970
|| type == GAIA_MULTIPOLYGONM || type == GAIA_GEOMETRYCOLLECTIONM
3971
|| type == GAIA_MULTIPOINTZM || type == GAIA_MULTILINESTRINGZM
3972
|| type == GAIA_MULTIPOLYGONZM || type == GAIA_GEOMETRYCOLLECTIONZM)
3974
gaiaExport32 (ptr, entities, 1, endian_arch); /* it's a collection; # entities */
3977
point = geom->FirstPoint;
3980
if (type == GAIA_MULTIPOINT || type == GAIA_GEOMETRYCOLLECTION
3981
|| type == GAIA_MULTIPOINTZ || type == GAIA_GEOMETRYCOLLECTIONZ
3982
|| type == GAIA_MULTIPOINTM || type == GAIA_GEOMETRYCOLLECTIONM
3983
|| type == GAIA_MULTIPOINTZM || type == GAIA_GEOMETRYCOLLECTIONZM)
3986
/* it's a collection: the CLASS TYPE for this element */
3987
if (type == GAIA_MULTIPOINTZ
3988
|| type == GAIA_GEOMETRYCOLLECTIONZ)
3989
gaiaExport32 (ptr + 1, GAIA_POINTZ, 1, endian_arch);
3990
else if (type == GAIA_MULTIPOINTM
3991
|| type == GAIA_GEOMETRYCOLLECTIONM)
3992
gaiaExport32 (ptr + 1, GAIA_POINTM, 1, endian_arch);
3993
else if (type == GAIA_MULTIPOINTZM
3994
|| type == GAIA_GEOMETRYCOLLECTIONZM)
3995
gaiaExport32 (ptr + 1, GAIA_POINTZM, 1, endian_arch);
3997
gaiaExport32 (ptr + 1, GAIA_POINT, 1, endian_arch);
4000
gaiaExport64 (ptr, point->X, 1, endian_arch); /* X */
4001
gaiaExport64 (ptr + 8, point->Y, 1, endian_arch); /* Y */
4003
if (type == GAIA_POINTZ || type == GAIA_MULTIPOINTZ
4004
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4006
gaiaExport64 (ptr, point->Z, 1, endian_arch); /* Z */
4009
if (type == GAIA_POINTM || type == GAIA_MULTIPOINTM
4010
|| type == GAIA_GEOMETRYCOLLECTIONM)
4012
gaiaExport64 (ptr, point->M, 1, endian_arch); /* M */
4015
if (type == GAIA_POINTZM || type == GAIA_MULTIPOINTZM
4016
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4018
gaiaExport64 (ptr, point->Z, 1, endian_arch); /* Z */
4019
gaiaExport64 (ptr + 8, point->M, 1, endian_arch); /* M */
4022
point = point->Next;
4024
line = geom->FirstLinestring;
4027
if (type == GAIA_MULTILINESTRING || type == GAIA_GEOMETRYCOLLECTION
4028
|| type == GAIA_MULTILINESTRINGZ
4029
|| type == GAIA_GEOMETRYCOLLECTIONZ
4030
|| type == GAIA_MULTILINESTRINGM
4031
|| type == GAIA_GEOMETRYCOLLECTIONM
4032
|| type == GAIA_MULTILINESTRINGZM
4033
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4036
/* it's a collection: the CLASS TYPE for this element */
4037
if (type == GAIA_MULTILINESTRINGZ
4038
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4039
gaiaExport32 (ptr + 1, GAIA_LINESTRINGZ, 1, endian_arch);
4040
else if (type == GAIA_MULTILINESTRINGM
4041
|| type == GAIA_GEOMETRYCOLLECTIONM)
4042
gaiaExport32 (ptr + 1, GAIA_LINESTRINGM, 1, endian_arch);
4043
else if (type == GAIA_MULTILINESTRINGZM
4044
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4045
gaiaExport32 (ptr + 1, GAIA_LINESTRINGZM, 1, endian_arch);
4047
gaiaExport32 (ptr + 1, GAIA_LINESTRING, 1, endian_arch);
4050
gaiaExport32 (ptr, line->Points, 1, endian_arch); /* # points */
4052
for (iv = 0; iv < line->Points; iv++)
4054
if (type == GAIA_LINESTRINGZ || type == GAIA_MULTILINESTRINGZ
4055
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4057
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
4059
else if (type == GAIA_LINESTRINGM
4060
|| type == GAIA_MULTILINESTRINGM
4061
|| type == GAIA_GEOMETRYCOLLECTIONM)
4063
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
4065
else if (type == GAIA_LINESTRINGZM
4066
|| type == GAIA_MULTILINESTRINGZM
4067
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4069
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
4073
gaiaGetPoint (line->Coords, iv, &x, &y);
4075
gaiaExport64 (ptr, x, 1, endian_arch); /* X */
4076
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y */
4078
if (type == GAIA_LINESTRINGZ || type == GAIA_MULTILINESTRINGZ
4079
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4081
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
4084
if (type == GAIA_LINESTRINGM || type == GAIA_MULTILINESTRINGM
4085
|| type == GAIA_GEOMETRYCOLLECTIONM)
4087
gaiaExport64 (ptr, m, 1, endian_arch); /* M */
4090
if (type == GAIA_LINESTRINGZM || type == GAIA_MULTILINESTRINGZM
4091
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4093
gaiaExport64 (ptr, z, 1, endian_arch); /* Z */
4094
gaiaExport64 (ptr + 8, m, 1, endian_arch); /* M */
4100
polyg = geom->FirstPolygon;
4103
if (type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION
4104
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ
4105
|| type == GAIA_MULTIPOLYGONM || type == GAIA_GEOMETRYCOLLECTIONM
4106
|| type == GAIA_MULTIPOLYGONZM
4107
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4110
/* it's a collection: the CLASS TYPE for this element */
4111
if (type == GAIA_MULTIPOLYGONZ
4112
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4113
gaiaExport32 (ptr + 1, GAIA_POLYGONZ, 1, endian_arch);
4114
else if (type == GAIA_MULTIPOLYGONM
4115
|| type == GAIA_GEOMETRYCOLLECTIONM)
4116
gaiaExport32 (ptr + 1, GAIA_POLYGONM, 1, endian_arch);
4117
else if (type == GAIA_MULTIPOLYGONZM
4118
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4119
gaiaExport32 (ptr + 1, GAIA_POLYGONZM, 1, endian_arch);
4121
gaiaExport32 (ptr + 1, GAIA_POLYGON, 1, endian_arch);
4124
gaiaExport32 (ptr, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
4125
rng = polyg->Exterior;
4126
gaiaExport32 (ptr + 4, rng->Points, 1, endian_arch); /* # points - exterior ring */
4128
for (iv = 0; iv < rng->Points; iv++)
4130
if (type == GAIA_POLYGONZ || type == GAIA_MULTIPOLYGONZ
4131
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4133
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
4135
else if (type == GAIA_POLYGONM || type == GAIA_MULTIPOLYGONM
4136
|| type == GAIA_GEOMETRYCOLLECTIONM)
4138
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
4140
else if (type == GAIA_POLYGONZM || type == GAIA_MULTIPOLYGONZM
4141
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4143
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
4147
gaiaGetPoint (rng->Coords, iv, &x, &y);
4149
gaiaExport64 (ptr, x, 1, endian_arch); /* X - exterior ring */
4150
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - exterior ring */
4152
if (type == GAIA_POLYGONZ || type == GAIA_MULTIPOLYGONZ
4153
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4155
gaiaExport64 (ptr, z, 1, endian_arch); /* Z - exterior ring */
4158
if (type == GAIA_POLYGONM || type == GAIA_MULTIPOLYGONM
4159
|| type == GAIA_GEOMETRYCOLLECTIONM)
4161
gaiaExport64 (ptr, m, 1, endian_arch); /* M - exterior ring */
4164
if (type == GAIA_POLYGONZM || type == GAIA_MULTIPOLYGONZM
4165
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4167
gaiaExport64 (ptr, z, 1, endian_arch); /* Z - exterior ring */
4168
gaiaExport64 (ptr + 8, m, 1, endian_arch); /* M - exterior ring */
4172
for (ib = 0; ib < polyg->NumInteriors; ib++)
4174
rng = polyg->Interiors + ib;
4175
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
4177
for (iv = 0; iv < rng->Points; iv++)
4179
if (type == GAIA_POLYGONZ || type == GAIA_MULTIPOLYGONZ
4180
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4182
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
4184
else if (type == GAIA_POLYGONM
4185
|| type == GAIA_MULTIPOLYGONM
4186
|| type == GAIA_GEOMETRYCOLLECTIONM)
4188
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
4190
else if (type == GAIA_POLYGONZM
4191
|| type == GAIA_MULTIPOLYGONZM
4192
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4194
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
4198
gaiaGetPoint (rng->Coords, iv, &x, &y);
4200
gaiaExport64 (ptr, x, 1, endian_arch); /* X - interior ring */
4201
gaiaExport64 (ptr + 8, y, 1, endian_arch); /* Y - interior ring */
4203
if (type == GAIA_POLYGONZ || type == GAIA_MULTIPOLYGONZ
4204
|| type == GAIA_GEOMETRYCOLLECTIONZ)
4206
gaiaExport64 (ptr, z, 1, endian_arch); /* Z - exterior ring */
4209
if (type == GAIA_POLYGONM || type == GAIA_MULTIPOLYGONM
4210
|| type == GAIA_GEOMETRYCOLLECTIONM)
4212
gaiaExport64 (ptr, m, 1, endian_arch); /* M - exterior ring */
4215
if (type == GAIA_POLYGONZM || type == GAIA_MULTIPOLYGONZM
4216
|| type == GAIA_GEOMETRYCOLLECTIONZM)
4218
gaiaExport64 (ptr, z, 1, endian_arch); /* Z - exterior ring */
4219
gaiaExport64 (ptr + 8, m, 1, endian_arch); /* M - exterior ring */
4224
polyg = polyg->Next;
4229
ewkbGetPoint (gaiaGeomCollPtr geom, unsigned char *blob,
4230
int offset, int blob_size, int endian, int endian_arch, int dims)
4232
/* decodes a POINT from PostGIS EWKB binary GEOMETRY */
4240
if (blob_size < offset + 32)
4245
if (blob_size < offset + 24)
4249
if (blob_size < offset + 16)
4253
x = gaiaImport64 (blob + offset, endian, endian_arch);
4255
y = gaiaImport64 (blob + offset, endian, endian_arch);
4257
if (dims == GAIA_XY_Z_M)
4259
z = gaiaImport64 (blob + offset, endian, endian_arch);
4261
m = gaiaImport64 (blob + offset, endian, endian_arch);
4263
gaiaAddPointToGeomCollXYZM (geom, x, y, z, m);
4265
else if (dims == GAIA_XY_Z)
4267
z = gaiaImport64 (blob + offset, endian, endian_arch);
4269
gaiaAddPointToGeomCollXYZ (geom, x, y, z);
4271
else if (dims == GAIA_XY_M)
4273
m = gaiaImport64 (blob + offset, endian, endian_arch);
4275
gaiaAddPointToGeomCollXYM (geom, x, y, m);
4278
gaiaAddPointToGeomColl (geom, x, y);
4283
ewkbGetLinestring (gaiaGeomCollPtr geom, unsigned char *blob,
4284
int offset, int blob_size, int endian,
4285
int endian_arch, int dims)
4287
/* decodes a LINESTRING from PostGIS binary GEOMETRY */
4294
gaiaLinestringPtr ln;
4295
if (blob_size < offset + 4)
4297
npoints = gaiaImport32 (blob + offset, endian, endian_arch);
4302
if (blob_size < offset + (32 * npoints))
4307
if (blob_size < offset + (24 * npoints))
4311
if (blob_size < offset + (16 * npoints))
4315
ln = gaiaAddLinestringToGeomColl (geom, npoints);
4316
for (iv = 0; iv < npoints; iv++)
4318
x = gaiaImport64 (blob + offset, endian, endian_arch);
4320
y = gaiaImport64 (blob + offset, endian, endian_arch);
4322
if (dims == GAIA_XY_Z_M)
4324
z = gaiaImport64 (blob + offset, endian, endian_arch);
4326
m = gaiaImport64 (blob + offset, endian, endian_arch);
4328
gaiaSetPointXYZM (ln->Coords, iv, x, y, z, m);
4330
else if (dims == GAIA_XY_Z)
4332
z = gaiaImport64 (blob + offset, endian, endian_arch);
4334
gaiaSetPointXYZ (ln->Coords, iv, x, y, z);
4336
else if (dims == GAIA_XY_M)
4338
m = gaiaImport64 (blob + offset, endian, endian_arch);
4340
gaiaSetPointXYM (ln->Coords, iv, x, y, m);
4343
gaiaSetPoint (ln->Coords, iv, x, y);
4349
ewkbGetPolygon (gaiaGeomCollPtr geom, unsigned char *blob,
4350
int offset, int blob_size, int endian,
4351
int endian_arch, int dims)
4353
/* decodes a POLYGON from PostGIS binary GEOMETRY */
4362
gaiaPolygonPtr polyg = NULL;
4364
if (blob_size < offset + 4)
4366
rings = gaiaImport32 (blob + offset, endian, endian_arch);
4368
for (ib = 0; ib < rings; ib++)
4370
if (blob_size < offset + 4)
4372
npoints = gaiaImport32 (blob + offset, endian, endian_arch);
4377
if (blob_size < offset + (32 * npoints))
4382
if (blob_size < offset + (24 * npoints))
4386
if (blob_size < offset + (16 * npoints))
4392
polyg = gaiaAddPolygonToGeomColl (geom, npoints, rings - 1);
4393
rng = polyg->Exterior;
4396
rng = gaiaAddInteriorRing (polyg, ib - 1, npoints);
4397
for (iv = 0; iv < npoints; iv++)
4399
x = gaiaImport64 (blob + offset, endian, endian_arch);
4401
y = gaiaImport64 (blob + offset, endian, endian_arch);
4403
if (dims == GAIA_XY_Z_M)
4405
z = gaiaImport64 (blob + offset, endian, endian_arch);
4407
m = gaiaImport64 (blob + offset, endian, endian_arch);
4409
gaiaSetPointXYZM (rng->Coords, iv, x, y, z, m);
4411
else if (dims == GAIA_XY_Z)
4413
z = gaiaImport64 (blob + offset, endian, endian_arch);
4415
gaiaSetPointXYZ (rng->Coords, iv, x, y, z);
4417
else if (dims == GAIA_XY_M)
4419
m = gaiaImport64 (blob + offset, endian, endian_arch);
4421
gaiaSetPointXYM (rng->Coords, iv, x, y, m);
4424
gaiaSetPoint (rng->Coords, iv, x, y);
4431
ewkbGetMultiGeometry (gaiaGeomCollPtr geom, unsigned char *blob,
4432
int offset, int blob_size, int endian,
4433
int endian_arch, int dims)
4435
/* decodes a MultiGeometry from PostGIS EWKB binary GEOMETRY */
4438
unsigned char xtype[4];
4441
if (blob_size < offset + 4)
4443
entities = gaiaImport32 (blob + offset, endian, endian_arch);
4445
for (ie = 0; ie < entities; ie++)
4447
if (blob_size < offset + 5)
4449
memcpy (xtype, blob + offset + 1, 4);
4454
type = gaiaImport32 (xtype, endian, endian_arch);
4460
ewkbGetPoint (geom, blob, offset, blob_size, endian,
4466
case GAIA_LINESTRING:
4468
ewkbGetLinestring (geom, blob, offset, blob_size, endian,
4476
ewkbGetPolygon (geom, blob, offset, blob_size, endian,
4487
parseHexEwkbByte (const unsigned char high, const unsigned char low,
4488
unsigned char *byte)
4490
/* parsing an Hexadecimal byte */
4614
static unsigned char *
4615
parseHexEWKB (const unsigned char *blob_hex, int *blob_size)
4617
/* parsing an Hexadecimal EWKB Geometry */
4618
unsigned char *blob;
4619
unsigned char *p_out;
4620
const unsigned char *p_in;
4625
int len = strlen ((const char *) blob_hex);
4627
if (size * 2 != len)
4629
blob = malloc (size);
4635
while (*p_in != '\0')
4639
if (!parseHexEwkbByte (high, low, &hex))
4651
gaiaFromEWKB (const unsigned char *in_buffer)
4653
/* creates a Gaia own Geometry from GEOS/PostGIS EWKB */
4654
unsigned char *blob;
4656
unsigned char xtype[4];
4657
unsigned char xdims;
4664
int endian_arch = gaiaEndianArch ();
4665
gaiaGeomCollPtr geom = NULL;
4666
blob = parseHexEWKB (in_buffer, &blob_size);
4671
if (*(blob + 0) == 0x01)
4675
memcpy (xtype, blob + 1, 4);
4686
type = gaiaImport32 (xtype, endian, endian_arch);
4694
geom = gaiaAllocGeomCollXYZM ();
4699
geom = gaiaAllocGeomCollXYM ();
4704
geom = gaiaAllocGeomCollXYZ ();
4709
geom = gaiaAllocGeomColl ();
4711
srid = gaiaImport32 (blob + 5, endian, endian_arch);
4713
if (geom->Srid <= 0)
4718
ewkbGetPoint (geom, blob, 9, blob_size, endian, endian_arch, dims);
4720
case GAIA_LINESTRING:
4721
ewkbGetLinestring (geom, blob, 9, blob_size, endian, endian_arch,
4725
ewkbGetPolygon (geom, blob, 9, blob_size, endian, endian_arch, dims);
4728
ewkbGetMultiGeometry (geom, blob, 9, blob_size, endian, endian_arch,
4736
GAIAGEO_DECLARE void
4737
gaiaToEWKB (gaiaOutBufferPtr out_buf, gaiaGeomCollPtr geom)
4739
/* prints the GEOS/PostGIS EWKB text representation of current geometry */
4741
unsigned char endian_buf[16];
4748
int n_linestrings = 0;
4757
int endian_arch = gaiaEndianArch ();
4759
gaiaLinestringPtr ln;
4762
gaiaPointPtr point = NULL;
4763
gaiaLinestringPtr line = NULL;
4764
gaiaPolygonPtr polyg = NULL;
4766
/* precomputing the required size */
4767
sprintf (buf, "SRID=%d;", geom->Srid);
4768
size = strlen (buf); /* the header size */
4769
size++; /* terminating '\0' */
4770
pt = geom->FirstPoint;
4778
ln = geom->FirstLinestring;
4786
pg = geom->FirstPolygon;
4794
if (n_points == 0 && n_polygons == 0 && n_linestrings == 0)
4796
/* ok, we can determine the geometry class */
4797
if (n_points == 1 && n_linestrings == 0 && n_polygons == 0)
4799
if (geom->DeclaredType == GAIA_MULTIPOINT)
4800
type = GAIA_MULTIPOINT;
4801
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
4802
type = GAIA_GEOMETRYCOLLECTION;
4806
else if (n_points > 1 && n_linestrings == 0 && n_polygons == 0)
4808
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
4809
type = GAIA_GEOMETRYCOLLECTION;
4811
type = GAIA_MULTIPOINT;
4813
else if (n_points == 0 && n_linestrings == 1 && n_polygons == 0)
4815
if (geom->DeclaredType == GAIA_MULTILINESTRING)
4816
type = GAIA_MULTILINESTRING;
4817
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
4818
type = GAIA_GEOMETRYCOLLECTION;
4820
type = GAIA_LINESTRING;
4822
else if (n_points == 0 && n_linestrings > 1 && n_polygons == 0)
4824
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
4825
type = GAIA_GEOMETRYCOLLECTION;
4827
type = GAIA_MULTILINESTRING;
4829
else if (n_points == 0 && n_linestrings == 0 && n_polygons == 1)
4831
if (geom->DeclaredType == GAIA_MULTIPOLYGON)
4832
type = GAIA_MULTIPOLYGON;
4833
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
4834
type = GAIA_GEOMETRYCOLLECTION;
4836
type = GAIA_POLYGON;
4838
else if (n_points == 0 && n_linestrings == 0 && n_polygons > 1)
4840
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
4841
type = GAIA_GEOMETRYCOLLECTION;
4843
type = GAIA_MULTIPOLYGON;
4846
type = GAIA_GEOMETRYCOLLECTION;
4847
/* and now we compute the size of EWKB */
4848
size += 10; /* header size */
4849
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
4850
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
4852
point = geom->FirstPoint;
4855
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
4856
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
4858
if (geom->DimensionModel == GAIA_XY_Z
4859
|| geom->DimensionModel == GAIA_XY_M)
4860
size += 48; /* three doubles for each POINT */
4861
else if (geom->DimensionModel == GAIA_XY_Z_M)
4862
size += 64; /* four doubles for each POINT */
4864
size += 32; /* two doubles for each POINT */
4865
point = point->Next;
4867
line = geom->FirstLinestring;
4870
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
4871
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
4873
if (geom->DimensionModel == GAIA_XY_Z
4874
|| geom->DimensionModel == GAIA_XY_M)
4875
size += 8 + (line->Points * 48); /* three doubles for each VERTEX */
4876
else if (geom->DimensionModel == GAIA_XY_Z_M)
4877
size += 8 + (line->Points * 64); /* four doubles for each VERTEX */
4879
size += 8 + (line->Points * 32); /* two doubles for each VERTEX */
4882
polyg = geom->FirstPolygon;
4885
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
4886
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
4888
rng = polyg->Exterior;
4889
if (geom->DimensionModel == GAIA_XY_Z
4890
|| geom->DimensionModel == GAIA_XY_M)
4891
size += 16 + (rng->Points * 48); /* three doubles for each VERTEX */
4892
else if (geom->DimensionModel == GAIA_XY_Z_M)
4893
size += 16 + (rng->Points * 64); /* four doubles for each VERTEX */
4895
size += 16 + (rng->Points * 32); /* two doubles for each VERTEX */
4896
for (ib = 0; ib < polyg->NumInteriors; ib++)
4898
rng = polyg->Interiors + ib;
4899
if (geom->DimensionModel == GAIA_XY_Z
4900
|| geom->DimensionModel == GAIA_XY_M)
4901
size += 8 + (rng->Points * 48); /* three doubles for each VERTEX */
4902
else if (geom->DimensionModel == GAIA_XY_Z_M)
4903
size += 8 + (rng->Points * 64); /* four doubles for each VERTEX */
4905
size += 8 + (rng->Points * 32); /* two doubles for each VERTEX */
4907
polyg = polyg->Next;
4909
/* and finally we build the EWKB expression */
4910
sprintf (buf, "SRID=%d;", geom->Srid);
4911
gaiaAppendToOutBuffer (out_buf, buf);
4914
*ptr++ = '0'; /* little endian byte order */
4916
gaiaExport32 (endian_buf, type, 1, endian_arch); /* the main CLASS TYPE */
4917
for (i = 0; i < 3; i++)
4919
/* CAVEAT: the 4th byte in PostGIS encodes M/Z presence !!!! */
4920
sprintf (byte, "%02X", endian_buf[i]);
4924
/* marking M/Z presence */
4925
if (geom->DimensionModel == GAIA_XY_Z)
4927
else if (geom->DimensionModel == GAIA_XY_M)
4929
else if (geom->DimensionModel == GAIA_XY_Z_M)
4935
gaiaAppendToOutBuffer (out_buf, buf);
4937
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
4938
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
4940
gaiaExport32 (endian_buf, entities, 1, endian_arch); /* it's a collection; # entities */
4941
for (i = 0; i < 4; i++)
4943
sprintf (byte, "%02X", endian_buf[i]);
4948
point = geom->FirstPoint;
4951
if ((ptr - buf) > 1024)
4953
/* flushing the internal buffer */
4955
gaiaAppendToOutBuffer (out_buf, buf);
4958
if (type == GAIA_MULTIPOINT || type == GAIA_GEOMETRYCOLLECTION)
4962
/* it's a collection: the CLASS TYPE for this element */
4963
gaiaExport32 (endian_buf, GAIA_POINT, 1, endian_arch);
4964
for (i = 0; i < 3; i++)
4966
/* CAVEAT: the 4th byte in PostGIS encodes M/Z presence !!!! */
4967
sprintf (byte, "%02X", endian_buf[i]);
4971
/* marking M/Z presence */
4972
if (geom->DimensionModel == GAIA_XY_Z)
4974
else if (geom->DimensionModel == GAIA_XY_M)
4976
else if (geom->DimensionModel == GAIA_XY_Z_M)
4982
gaiaExport64 (endian_buf, point->X, 1, endian_arch); /* X */
4983
for (i = 0; i < 8; i++)
4985
sprintf (byte, "%02X", endian_buf[i]);
4989
gaiaExport64 (endian_buf, point->Y, 1, endian_arch); /* Y */
4990
for (i = 0; i < 8; i++)
4992
sprintf (byte, "%02X", endian_buf[i]);
4996
if (geom->DimensionModel == GAIA_XY_Z)
4998
gaiaExport64 (endian_buf, point->Z, 1, endian_arch); /* Z */
4999
for (i = 0; i < 8; i++)
5001
sprintf (byte, "%02X", endian_buf[i]);
5006
else if (geom->DimensionModel == GAIA_XY_M)
5008
gaiaExport64 (endian_buf, point->M, 1, endian_arch); /* M */
5009
for (i = 0; i < 8; i++)
5011
sprintf (byte, "%02X", endian_buf[i]);
5016
else if (geom->DimensionModel == GAIA_XY_Z_M)
5018
gaiaExport64 (endian_buf, point->Z, 1, endian_arch); /* Z */
5019
for (i = 0; i < 8; i++)
5021
sprintf (byte, "%02X", endian_buf[i]);
5025
gaiaExport64 (endian_buf, point->M, 1, endian_arch); /* M */
5026
for (i = 0; i < 8; i++)
5028
sprintf (byte, "%02X", endian_buf[i]);
5033
point = point->Next;
5035
line = geom->FirstLinestring;
5038
if ((ptr - buf) > 1024)
5040
/* flushing the internal buffer */
5042
gaiaAppendToOutBuffer (out_buf, buf);
5045
if (type == GAIA_MULTILINESTRING || type == GAIA_GEOMETRYCOLLECTION)
5049
/* it's a collection: the CLASS TYPE for this element */
5050
gaiaExport32 (endian_buf, GAIA_LINESTRING, 1, endian_arch);
5051
for (i = 0; i < 3; i++)
5053
/* CAVEAT: the 4th byte in PostGIS encodes M/Z presence !!!! */
5054
sprintf (byte, "%02X", endian_buf[i]);
5058
/* marking M/Z presence */
5059
if (geom->DimensionModel == GAIA_XY_Z)
5061
else if (geom->DimensionModel == GAIA_XY_M)
5063
else if (geom->DimensionModel == GAIA_XY_Z_M)
5069
gaiaExport32 (endian_buf, line->Points, 1, endian_arch); /* # points */
5070
for (i = 0; i < 4; i++)
5072
sprintf (byte, "%02X", endian_buf[i]);
5076
for (iv = 0; iv < line->Points; iv++)
5078
if ((ptr - buf) > 1024)
5080
/* flushing the internal buffer */
5082
gaiaAppendToOutBuffer (out_buf, buf);
5085
gaiaLineGetPoint (line, iv, &x, &y, &z, &m);
5086
gaiaExport64 (endian_buf, x, 1, endian_arch); /* X */
5087
for (i = 0; i < 8; i++)
5089
sprintf (byte, "%02X", endian_buf[i]);
5093
gaiaExport64 (endian_buf, y, 1, endian_arch); /* Y */
5094
for (i = 0; i < 8; i++)
5096
sprintf (byte, "%02X", endian_buf[i]);
5100
if (geom->DimensionModel == GAIA_XY_Z)
5102
gaiaExport64 (endian_buf, z, 1, endian_arch); /* Z */
5103
for (i = 0; i < 8; i++)
5105
sprintf (byte, "%02X", endian_buf[i]);
5110
else if (geom->DimensionModel == GAIA_XY_M)
5112
gaiaExport64 (endian_buf, m, 1, endian_arch); /* M */
5113
for (i = 0; i < 8; i++)
5115
sprintf (byte, "%02X", endian_buf[i]);
5120
else if (geom->DimensionModel == GAIA_XY_Z_M)
5122
gaiaExport64 (endian_buf, z, 1, endian_arch); /* Z */
5123
for (i = 0; i < 8; i++)
5125
sprintf (byte, "%02X", endian_buf[i]);
5129
gaiaExport64 (endian_buf, m, 1, endian_arch); /* M */
5130
for (i = 0; i < 8; i++)
5132
sprintf (byte, "%02X", endian_buf[i]);
5140
polyg = geom->FirstPolygon;
5143
if ((ptr - buf) > 1024)
5145
/* flushing the internal buffer */
5147
gaiaAppendToOutBuffer (out_buf, buf);
5150
if (type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
5154
/* it's a collection: the CLASS TYPE for this element */
5155
gaiaExport32 (endian_buf, GAIA_POLYGON, 1, endian_arch);
5156
for (i = 0; i < 3; i++)
5158
/* CAVEAT: the 4th byte in PostGIS encodes M/Z presence !!!! */
5159
sprintf (byte, "%02X", endian_buf[i]);
5163
/* marking M/Z presence */
5164
if (geom->DimensionModel == GAIA_XY_Z)
5166
else if (geom->DimensionModel == GAIA_XY_M)
5168
else if (geom->DimensionModel == GAIA_XY_Z_M)
5174
gaiaExport32 (endian_buf, polyg->NumInteriors + 1, 1, endian_arch); /* # rings */
5175
for (i = 0; i < 4; i++)
5177
sprintf (byte, "%02X", endian_buf[i]);
5181
rng = polyg->Exterior;
5182
gaiaExport32 (endian_buf, rng->Points, 1, endian_arch); /* # points - exterior ring */
5183
for (i = 0; i < 4; i++)
5185
sprintf (byte, "%02X", endian_buf[i]);
5189
for (iv = 0; iv < rng->Points; iv++)
5191
if ((ptr - buf) > 1024)
5193
/* flushing the internal buffer */
5195
gaiaAppendToOutBuffer (out_buf, buf);
5198
gaiaRingGetPoint (rng, iv, &x, &y, &z, &m);
5199
gaiaExport64 (endian_buf, x, 1, endian_arch); /* X - exterior ring */
5200
for (i = 0; i < 8; i++)
5202
sprintf (byte, "%02X", endian_buf[i]);
5206
gaiaExport64 (endian_buf, y, 1, endian_arch); /* Y - exterior ring */
5207
for (i = 0; i < 8; i++)
5209
sprintf (byte, "%02X", endian_buf[i]);
5213
if (geom->DimensionModel == GAIA_XY_Z)
5215
gaiaExport64 (endian_buf, z, 1, endian_arch); /* Z */
5216
for (i = 0; i < 8; i++)
5218
sprintf (byte, "%02X", endian_buf[i]);
5223
else if (geom->DimensionModel == GAIA_XY_M)
5225
gaiaExport64 (endian_buf, m, 1, endian_arch); /* M */
5226
for (i = 0; i < 8; i++)
5228
sprintf (byte, "%02X", endian_buf[i]);
5233
else if (geom->DimensionModel == GAIA_XY_Z_M)
5235
gaiaExport64 (endian_buf, z, 1, endian_arch); /* Z */
5236
for (i = 0; i < 8; i++)
5238
sprintf (byte, "%02X", endian_buf[i]);
5242
gaiaExport64 (endian_buf, m, 1, endian_arch); /* M */
5243
for (i = 0; i < 8; i++)
5245
sprintf (byte, "%02X", endian_buf[i]);
5251
for (ib = 0; ib < polyg->NumInteriors; ib++)
5253
rng = polyg->Interiors + ib;
5254
gaiaExport32 (endian_buf, rng->Points, 1, endian_arch); /* # points - interior ring */
5255
for (i = 0; i < 4; i++)
5257
sprintf (byte, "%02X", endian_buf[i]);
5261
for (iv = 0; iv < rng->Points; iv++)
5263
if ((ptr - buf) > 1024)
5265
/* flushing the internal buffer */
5267
gaiaAppendToOutBuffer (out_buf, buf);
5270
gaiaRingGetPoint (rng, iv, &x, &y, &z, &m);
5271
gaiaExport64 (endian_buf, x, 1, endian_arch); /* X - interior ring */
5272
for (i = 0; i < 8; i++)
5274
sprintf (byte, "%02X", endian_buf[i]);
5278
gaiaExport64 (endian_buf, y, 1, endian_arch); /* Y - interior ring */
5279
for (i = 0; i < 8; i++)
5281
sprintf (byte, "%02X", endian_buf[i]);
5285
if (geom->DimensionModel == GAIA_XY_Z)
5287
gaiaExport64 (endian_buf, z, 1, endian_arch); /* Z */
5288
for (i = 0; i < 8; i++)
5290
sprintf (byte, "%02X", endian_buf[i]);
5295
else if (geom->DimensionModel == GAIA_XY_M)
5297
gaiaExport64 (endian_buf, m, 1, endian_arch); /* M */
5298
for (i = 0; i < 8; i++)
5300
sprintf (byte, "%02X", endian_buf[i]);
5305
else if (geom->DimensionModel == GAIA_XY_Z_M)
5307
gaiaExport64 (endian_buf, z, 1, endian_arch); /* Z */
5308
for (i = 0; i < 8; i++)
5310
sprintf (byte, "%02X", endian_buf[i]);
5314
gaiaExport64 (endian_buf, m, 1, endian_arch); /* M */
5315
for (i = 0; i < 8; i++)
5317
sprintf (byte, "%02X", endian_buf[i]);
5324
polyg = polyg->Next;
5327
/* terminating the EWKB string */
5329
gaiaAppendToOutBuffer (out_buf, buf);
5333
coordDimsFromFgf (int endian_arch, const unsigned char *blob, unsigned int size,
5336
/* decoding the coordinate Dimensions for an FGF Geometry */
5340
coord_dims = gaiaImport32 (blob, GAIA_LITTLE_ENDIAN, endian_arch);
5357
pointFromFgf (gaiaGeomCollPtr geom, int endian_arch, const unsigned char *blob,
5358
unsigned int size, unsigned int *consumed)
5360
/* decoding a POINT Geometry from FGF */
5365
unsigned int sz = size;
5366
const unsigned char *ptr = blob;
5369
/* checking Geometry Type */
5372
if (gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_POINT)
5379
coord_dims = coordDimsFromFgf (endian_arch, ptr, size, &type);
5384
if (sz < (coord_dims * sizeof (double)))
5387
*consumed = coord_dims * sizeof (double);
5388
if (type == GAIA_XY_Z)
5390
/* building the POINTZ */
5391
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5392
y = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5393
z = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5394
gaiaAddPointToGeomCollXYZ (geom, x, y, z);
5396
else if (type == GAIA_XY_M)
5398
/* building the POINTM */
5399
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5400
y = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5401
m = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5402
gaiaAddPointToGeomCollXYM (geom, x, y, m);
5404
else if (type == GAIA_XY_Z_M)
5406
/* building the POINTZM */
5407
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5408
y = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5409
z = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5410
m = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5411
gaiaAddPointToGeomCollXYZM (geom, x, y, z, m);
5415
/* building the POINT */
5416
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5417
y = gaiaImport64 (ptr + 8, GAIA_LITTLE_ENDIAN, endian_arch);
5418
gaiaAddPointToGeomColl (geom, x, y);
5424
linestringFromFgf (gaiaGeomCollPtr geom, int endian_arch,
5425
const unsigned char *blob, unsigned int size,
5426
unsigned int *consumed)
5428
/* decoding a LINESTRING Geometry from FGF */
5429
gaiaLinestringPtr ln;
5437
unsigned int sz = size;
5438
const unsigned char *ptr = blob;
5441
/* checking Geometry Type */
5444
if (gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_LINESTRING)
5449
coord_dims = coordDimsFromFgf (endian_arch, ptr, size, &type);
5454
/* how many points are there ? */
5457
pts = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5462
ln_sz = pts * coord_dims * sizeof (double);
5466
*consumed = (12 + ln_sz);
5467
if (type == GAIA_XY_Z)
5469
/* building the LINESTRINGZ */
5470
geom->DimensionModel = GAIA_XY_Z;
5471
ln = gaiaAddLinestringToGeomColl (geom, pts);
5472
for (iv = 0; iv < pts; iv++)
5474
/* inserting vertices into the linestring */
5475
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5476
y = gaiaImport64 (ptr + sizeof (double), GAIA_LITTLE_ENDIAN,
5478
ptr += (coord_dims * sizeof (double));
5479
gaiaSetPoint (ln->Coords, iv, x, y);
5482
else if (type == GAIA_XY_M)
5484
/* building the LINESTRINGM */
5485
geom->DimensionModel = GAIA_XY_M;
5486
ln = gaiaAddLinestringToGeomColl (geom, pts);
5487
for (iv = 0; iv < pts; iv++)
5489
/* inserting vertices into the linestring */
5490
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5491
y = gaiaImport64 (ptr + sizeof (double), GAIA_LITTLE_ENDIAN,
5493
z = gaiaImport64 (ptr + (sizeof (double) * 2),
5494
GAIA_LITTLE_ENDIAN, endian_arch);
5495
ptr += (coord_dims * sizeof (double));
5496
gaiaSetPoint (ln->Coords, iv, x, y);
5499
else if (type == GAIA_XY_Z_M)
5501
/* building the LINESTRINGZM */
5502
geom->DimensionModel = GAIA_XY_Z_M;
5503
ln = gaiaAddLinestringToGeomColl (geom, pts);
5504
for (iv = 0; iv < pts; iv++)
5506
/* inserting vertices into the linestring */
5507
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5508
y = gaiaImport64 (ptr + sizeof (double), GAIA_LITTLE_ENDIAN,
5510
m = gaiaImport64 (ptr + (sizeof (double) * 2),
5511
GAIA_LITTLE_ENDIAN, endian_arch);
5512
ptr += (coord_dims * sizeof (double));
5513
gaiaSetPoint (ln->Coords, iv, x, y);
5518
/* building the LINESTRING */
5519
geom->DimensionModel = GAIA_XY;
5520
ln = gaiaAddLinestringToGeomColl (geom, pts);
5521
for (iv = 0; iv < pts; iv++)
5523
/* inserting vertices into the linestring */
5524
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5525
y = gaiaImport64 (ptr + sizeof (double), GAIA_LITTLE_ENDIAN,
5527
z = gaiaImport64 (ptr + (sizeof (double) * 2),
5528
GAIA_LITTLE_ENDIAN, endian_arch);
5529
m = gaiaImport64 (ptr + (sizeof (double) * 3),
5530
GAIA_LITTLE_ENDIAN, endian_arch);
5531
ptr += (coord_dims * sizeof (double));
5532
gaiaSetPoint (ln->Coords, iv, x, y);
5539
polygonFromFgf (gaiaGeomCollPtr geom, int endian_arch,
5540
const unsigned char *blob, unsigned int size,
5541
unsigned int *consumed)
5543
/* decoding a POLYGON Geometry from FGF */
5544
gaiaPolygonPtr pg = NULL;
5554
unsigned int rng_sz;
5555
unsigned int sz = size;
5556
const unsigned char *ptr = blob;
5559
unsigned int bytes = 0;
5560
/* checking Geometry Type */
5563
if (gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_POLYGON)
5569
coord_dims = coordDimsFromFgf (endian_arch, ptr, size, &type);
5575
/* how many rings are there ? */
5578
rings = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5584
for (ir = 0; ir < rings; ir++)
5586
/* fetching Polygon's rings */
5589
pts = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5595
rng_sz = pts * coord_dims * sizeof (double);
5599
if (type == GAIA_XY_Z)
5602
geom->DimensionModel = GAIA_XY_Z;
5605
/* building the EXTERIOR RING */
5606
pg = gaiaAddPolygonToGeomColl (geom, pts, rings - 1);
5608
for (iv = 0; iv < pts; iv++)
5610
/* inserting vertices into the EXTERIOR Ring */
5611
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5613
y = gaiaImport64 (ptr + sizeof (double),
5614
GAIA_LITTLE_ENDIAN, endian_arch);
5615
z = gaiaImport64 (ptr + (sizeof (double) * 2),
5616
GAIA_LITTLE_ENDIAN, endian_arch);
5617
ptr += (coord_dims * sizeof (double));
5618
gaiaSetPointXYZ (rng->Coords, iv, x, y, z);
5623
/* building an INTERIOR RING */
5624
rng = gaiaAddInteriorRing (pg, ir - 1, pts);
5625
for (iv = 0; iv < pts; iv++)
5627
/* inserting vertices into some INTERIOR Ring */
5628
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5630
y = gaiaImport64 (ptr + sizeof (double),
5631
GAIA_LITTLE_ENDIAN, endian_arch);
5632
z = gaiaImport64 (ptr + (sizeof (double) * 2),
5633
GAIA_LITTLE_ENDIAN, endian_arch);
5634
ptr += (coord_dims * sizeof (double));
5635
gaiaSetPointXYZ (rng->Coords, iv, x, y, z);
5639
if (type == GAIA_XY_M)
5642
geom->DimensionModel = GAIA_XY_M;
5645
/* building the EXTERIOR RING */
5646
pg = gaiaAddPolygonToGeomColl (geom, pts, rings - 1);
5648
for (iv = 0; iv < pts; iv++)
5650
/* inserting vertices into the EXTERIOR Ring */
5651
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5653
y = gaiaImport64 (ptr + sizeof (double),
5654
GAIA_LITTLE_ENDIAN, endian_arch);
5655
m = gaiaImport64 (ptr + (sizeof (double) * 2),
5656
GAIA_LITTLE_ENDIAN, endian_arch);
5657
ptr += (coord_dims * sizeof (double));
5658
gaiaSetPointXYM (rng->Coords, iv, x, y, m);
5663
/* building an INTERIOR RING */
5664
rng = gaiaAddInteriorRing (pg, ir - 1, pts);
5665
for (iv = 0; iv < pts; iv++)
5667
/* inserting vertices into some INTERIOR Ring */
5668
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5670
y = gaiaImport64 (ptr + sizeof (double),
5671
GAIA_LITTLE_ENDIAN, endian_arch);
5672
m = gaiaImport64 (ptr + (sizeof (double) * 2),
5673
GAIA_LITTLE_ENDIAN, endian_arch);
5674
ptr += (coord_dims * sizeof (double));
5675
gaiaSetPointXYM (rng->Coords, iv, x, y, m);
5679
else if (type == GAIA_XY_Z_M)
5682
geom->DimensionModel = GAIA_XY_Z_M;
5685
/* building the EXTERIOR RING */
5686
pg = gaiaAddPolygonToGeomColl (geom, pts, rings - 1);
5688
for (iv = 0; iv < pts; iv++)
5690
/* inserting vertices into the EXTERIOR Ring */
5691
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5693
y = gaiaImport64 (ptr + sizeof (double),
5694
GAIA_LITTLE_ENDIAN, endian_arch);
5695
z = gaiaImport64 (ptr + (sizeof (double) * 2),
5696
GAIA_LITTLE_ENDIAN, endian_arch);
5697
m = gaiaImport64 (ptr + (sizeof (double) * 3),
5698
GAIA_LITTLE_ENDIAN, endian_arch);
5699
ptr += (coord_dims * sizeof (double));
5700
gaiaSetPointXYZM (rng->Coords, iv, x, y, z, m);
5705
/* building an INTERIOR RING */
5706
rng = gaiaAddInteriorRing (pg, ir - 1, pts);
5707
for (iv = 0; iv < pts; iv++)
5709
/* inserting vertices into some INTERIOR Ring */
5710
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5712
y = gaiaImport64 (ptr + sizeof (double),
5713
GAIA_LITTLE_ENDIAN, endian_arch);
5714
z = gaiaImport64 (ptr + (sizeof (double) * 2),
5715
GAIA_LITTLE_ENDIAN, endian_arch);
5716
m = gaiaImport64 (ptr + (sizeof (double) * 3),
5717
GAIA_LITTLE_ENDIAN, endian_arch);
5718
ptr += (coord_dims * sizeof (double));
5719
gaiaSetPointXYZM (rng->Coords, iv, x, y, z, m);
5726
geom->DimensionModel = GAIA_XY;
5729
/* building the EXTERIOR RING */
5730
pg = gaiaAddPolygonToGeomColl (geom, pts, rings - 1);
5732
for (iv = 0; iv < pts; iv++)
5734
/* inserting vertices into the EXTERIOR Ring */
5735
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5737
y = gaiaImport64 (ptr + sizeof (double),
5738
GAIA_LITTLE_ENDIAN, endian_arch);
5739
ptr += (coord_dims * sizeof (double));
5740
gaiaSetPoint (rng->Coords, iv, x, y);
5745
/* building an INTERIOR RING */
5746
rng = gaiaAddInteriorRing (pg, ir - 1, pts);
5747
for (iv = 0; iv < pts; iv++)
5749
/* inserting vertices into some INTERIOR Ring */
5750
x = gaiaImport64 (ptr, GAIA_LITTLE_ENDIAN,
5752
y = gaiaImport64 (ptr + sizeof (double),
5753
GAIA_LITTLE_ENDIAN, endian_arch);
5754
ptr += (coord_dims * sizeof (double));
5755
gaiaSetPoint (rng->Coords, iv, x, y);
5767
multiPointFromFgf (gaiaGeomCollPtr geom, int endian_arch,
5768
const unsigned char *blob, unsigned int size)
5770
/* decoding a MULTIPOINT Geometry from FGF */
5773
unsigned int sz = size;
5774
const unsigned char *ptr = blob;
5775
unsigned int consumed;
5776
/* checking Geometry Type */
5779
if (gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_MULTIPOINT)
5783
/* how many points are there ? */
5786
pts = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5791
for (ipt = 0; ipt < pts; ipt++)
5793
/* fetching individual Points from FGF */
5794
if (!pointFromFgf (geom, endian_arch, ptr, sz, &consumed))
5803
multiLinestringFromFgf (gaiaGeomCollPtr geom, int endian_arch,
5804
const unsigned char *blob, unsigned int size)
5806
/* decoding a MULTILINESTRING Geometry from FGF */
5809
unsigned int sz = size;
5810
const unsigned char *ptr = blob;
5811
unsigned int consumed;
5812
/* checking Geometry Type */
5816
(ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_MULTILINESTRING)
5820
/* how many linestrings are there ? */
5823
lns = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5828
for (iln = 0; iln < lns; iln++)
5830
/* fetching individual Linestrings from FGF */
5831
if (!linestringFromFgf (geom, endian_arch, ptr, sz, &consumed))
5840
multiPolygonFromFgf (gaiaGeomCollPtr geom, int endian_arch,
5841
const unsigned char *blob, unsigned int size)
5843
/* decoding a MULTIPOLYGON Geometry from FGF */
5846
unsigned int sz = size;
5847
const unsigned char *ptr = blob;
5848
unsigned int consumed;
5849
/* checking Geometry Type */
5853
(ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_MULTIPOLYGON)
5857
/* how many polygons are there ? */
5860
pgs = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5865
for (ipg = 0; ipg < pgs; ipg++)
5867
/* fetching individual Polygons from FGF */
5868
if (!polygonFromFgf (geom, endian_arch, ptr, sz, &consumed))
5877
geomCollectionFromFgf (gaiaGeomCollPtr geom, int endian_arch,
5878
const unsigned char *blob, unsigned int size)
5880
/* decoding a GEOMETRYCOLLECTION Geometry from FGF */
5884
unsigned int sz = size;
5885
const unsigned char *ptr = blob;
5886
unsigned int consumed;
5887
/* checking Geometry Type */
5891
(ptr, GAIA_LITTLE_ENDIAN, endian_arch) != GAIA_GEOMETRYCOLLECTION)
5895
/* how many individual Geometries are there ? */
5898
geoms = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5903
for (ig = 0; ig < geoms; ig++)
5905
/* fetching individual Geometries from FGF */
5908
geom_type = gaiaImport32 (ptr, GAIA_LITTLE_ENDIAN, endian_arch);
5912
if (!pointFromFgf (geom, endian_arch, ptr, sz, &consumed))
5915
case GAIA_LINESTRING:
5916
if (!linestringFromFgf (geom, endian_arch, ptr, sz, &consumed))
5920
if (!polygonFromFgf (geom, endian_arch, ptr, sz, &consumed))
5923
default: /* unsupported geometry type */
5933
GAIAGEO_DECLARE gaiaGeomCollPtr
5934
gaiaFromFgf (const unsigned char *blob, unsigned int size)
5936
/* decoding from FGF to GEOMETRY */
5937
gaiaGeomCollPtr geom = NULL;
5939
int endian_arch = gaiaEndianArch ();
5942
/* checking FGF type */
5943
geom_type = gaiaImport32 (blob, GAIA_LITTLE_ENDIAN, endian_arch);
5944
geom = gaiaAllocGeomColl ();
5945
geom->DeclaredType = geom_type;
5949
if (pointFromFgf (geom, endian_arch, blob, size, NULL))
5952
case GAIA_LINESTRING:
5953
if (linestringFromFgf (geom, endian_arch, blob, size, NULL))
5957
if (polygonFromFgf (geom, endian_arch, blob, size, NULL))
5960
case GAIA_MULTIPOINT:
5961
if (multiPointFromFgf (geom, endian_arch, blob, size))
5964
case GAIA_MULTILINESTRING:
5965
if (multiLinestringFromFgf (geom, endian_arch, blob, size))
5968
case GAIA_MULTIPOLYGON:
5969
if (multiPolygonFromFgf (geom, endian_arch, blob, size))
5972
case GAIA_GEOMETRYCOLLECTION:
5973
if (geomCollectionFromFgf (geom, endian_arch, blob, size))
5976
default: /* unsupported geometry type */
5979
gaiaFreeGeomColl (geom);
5983
GAIAGEO_DECLARE void
5984
gaiaToFgf (gaiaGeomCollPtr geom, unsigned char **result, int *size,
5987
/* builds the FGF representation for this GEOMETRY */
5996
int n_linestrings = 0;
6003
gaiaLinestringPtr ln;
6006
gaiaPointPtr point = NULL;
6007
gaiaLinestringPtr line = NULL;
6008
gaiaPolygonPtr polyg = NULL;
6009
int endian_arch = gaiaEndianArch ();
6010
gaiaMbrGeometry (geom);
6027
/* how many entities, and of what kind, do we have ? */
6028
pt = geom->FirstPoint;
6036
ln = geom->FirstLinestring;
6044
pg = geom->FirstPolygon;
6055
if (n_points == 0 && n_polygons == 0 && n_linestrings == 0)
6057
/* ok, we can determine the geometry class */
6058
if (n_points == 1 && n_linestrings == 0 && n_polygons == 0)
6060
if (geom->DeclaredType == GAIA_MULTIPOINT)
6061
type = GAIA_MULTIPOINT;
6062
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
6063
type = GAIA_GEOMETRYCOLLECTION;
6067
else if (n_points > 1 && n_linestrings == 0 && n_polygons == 0)
6069
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
6070
type = GAIA_GEOMETRYCOLLECTION;
6072
type = GAIA_MULTIPOINT;
6074
else if (n_points == 0 && n_linestrings == 1 && n_polygons == 0)
6076
if (geom->DeclaredType == GAIA_MULTILINESTRING)
6077
type = GAIA_MULTILINESTRING;
6078
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
6079
type = GAIA_GEOMETRYCOLLECTION;
6081
type = GAIA_LINESTRING;
6083
else if (n_points == 0 && n_linestrings > 1 && n_polygons == 0)
6085
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
6086
type = GAIA_GEOMETRYCOLLECTION;
6088
type = GAIA_MULTILINESTRING;
6090
else if (n_points == 0 && n_linestrings == 0 && n_polygons == 1)
6092
if (geom->DeclaredType == GAIA_MULTIPOLYGON)
6093
type = GAIA_MULTIPOLYGON;
6094
else if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
6095
type = GAIA_GEOMETRYCOLLECTION;
6097
type = GAIA_POLYGON;
6099
else if (n_points == 0 && n_linestrings == 0 && n_polygons > 1)
6101
if (geom->DeclaredType == GAIA_GEOMETRYCOLLECTION)
6102
type = GAIA_GEOMETRYCOLLECTION;
6104
type = GAIA_MULTIPOLYGON;
6107
type = GAIA_GEOMETRYCOLLECTION;
6108
/* and now we compute the size of FGF */
6109
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
6110
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
6112
point = geom->FirstPoint;
6115
sz += (8 + (n_coords * sizeof (double))); /* the size of each POINT */
6116
point = point->Next;
6118
line = geom->FirstLinestring;
6121
sz += (12 + ((n_coords * sizeof (double)) * line->Points)); /* # points + [x,y] for each vertex */
6124
polyg = geom->FirstPolygon;
6127
rng = polyg->Exterior;
6128
sz += (16 + ((n_coords * sizeof (double)) * rng->Points)); /* # rings + # points + [x.y] array - exterior ring */
6129
for (ib = 0; ib < polyg->NumInteriors; ib++)
6131
rng = polyg->Interiors + ib;
6132
sz += (4 + ((n_coords * sizeof (double)) * rng->Points)); /* # points + [x,y] array - interior ring */
6134
polyg = polyg->Next;
6139
/* and finally we build the FGF */
6140
if (type == GAIA_MULTIPOINT || type == GAIA_MULTILINESTRING
6141
|| type == GAIA_MULTIPOLYGON || type == GAIA_GEOMETRYCOLLECTION)
6143
gaiaExport32 (ptr, type, GAIA_LITTLE_ENDIAN, endian_arch); /* Geometry Type */
6145
gaiaExport32 (ptr, entities, GAIA_LITTLE_ENDIAN, endian_arch); /* it's a collection; # entities */
6148
point = geom->FirstPoint;
6151
gaiaExport32 (ptr, GAIA_POINT, GAIA_LITTLE_ENDIAN, endian_arch); /* the CLASS TYPE for this element */
6153
gaiaExport32 (ptr, coord_dims, GAIA_LITTLE_ENDIAN, endian_arch); /* the CoordDimension */
6155
gaiaExport64 (ptr, point->X, GAIA_LITTLE_ENDIAN, endian_arch); /* X */
6157
gaiaExport64 (ptr, point->Y, GAIA_LITTLE_ENDIAN, endian_arch); /* Y */
6161
/* the third coordinate [Z or M] */
6162
if (coord_dims == GAIA_XY_Z || coord_dims == GAIA_XY_Z_M)
6163
gaiaExport64 (ptr, point->Z, GAIA_LITTLE_ENDIAN,
6166
gaiaExport64 (ptr, point->M, GAIA_LITTLE_ENDIAN,
6172
/* the fourth coordinate [M] */
6173
gaiaExport64 (ptr, point->M, GAIA_LITTLE_ENDIAN, endian_arch);
6176
point = point->Next;
6178
line = geom->FirstLinestring;
6181
gaiaExport32 (ptr, GAIA_LINESTRING, GAIA_LITTLE_ENDIAN, endian_arch); /* the CLASS TYPE for this element */
6183
gaiaExport32 (ptr, coord_dims, GAIA_LITTLE_ENDIAN, endian_arch); /* the CoordDimension */
6185
gaiaExport32 (ptr, line->Points, GAIA_LITTLE_ENDIAN, endian_arch); /* # points */
6187
for (iv = 0; iv < line->Points; iv++)
6191
if (geom->DimensionModel == GAIA_XY_Z)
6193
gaiaGetPointXYZ (line->Coords, iv, &x, &y, &z);
6195
else if (geom->DimensionModel == GAIA_XY_M)
6197
gaiaGetPointXYM (line->Coords, iv, &x, &y, &m);
6199
else if (geom->DimensionModel == GAIA_XY_Z_M)
6201
gaiaGetPointXYZM (line->Coords, iv, &x, &y, &z, &m);
6205
gaiaGetPoint (line->Coords, iv, &x, &y);
6207
gaiaExport64 (ptr, x, GAIA_LITTLE_ENDIAN, endian_arch); /* X */
6209
gaiaExport64 (ptr, y, GAIA_LITTLE_ENDIAN, endian_arch); /* Y */
6213
/* the third coordinate [Z or M] */
6214
if (coord_dims == GAIA_XY_Z || coord_dims == GAIA_XY_Z_M)
6215
gaiaExport64 (ptr, z, GAIA_LITTLE_ENDIAN,
6218
gaiaExport64 (ptr, m, GAIA_LITTLE_ENDIAN,
6224
/* the fourth coordinate [M]; */
6225
gaiaExport64 (ptr, m, GAIA_LITTLE_ENDIAN, endian_arch);
6231
polyg = geom->FirstPolygon;
6234
gaiaExport32 (ptr, GAIA_POLYGON, GAIA_LITTLE_ENDIAN, endian_arch); /* the CLASS TYPE for this element */
6236
gaiaExport32 (ptr, coord_dims, GAIA_LITTLE_ENDIAN, endian_arch); /* the CoordDimension */
6238
gaiaExport32 (ptr, polyg->NumInteriors + 1, GAIA_LITTLE_ENDIAN, endian_arch); /* # rings */
6240
rng = polyg->Exterior;
6241
gaiaExport32 (ptr, rng->Points, GAIA_LITTLE_ENDIAN, endian_arch); /* # points - exterior ring */
6243
for (iv = 0; iv < rng->Points; iv++)
6247
if (geom->DimensionModel == GAIA_XY_Z)
6249
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
6251
else if (geom->DimensionModel == GAIA_XY_M)
6253
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
6255
else if (geom->DimensionModel == GAIA_XY_Z_M)
6257
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
6261
gaiaGetPoint (rng->Coords, iv, &x, &y);
6263
gaiaExport64 (ptr, x, GAIA_LITTLE_ENDIAN, endian_arch); /* X - exterior ring */
6265
gaiaExport64 (ptr, y, GAIA_LITTLE_ENDIAN, endian_arch); /* Y - exterior ring */
6269
/* the third coordinate [Z or M] */
6270
if (coord_dims == GAIA_XY_Z || coord_dims == GAIA_XY_Z_M)
6271
gaiaExport64 (ptr, z, GAIA_LITTLE_ENDIAN,
6274
gaiaExport64 (ptr, m, GAIA_LITTLE_ENDIAN,
6280
/* the fourth coordinate [M] */
6281
gaiaExport64 (ptr, m, GAIA_LITTLE_ENDIAN, endian_arch);
6285
for (ib = 0; ib < polyg->NumInteriors; ib++)
6287
rng = polyg->Interiors + ib;
6288
gaiaExport32 (ptr, rng->Points, 1, endian_arch); /* # points - interior ring */
6290
for (iv = 0; iv < rng->Points; iv++)
6294
if (geom->DimensionModel == GAIA_XY_Z)
6296
gaiaGetPointXYZ (rng->Coords, iv, &x, &y, &z);
6298
else if (geom->DimensionModel == GAIA_XY_M)
6300
gaiaGetPointXYM (rng->Coords, iv, &x, &y, &m);
6302
else if (geom->DimensionModel == GAIA_XY_Z_M)
6304
gaiaGetPointXYZM (rng->Coords, iv, &x, &y, &z, &m);
6308
gaiaGetPoint (rng->Coords, iv, &x, &y);
6310
gaiaExport64 (ptr, x, GAIA_LITTLE_ENDIAN, endian_arch); /* X - interior ring */
6312
gaiaExport64 (ptr, y, GAIA_LITTLE_ENDIAN, endian_arch); /* Y - interior ring */
6316
/* the third coordinate [Z or M]; defaulting to ZERO */
6317
if (coord_dims == GAIA_XY_Z
6318
|| coord_dims == GAIA_XY_Z_M)
6319
gaiaExport64 (ptr, z, GAIA_LITTLE_ENDIAN,
6322
gaiaExport64 (ptr, m, GAIA_LITTLE_ENDIAN,
6328
/* the fourth coordinate [M] */
6329
gaiaExport64 (ptr, m, GAIA_LITTLE_ENDIAN,
6335
polyg = polyg->Next;