567
int QgsSpatiaLiteProvider::computeSizeFromGeosWKB2D( const unsigned char *blob,
568
size_t size, int type, int nDims,
569
int little_endian, int endian_arch )
571
// calculating the size required to store this WKB
575
const unsigned char *p_in = blob;
581
// compunting the required size
586
gsize += 4 * sizeof(double);
590
gsize += 3 * sizeof(double);
593
gsize += 2 * sizeof(double);
597
case GAIA_LINESTRING:
598
points = gaiaImport32 ( p_in, little_endian, endian_arch );
603
gsize += points * ( 4 * sizeof(double) );
607
gsize += points * ( 3 * sizeof(double) );
610
gsize += points * ( 2 * sizeof(double) );
615
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
618
for ( ib = 0; ib < rings; ib++ )
620
points = gaiaImport32 ( p_in, little_endian, endian_arch );
626
gsize += points * ( 4 * sizeof(double) );
630
gsize += points * ( 3 * sizeof(double) );
633
gsize += points * ( 2 * sizeof(double) );
636
p_in += points * ( 2 * sizeof(double) );
640
gsize += computeSizeFromMultiWKB2D( p_in, nDims, little_endian,
648
int QgsSpatiaLiteProvider::computeSizeFromMultiWKB2D( const unsigned char *p_in,
653
// calculating the size required to store this WKB
662
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
665
for ( ie = 0; ie < entities; ie++ )
667
type = gaiaImport32 ( p_in + 1, little_endian, endian_arch );
672
// compunting the required size
677
size += 4 * sizeof(double);
681
size += 3 * sizeof(double);
684
size += 2 * sizeof(double);
687
p_in += 2 * sizeof(double);
689
case GAIA_LINESTRING:
690
points = gaiaImport32 ( p_in, little_endian, endian_arch );
696
size += points * ( 4 * sizeof(double) );
700
size += points * ( 3 * sizeof(double) );
703
size += points * ( 2 * sizeof(double) );
706
p_in += points * ( 2 * sizeof(double) );
709
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
712
for ( ib = 0; ib < rings; ib++ )
714
points = gaiaImport32 ( p_in, little_endian, endian_arch );
720
size += points * ( 4 * sizeof(double) );
724
size += points * ( 3 * sizeof(double) );
727
size += points * ( 2 * sizeof(double) );
730
p_in += points * ( 2 * sizeof(double) );
739
int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob,
740
size_t size, int type, int nDims,
741
int little_endian, int endian_arch )
743
// calculating the size required to store this WKB
747
const unsigned char *p_in = blob;
753
// compunting the required size
758
gsize += 4 * sizeof(double);
762
gsize += 3 * sizeof(double);
765
gsize += 2 * sizeof(double);
769
case GEOS_3D_LINESTRING:
770
points = gaiaImport32 ( p_in, little_endian, endian_arch );
775
gsize += points * ( 4 * sizeof(double) );
779
gsize += points * ( 3 * sizeof(double) );
782
gsize += points * ( 2 * sizeof(double) );
786
case GEOS_3D_POLYGON:
787
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
790
for ( ib = 0; ib < rings; ib++ )
792
points = gaiaImport32 ( p_in, little_endian, endian_arch );
798
gsize += points * ( 4 * sizeof(double) );
802
gsize += points * ( 3 * sizeof(double) );
805
gsize += points * ( 2 * sizeof(double) );
808
p_in += points * ( 3 * sizeof(double) );
812
gsize += computeSizeFromMultiWKB3D( p_in, nDims, little_endian,
820
int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in,
825
// calculating the size required to store this WKB
834
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
837
for ( ie = 0; ie < entities; ie++ )
839
type = gaiaImport32 ( p_in + 1, little_endian, endian_arch );
844
// compunting the required size
849
size += 4 * sizeof(double);
853
size += 3 * sizeof(double);
856
size += 2 * sizeof(double);
859
p_in += 3 * sizeof(double);
861
case GEOS_3D_LINESTRING:
862
points = gaiaImport32 ( p_in, little_endian, endian_arch );
868
size += points * ( 4 * sizeof(double) );
872
size += points * ( 3 * sizeof(double) );
875
size += points * ( 2 * sizeof(double) );
878
p_in += points * ( 3 * sizeof(double) );
880
case GEOS_3D_POLYGON:
881
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
884
for ( ib = 0; ib < rings; ib++ )
886
points = gaiaImport32 ( p_in, little_endian, endian_arch );
892
size += points * ( 4 * sizeof(double) );
896
size += points * ( 3 * sizeof(double) );
899
size += points * ( 2 * sizeof(double) );
902
p_in += points * ( 3 * sizeof(double) );
911
void QgsSpatiaLiteProvider::convertFromGeosWKB ( const unsigned char *blob,
917
// attempting to convert from 2D/3D GEOS own WKB
922
int endian_arch = gaiaEndianArch ();
928
if ( *( blob + 0 ) == 0x01 )
929
little_endian = GAIA_LITTLE_ENDIAN;
931
little_endian = GAIA_BIG_ENDIAN;
932
type = gaiaImport32 ( blob + 1, little_endian, endian_arch );
933
if (type == GEOS_3D_POINT || type == GEOS_3D_LINESTRING
934
|| type == GEOS_3D_POLYGON
935
|| type == GEOS_3D_MULTIPOINT || type == GEOS_3D_MULTILINESTRING
936
|| type == GEOS_3D_MULTIPOLYGON || type == GEOS_3D_GEOMETRYCOLLECTION)
938
else if (type == GAIA_POINT || type == GAIA_LINESTRING
939
|| type == GAIA_POLYGON || type == GAIA_MULTIPOINT
940
|| type == GAIA_MULTILINESTRING || type == GAIA_MULTIPOLYGON
941
|| type == GAIA_GEOMETRYCOLLECTION)
946
if ( gDims == 2 && nDims == GAIA_XY )
948
// already 2D: simply copying is required
949
unsigned char *wkbGeom = new unsigned char[blob_size + 1];
950
memset( wkbGeom, '\0', blob_size + 1 );
951
memcpy( wkbGeom, blob, blob_size );
953
*geom_size = blob_size + 1;
957
// we need creating a GAIA WKB
959
gsize = computeSizeFromGeosWKB3D( blob, blob_size, type, nDims,
960
little_endian, endian_arch );
962
gsize = computeSizeFromGeosWKB2D( blob, blob_size, type, nDims,
963
little_endian, endian_arch );
965
unsigned char *wkbGeom = new unsigned char[gsize];
966
memset( wkbGeom, '\0', gsize );
969
convertFromGeosWKB3D( blob, blob_size, wkbGeom, gsize, nDims,
970
little_endian, endian_arch );
972
convertFromGeosWKB2D( blob, blob_size, wkbGeom, gsize, nDims,
973
little_endian, endian_arch );
979
void QgsSpatiaLiteProvider::convertFromGeosWKB2D ( const unsigned char *blob,
987
// attempting to convert from 2D GEOS own WKB
995
const unsigned char *p_in;
996
unsigned char *p_out = wkb;
999
// building from GEOS 2D WKB
1000
*p_out++ = 0x01; // little endian byte order
1001
type = gaiaImport32 ( blob + 1, little_endian, endian_arch );
1004
// setting Geometry TYPE
1009
gaiaExport32 ( p_out, GAIA_POINTZM, 1, endian_arch);
1012
gaiaExport32 ( p_out, GAIA_POINTZ, 1, endian_arch);
1015
gaiaExport32 ( p_out, GAIA_POINTM, 1, endian_arch);
1018
gaiaExport32 ( p_out, GAIA_POINT, 1, endian_arch);
1022
case GAIA_LINESTRING:
1026
gaiaExport32 ( p_out, GAIA_LINESTRINGZM, 1, endian_arch);
1029
gaiaExport32 ( p_out, GAIA_LINESTRINGZ, 1, endian_arch);
1032
gaiaExport32 ( p_out, GAIA_LINESTRINGM, 1, endian_arch);
1035
gaiaExport32 ( p_out, GAIA_LINESTRING, 1, endian_arch);
1043
gaiaExport32 ( p_out, GAIA_POLYGONZM, 1, endian_arch);
1046
gaiaExport32 ( p_out, GAIA_POLYGONZ, 1, endian_arch);
1049
gaiaExport32 ( p_out, GAIA_POLYGONM, 1, endian_arch);
1052
gaiaExport32 ( p_out, GAIA_POLYGON, 1, endian_arch);
1056
case GAIA_MULTIPOINT:
1060
gaiaExport32 ( p_out, GAIA_MULTIPOINTZM, 1, endian_arch);
1063
gaiaExport32 ( p_out, GAIA_MULTIPOINTZ, 1, endian_arch);
1066
gaiaExport32 ( p_out, GAIA_MULTIPOINTM, 1, endian_arch);
1069
gaiaExport32 ( p_out, GAIA_MULTIPOINT, 1, endian_arch);
1073
case GAIA_MULTILINESTRING:
1077
gaiaExport32 ( p_out, GAIA_MULTILINESTRINGZM, 1, endian_arch);
1080
gaiaExport32 ( p_out, GAIA_MULTILINESTRINGZ, 1, endian_arch);
1083
gaiaExport32 ( p_out, GAIA_MULTILINESTRINGM, 1, endian_arch);
1086
gaiaExport32 ( p_out, GAIA_MULTILINESTRING, 1, endian_arch);
1090
case GAIA_MULTIPOLYGON:
1094
gaiaExport32 ( p_out, GAIA_MULTIPOLYGONZM, 1, endian_arch);
1097
gaiaExport32 ( p_out, GAIA_MULTIPOLYGONZ, 1, endian_arch);
1100
gaiaExport32 ( p_out, GAIA_MULTIPOLYGONM, 1, endian_arch);
1103
gaiaExport32 ( p_out, GAIA_MULTIPOLYGON, 1, endian_arch);
1107
case GAIA_GEOMETRYCOLLECTION:
1111
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTIONZM, 1, endian_arch);
1114
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTIONZ, 1, endian_arch);
1117
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTIONM, 1, endian_arch);
1120
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTION, 1, endian_arch);
1129
// setting Geometry values
1131
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1132
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1133
p_in += sizeof(double);
1134
p_out += sizeof(double);
1135
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1136
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1137
p_in += sizeof(double);
1138
p_out += sizeof(double);
1139
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1141
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1142
p_out += sizeof(double);
1144
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1146
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1147
p_out += sizeof(double);
1150
case GAIA_LINESTRING:
1151
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1153
gaiaExport32 ( p_out, points, 1, endian_arch);
1155
for ( iv = 0; iv < points; iv++ )
1157
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1158
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1159
p_in += sizeof(double);
1160
p_out += sizeof(double);
1161
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1162
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1163
p_in += sizeof(double);
1164
p_out += sizeof(double);
1165
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1167
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1168
p_out += sizeof(double);
1170
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1172
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1173
p_out += sizeof(double);
1178
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
1180
gaiaExport32 ( p_out, rings, 1, endian_arch);
1182
for ( ib = 0; ib < rings; ib++ )
1184
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1186
gaiaExport32 ( p_out, points, 1, endian_arch);
1188
for ( iv = 0; iv < points; iv++ )
1190
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1191
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1192
p_in += sizeof(double);
1193
p_out += sizeof(double);
1194
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1195
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1196
p_in += sizeof(double);
1197
p_out += sizeof(double);
1198
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1200
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1201
p_out += sizeof(double);
1203
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1205
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1206
p_out += sizeof(double);
1211
case GAIA_MULTIPOINT:
1212
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1214
gaiaExport32 ( p_out, entities, 1, endian_arch);
1216
for ( ie = 0; ie < entities; ie++ )
1223
gaiaExport32 ( p_out, GAIA_POINTZM, 1, endian_arch);
1226
gaiaExport32 ( p_out, GAIA_POINTZ, 1, endian_arch);
1229
gaiaExport32 ( p_out, GAIA_POINTM, 1, endian_arch);
1232
gaiaExport32 ( p_out, GAIA_POINT, 1, endian_arch);
1236
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1237
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1238
p_in += sizeof(double);
1239
p_out += sizeof(double);
1240
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1241
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1242
p_in += sizeof(double);
1243
p_out += sizeof(double);
1244
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1246
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1247
p_out += sizeof(double);
1249
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1251
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1252
p_out += sizeof(double);
1256
case GAIA_MULTILINESTRING:
1257
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1259
gaiaExport32 ( p_out, entities, 1, endian_arch);
1261
for ( ie = 0; ie < entities; ie++ )
1268
gaiaExport32 ( p_out, GAIA_LINESTRINGZM, 1, endian_arch);
1271
gaiaExport32 ( p_out, GAIA_LINESTRINGZ, 1, endian_arch);
1274
gaiaExport32 ( p_out, GAIA_LINESTRINGM, 1, endian_arch);
1277
gaiaExport32 ( p_out, GAIA_LINESTRING, 1, endian_arch);
1281
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1283
gaiaExport32 ( p_out, points, 1, endian_arch);
1285
for ( iv = 0; iv < points; iv++ )
1287
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1288
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1289
p_in += sizeof(double);
1290
p_out += sizeof(double);
1291
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1292
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1293
p_in += sizeof(double);
1294
p_out += sizeof(double);
1295
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1297
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1298
p_out += sizeof(double);
1300
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1302
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1303
p_out += sizeof(double);
1308
case GAIA_MULTIPOLYGON:
1309
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1311
gaiaExport32 ( p_out, entities, 1, endian_arch);
1313
for ( ie = 0; ie < entities; ie++ )
1320
gaiaExport32 ( p_out, GAIA_POLYGONZM, 1, endian_arch);
1323
gaiaExport32 ( p_out, GAIA_POLYGONZ, 1, endian_arch);
1326
gaiaExport32 ( p_out, GAIA_POLYGONM, 1, endian_arch);
1329
gaiaExport32 ( p_out, GAIA_POLYGON, 1, endian_arch);
1333
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
1335
gaiaExport32 ( p_out, rings, 1, endian_arch);
1337
for ( ib = 0; ib < rings; ib++ )
1339
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1341
gaiaExport32 ( p_out, points, 1, endian_arch);
1343
for ( iv = 0; iv < points; iv++ )
1345
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1346
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1347
p_in += sizeof(double);
1348
p_out += sizeof(double);
1349
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1350
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1351
p_in += sizeof(double);
1352
p_out += sizeof(double);
1353
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1355
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1356
p_out += sizeof(double);
1358
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1360
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1361
p_out += sizeof(double);
1367
case GAIA_GEOMETRYCOLLECTION:
1368
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1370
gaiaExport32 ( p_out, entities, 1, endian_arch );
1372
for ( ie = 0; ie < entities; ie++ )
1374
int type2 = gaiaImport32 ( p_in + 1, little_endian, endian_arch );
1383
gaiaExport32 ( p_out, GAIA_POINTZM, 1, endian_arch);
1386
gaiaExport32 ( p_out, GAIA_POINTZ, 1, endian_arch);
1389
gaiaExport32 ( p_out, GAIA_POINTM, 1, endian_arch);
1392
gaiaExport32 ( p_out, GAIA_POINT, 1, endian_arch);
1396
case GAIA_LINESTRING:
1400
gaiaExport32 ( p_out, GAIA_LINESTRINGZM, 1, endian_arch);
1403
gaiaExport32 ( p_out, GAIA_LINESTRINGZ, 1, endian_arch);
1406
gaiaExport32 ( p_out, GAIA_LINESTRINGM, 1, endian_arch);
1409
gaiaExport32 ( p_out, GAIA_LINESTRING, 1, endian_arch);
1417
gaiaExport32 ( p_out, GAIA_POLYGONZM, 1, endian_arch);
1420
gaiaExport32 ( p_out, GAIA_POLYGONZ, 1, endian_arch);
1423
gaiaExport32 ( p_out, GAIA_POLYGONM, 1, endian_arch);
1426
gaiaExport32 ( p_out, GAIA_POLYGON, 1, endian_arch);
1434
// setting sub-Geometry values
1436
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1437
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1438
p_in += sizeof(double);
1439
p_out += sizeof(double);
1440
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1441
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1442
p_in += sizeof(double);
1443
p_out += sizeof(double);
1444
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1446
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1447
p_out += sizeof(double);
1449
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1451
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1452
p_out += sizeof(double);
1455
case GAIA_LINESTRING:
1456
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1458
gaiaExport32 ( p_out, points, 1, endian_arch);
1460
for ( iv = 0; iv < points; iv++ )
1462
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1463
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1464
p_in += sizeof(double);
1465
p_out += sizeof(double);
1466
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1467
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1468
p_in += sizeof(double);
1469
p_out += sizeof(double);
1470
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1472
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1473
p_out += sizeof(double);
1475
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1477
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1478
p_out += sizeof(double);
1483
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
1485
gaiaExport32 ( p_out, rings, 1, endian_arch);
1487
for ( ib = 0; ib < rings; ib++ )
1489
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1491
gaiaExport32 ( p_out, points, 1, endian_arch);
1493
for ( iv = 0; iv < points; iv++ )
1495
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1496
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1497
p_in += sizeof(double);
1498
p_out += sizeof(double);
1499
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1500
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1501
p_in += sizeof(double);
1502
p_out += sizeof(double);
1503
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1505
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
1506
p_out += sizeof(double);
1508
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1510
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1511
p_out += sizeof(double);
1522
void QgsSpatiaLiteProvider::convertFromGeosWKB3D ( const unsigned char *blob,
1530
// attempting to convert from 3D GEOS own WKB
1538
const unsigned char *p_in;
1539
unsigned char *p_out = wkb;
1542
// building from GEOS 3D WKB
1543
*p_out++ = 0x01; // little endian byte order
1544
type = gaiaImport32 ( blob + 1, little_endian, endian_arch );
1547
// setting Geometry TYPE
1552
gaiaExport32 ( p_out, GAIA_POINTZM, 1, endian_arch);
1555
gaiaExport32 ( p_out, GAIA_POINTZ, 1, endian_arch);
1558
gaiaExport32 ( p_out, GAIA_POINTM, 1, endian_arch);
1561
gaiaExport32 ( p_out, GAIA_POINT, 1, endian_arch);
1565
case GEOS_3D_LINESTRING:
1569
gaiaExport32 ( p_out, GAIA_LINESTRINGZM, 1, endian_arch);
1572
gaiaExport32 ( p_out, GAIA_LINESTRINGZ, 1, endian_arch);
1575
gaiaExport32 ( p_out, GAIA_LINESTRINGM, 1, endian_arch);
1578
gaiaExport32 ( p_out, GAIA_LINESTRING, 1, endian_arch);
1582
case GEOS_3D_POLYGON:
1586
gaiaExport32 ( p_out, GAIA_POLYGONZM, 1, endian_arch);
1589
gaiaExport32 ( p_out, GAIA_POLYGONZ, 1, endian_arch);
1592
gaiaExport32 ( p_out, GAIA_POLYGONM, 1, endian_arch);
1595
gaiaExport32 ( p_out, GAIA_POLYGON, 1, endian_arch);
1599
case GEOS_3D_MULTIPOINT:
1603
gaiaExport32 ( p_out, GAIA_MULTIPOINTZM, 1, endian_arch);
1606
gaiaExport32 ( p_out, GAIA_MULTIPOINTZ, 1, endian_arch);
1609
gaiaExport32 ( p_out, GAIA_MULTIPOINTM, 1, endian_arch);
1612
gaiaExport32 ( p_out, GAIA_MULTIPOINT, 1, endian_arch);
1616
case GEOS_3D_MULTILINESTRING:
1620
gaiaExport32 ( p_out, GAIA_MULTILINESTRINGZM, 1, endian_arch);
1623
gaiaExport32 ( p_out, GAIA_MULTILINESTRINGZ, 1, endian_arch);
1626
gaiaExport32 ( p_out, GAIA_MULTILINESTRINGM, 1, endian_arch);
1629
gaiaExport32 ( p_out, GAIA_MULTILINESTRING, 1, endian_arch);
1633
case GEOS_3D_MULTIPOLYGON:
1637
gaiaExport32 ( p_out, GAIA_MULTIPOLYGONZM, 1, endian_arch);
1640
gaiaExport32 ( p_out, GAIA_MULTIPOLYGONZ, 1, endian_arch);
1643
gaiaExport32 ( p_out, GAIA_MULTIPOLYGONM, 1, endian_arch);
1646
gaiaExport32 ( p_out, GAIA_MULTIPOLYGON, 1, endian_arch);
1650
case GEOS_3D_GEOMETRYCOLLECTION:
1654
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTIONZM, 1, endian_arch);
1657
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTIONZ, 1, endian_arch);
1660
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTIONM, 1, endian_arch);
1663
gaiaExport32 ( p_out, GAIA_GEOMETRYCOLLECTION, 1, endian_arch);
1672
// setting Geometry values
1674
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1675
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1676
p_in += sizeof(double);
1677
p_out += sizeof(double);
1678
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1679
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1680
p_in += sizeof(double);
1681
p_out += sizeof(double);
1682
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1683
p_in += sizeof(double);
1684
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1686
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
1687
p_out += sizeof(double);
1689
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1691
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1692
p_out += sizeof(double);
1695
case GEOS_3D_LINESTRING:
1696
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1698
gaiaExport32 ( p_out, points, 1, endian_arch);
1700
for ( iv = 0; iv < points; iv++ )
1702
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1703
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1704
p_in += sizeof(double);
1705
p_out += sizeof(double);
1706
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1707
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1708
p_in += sizeof(double);
1709
p_out += sizeof(double);
1710
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1711
p_in += sizeof(double);
1712
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1714
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
1715
p_out += sizeof(double);
1717
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1719
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1720
p_out += sizeof(double);
1724
case GEOS_3D_POLYGON:
1725
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
1727
gaiaExport32 ( p_out, rings, 1, endian_arch);
1729
for ( ib = 0; ib < rings; ib++ )
1731
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1733
gaiaExport32 ( p_out, points, 1, endian_arch);
1735
for ( iv = 0; iv < points; iv++ )
1737
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1738
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1739
p_in += sizeof(double);
1740
p_out += sizeof(double);
1741
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1742
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1743
p_in += sizeof(double);
1744
p_out += sizeof(double);
1745
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1746
p_in += sizeof(double);
1747
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1749
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
1750
p_out += sizeof(double);
1752
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1754
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1755
p_out += sizeof(double);
1760
case GEOS_3D_MULTIPOINT:
1761
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1763
gaiaExport32 ( p_out, entities, 1, endian_arch);
1765
for ( ie = 0; ie < entities; ie++ )
1772
gaiaExport32 ( p_out, GAIA_POINTZM, 1, endian_arch);
1775
gaiaExport32 ( p_out, GAIA_POINTZ, 1, endian_arch);
1778
gaiaExport32 ( p_out, GAIA_POINTM, 1, endian_arch);
1781
gaiaExport32 ( p_out, GAIA_POINT, 1, endian_arch);
1785
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1786
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1787
p_in += sizeof(double);
1788
p_out += sizeof(double);
1789
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1790
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1791
p_in += sizeof(double);
1792
p_out += sizeof(double);
1793
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1794
p_in += sizeof(double);
1795
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1797
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
1798
p_out += sizeof(double);
1800
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1802
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1803
p_out += sizeof(double);
1807
case GEOS_3D_MULTILINESTRING:
1808
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1810
gaiaExport32 ( p_out, entities, 1, endian_arch);
1812
for ( ie = 0; ie < entities; ie++ )
1819
gaiaExport32 ( p_out, GAIA_LINESTRINGZM, 1, endian_arch);
1822
gaiaExport32 ( p_out, GAIA_LINESTRINGZ, 1, endian_arch);
1825
gaiaExport32 ( p_out, GAIA_LINESTRINGM, 1, endian_arch);
1828
gaiaExport32 ( p_out, GAIA_LINESTRING, 1, endian_arch);
1832
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1834
gaiaExport32 ( p_out, points, 1, endian_arch);
1836
for ( iv = 0; iv < points; iv++ )
1838
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1839
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1840
p_in += sizeof(double);
1841
p_out += sizeof(double);
1842
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1843
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1844
p_in += sizeof(double);
1845
p_out += sizeof(double);
1846
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1847
p_in += sizeof(double);
1848
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1850
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
1851
p_out += sizeof(double);
1853
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1855
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1856
p_out += sizeof(double);
1861
case GEOS_3D_MULTIPOLYGON:
1862
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1864
gaiaExport32 ( p_out, entities, 1, endian_arch);
1866
for ( ie = 0; ie < entities; ie++ )
1873
gaiaExport32 ( p_out, GAIA_POLYGONZM, 1, endian_arch);
1876
gaiaExport32 ( p_out, GAIA_POLYGONZ, 1, endian_arch);
1879
gaiaExport32 ( p_out, GAIA_POLYGONM, 1, endian_arch);
1882
gaiaExport32 ( p_out, GAIA_POLYGON, 1, endian_arch);
1886
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
1888
gaiaExport32 ( p_out, rings, 1, endian_arch);
1890
for ( ib = 0; ib < rings; ib++ )
1892
points = gaiaImport32 ( p_in, little_endian, endian_arch );
1894
gaiaExport32 ( p_out, points, 1, endian_arch);
1896
for ( iv = 0; iv < points; iv++ )
1898
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1899
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1900
p_in += sizeof(double);
1901
p_out += sizeof(double);
1902
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1903
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1904
p_in += sizeof(double);
1905
p_out += sizeof(double);
1906
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1907
p_in += sizeof(double);
1908
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
1910
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
1911
p_out += sizeof(double);
1913
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
1915
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
1916
p_out += sizeof(double);
1922
case GEOS_3D_GEOMETRYCOLLECTION:
1923
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
1925
gaiaExport32 ( p_out, entities, 1, endian_arch );
1927
for ( ie = 0; ie < entities; ie++ )
1929
int type2 = gaiaImport32 ( p_in + 1, little_endian, endian_arch );
1938
gaiaExport32 ( p_out, GAIA_POINTZM, 1, endian_arch);
1941
gaiaExport32 ( p_out, GAIA_POINTZ, 1, endian_arch);
1944
gaiaExport32 ( p_out, GAIA_POINTM, 1, endian_arch);
1947
gaiaExport32 ( p_out, GAIA_POINT, 1, endian_arch);
1951
case GEOS_3D_LINESTRING:
1955
gaiaExport32 ( p_out, GAIA_LINESTRINGZM, 1, endian_arch);
1958
gaiaExport32 ( p_out, GAIA_LINESTRINGZ, 1, endian_arch);
1961
gaiaExport32 ( p_out, GAIA_LINESTRINGM, 1, endian_arch);
1964
gaiaExport32 ( p_out, GAIA_LINESTRING, 1, endian_arch);
1968
case GEOS_3D_POLYGON:
1972
gaiaExport32 ( p_out, GAIA_POLYGONZM, 1, endian_arch);
1975
gaiaExport32 ( p_out, GAIA_POLYGONZ, 1, endian_arch);
1978
gaiaExport32 ( p_out, GAIA_POLYGONM, 1, endian_arch);
1981
gaiaExport32 ( p_out, GAIA_POLYGON, 1, endian_arch);
1989
// setting sub-Geometry values
1991
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1992
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
1993
p_in += sizeof(double);
1994
p_out += sizeof(double);
1995
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
1996
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
1997
p_in += sizeof(double);
1998
p_out += sizeof(double);
1999
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2000
p_in += sizeof(double);
2001
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
2003
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2004
p_out += sizeof(double);
2006
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
2008
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
2009
p_out += sizeof(double);
2012
case GEOS_3D_LINESTRING:
2013
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2015
gaiaExport32 ( p_out, points, 1, endian_arch);
2017
for ( iv = 0; iv < points; iv++ )
2019
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2020
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2021
p_in += sizeof(double);
2022
p_out += sizeof(double);
2023
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2024
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2025
p_in += sizeof(double);
2026
p_out += sizeof(double);
2027
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2028
p_in += sizeof(double);
2029
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
2031
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2032
p_out += sizeof(double);
2034
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
2036
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
2037
p_out += sizeof(double);
2041
case GEOS_3D_POLYGON:
2042
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2044
gaiaExport32 ( p_out, rings, 1, endian_arch);
2046
for ( ib = 0; ib < rings; ib++ )
2048
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2050
gaiaExport32 ( p_out, points, 1, endian_arch);
2052
for ( iv = 0; iv < points; iv++ )
2054
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2055
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2056
p_in += sizeof(double);
2057
p_out += sizeof(double);
2058
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2059
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2060
p_in += sizeof(double);
2061
p_out += sizeof(double);
2062
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2063
p_in += sizeof(double);
2064
if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M )
2066
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2067
p_out += sizeof(double);
2069
if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M )
2071
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // M
2072
p_out += sizeof(double);
2083
void QgsSpatiaLiteProvider::convertToGeosWKB ( const unsigned char *blob,
2085
unsigned char **wkb,
2088
// attempting to convert to 2D/3D GEOS own WKB
2092
int endian_arch = gaiaEndianArch ();
2100
const unsigned char *p_in;
2101
unsigned char *p_out;
2106
if ( blob_size < 5 )
2108
if ( *( blob + 0 ) == 0x01 )
2109
little_endian = GAIA_LITTLE_ENDIAN;
2111
little_endian = GAIA_BIG_ENDIAN;
2112
type = gaiaImport32 ( blob + 1, little_endian, endian_arch );
2113
if (type == GAIA_POINTZ || type == GAIA_LINESTRINGZ
2114
|| type == GAIA_POLYGONZ
2115
|| type == GAIA_MULTIPOINTZ || type == GAIA_MULTILINESTRINGZ
2116
|| type == GAIA_MULTIPOLYGONZ || type == GAIA_GEOMETRYCOLLECTIONZ)
2118
else if (type == GAIA_POINTM || type == GAIA_LINESTRINGM
2119
|| type == GAIA_POLYGONM || type == GAIA_MULTIPOINTM
2120
|| type == GAIA_MULTILINESTRINGM || type == GAIA_MULTIPOLYGONM
2121
|| type == GAIA_GEOMETRYCOLLECTIONM)
2123
else if (type == GAIA_POINTZM || type == GAIA_LINESTRINGZM
2124
|| type == GAIA_POLYGONZM || type == GAIA_MULTIPOINTZM
2125
|| type == GAIA_MULTILINESTRINGZM || type == GAIA_MULTIPOLYGONZM
2126
|| type == GAIA_GEOMETRYCOLLECTIONZM)
2128
else if (type == GAIA_POINT || type == GAIA_LINESTRING
2129
|| type == GAIA_POLYGON || type == GAIA_MULTIPOINT
2130
|| type == GAIA_MULTILINESTRING || type == GAIA_MULTIPOLYGON
2131
|| type == GAIA_GEOMETRYCOLLECTION)
2138
// already 2D: simply copying is required
2139
unsigned char *wkbGeom = new unsigned char[blob_size + 1];
2140
memset( wkbGeom, '\0', blob_size + 1 );
2141
memcpy( wkbGeom, blob, blob_size );
2143
*geom_size = blob_size + 1;
2147
// we need creating a 3D GEOS WKB
2151
// compunting the required size
2155
gsize += 3 * sizeof(double);
2157
case GAIA_LINESTRINGZ:
2158
case GAIA_LINESTRINGM:
2159
case GAIA_LINESTRINGZM:
2160
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2162
gsize += points * ( 3 * sizeof(double) );
2166
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2169
for ( ib = 0; ib < rings; ib++ )
2171
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2174
gsize += points * ( 3 * sizeof(double) );
2175
p_in += points * ( 3 * sizeof(double) );
2178
case GAIA_POLYGONZM:
2179
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2182
for ( ib = 0; ib < rings; ib++ )
2184
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2187
gsize += points * ( 3 * sizeof(double) );
2188
p_in += points * ( 4 * sizeof(double) );
2192
gsize += computeMultiWKB3Dsize( p_in, little_endian, endian_arch );
2196
unsigned char *wkbGeom = new unsigned char[gsize];
2197
memset( wkbGeom, '\0', gsize );
2199
// building GEOS 3D WKB
2200
*wkbGeom = 0x01; // little endian byte order
2201
type = gaiaImport32 ( blob + 1, little_endian, endian_arch );
2204
// setting Geometry TYPE
2208
gaiaExport32 ( wkbGeom + 1, GEOS_3D_POINT, 1, endian_arch);
2210
case GAIA_LINESTRINGZ:
2211
case GAIA_LINESTRINGM:
2212
case GAIA_LINESTRINGZM:
2213
gaiaExport32 ( wkbGeom + 1, GEOS_3D_LINESTRING, 1, endian_arch);
2217
case GAIA_POLYGONZM:
2218
gaiaExport32 ( wkbGeom + 1, GEOS_3D_POLYGON, 1, endian_arch);
2220
case GAIA_MULTIPOINTZ:
2221
case GAIA_MULTIPOINTM:
2222
case GAIA_MULTIPOINTZM:
2223
gaiaExport32 ( wkbGeom + 1, GEOS_3D_MULTIPOINT, 1, endian_arch);
2225
case GAIA_MULTILINESTRINGZ:
2226
case GAIA_MULTILINESTRINGM:
2227
case GAIA_MULTILINESTRINGZM:
2228
gaiaExport32 ( wkbGeom + 1, GEOS_3D_MULTILINESTRING, 1, endian_arch);
2230
case GAIA_MULTIPOLYGONZ:
2231
case GAIA_MULTIPOLYGONM:
2232
case GAIA_MULTIPOLYGONZM:
2233
gaiaExport32 ( wkbGeom + 1, GEOS_3D_MULTIPOLYGON, 1, endian_arch);
2235
case GAIA_GEOMETRYCOLLECTIONZ:
2236
case GAIA_GEOMETRYCOLLECTIONM:
2237
case GAIA_GEOMETRYCOLLECTIONZM:
2238
gaiaExport32 ( wkbGeom + 1, GEOS_3D_GEOMETRYCOLLECTION, 1, endian_arch);
2242
p_out = wkbGeom + 5;
2245
// setting Geometry values
2247
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2248
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2249
p_in += sizeof(double);
2250
p_out += sizeof(double);
2251
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2252
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2253
p_in += sizeof(double);
2254
p_out += sizeof(double);
2255
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2256
p_in += sizeof(double);
2257
p_out += sizeof(double);
2261
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2262
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2263
p_in += sizeof(double);
2264
p_out += sizeof(double);
2265
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2266
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2267
p_in += sizeof(double);
2268
p_out += sizeof(double);
2269
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2270
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2271
p_in += sizeof(double);
2272
p_out += sizeof(double);
2273
if (type == GAIA_POINTZM)
2274
p_in += sizeof(double);
2276
case GAIA_LINESTRINGM:
2277
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2279
gaiaExport32 ( p_out, points, 1, endian_arch);
2281
for ( iv = 0; iv < points; iv++ )
2283
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2284
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2285
p_in += sizeof(double);
2286
p_out += sizeof(double);
2287
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2288
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2289
p_in += sizeof(double);
2290
p_out += sizeof(double);
2291
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2292
p_in += sizeof(double);
2293
p_out += sizeof(double);
2296
case GAIA_LINESTRINGZ:
2297
case GAIA_LINESTRINGZM:
2298
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2300
gaiaExport32 ( p_out, points, 1, endian_arch);
2302
for ( iv = 0; iv < points; iv++ )
2304
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2305
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2306
p_in += sizeof(double);
2307
p_out += sizeof(double);
2308
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2309
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2310
p_in += sizeof(double);
2311
p_out += sizeof(double);
2312
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2313
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2314
p_in += sizeof(double);
2315
p_out += sizeof(double);
2316
if (type == GAIA_LINESTRINGZM)
2317
p_in += sizeof(double);
2321
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2323
gaiaExport32 ( p_out, rings, 1, endian_arch);
2325
for ( ib = 0; ib < rings; ib++ )
2327
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2329
gaiaExport32 ( p_out, points, 1, endian_arch);
2331
for ( iv = 0; iv < points; iv++ )
2333
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2334
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2335
p_in += sizeof(double);
2336
p_out += sizeof(double);
2337
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2338
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2339
p_in += sizeof(double);
2340
p_out += sizeof(double);
2341
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2342
p_in += sizeof(double);
2343
p_out += sizeof(double);
2348
case GAIA_POLYGONZM:
2349
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2351
gaiaExport32 ( p_out, rings, 1, endian_arch);
2353
for ( ib = 0; ib < rings; ib++ )
2355
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2357
gaiaExport32 ( p_out, points, 1, endian_arch);
2359
for ( iv = 0; iv < points; iv++ )
2361
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2362
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2363
p_in += sizeof(double);
2364
p_out += sizeof(double);
2365
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2366
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2367
p_in += sizeof(double);
2368
p_out += sizeof(double);
2369
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2370
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2371
p_in += sizeof(double);
2372
p_out += sizeof(double);
2373
if (type == GAIA_POLYGONZM)
2374
p_in += sizeof(double);
2378
case GAIA_MULTIPOINTM:
2379
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2381
gaiaExport32 ( p_out, entities, 1, endian_arch);
2383
for ( ie = 0; ie < entities; ie++ )
2387
gaiaExport32 ( p_out, GEOS_3D_POINT, 1, endian_arch);
2389
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2390
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2391
p_in += sizeof(double);
2392
p_out += sizeof(double);
2393
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2394
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2395
p_in += sizeof(double);
2396
p_out += sizeof(double);
2397
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2398
p_in += sizeof(double);
2399
p_out += sizeof(double);
2402
case GAIA_MULTIPOINTZ:
2403
case GAIA_MULTIPOINTZM:
2404
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2406
gaiaExport32 ( p_out, entities, 1, endian_arch);
2408
for ( ie = 0; ie < entities; ie++ )
2412
gaiaExport32 ( p_out, GEOS_3D_POINT, 1, endian_arch);
2414
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2415
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2416
p_in += sizeof(double);
2417
p_out += sizeof(double);
2418
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2419
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2420
p_in += sizeof(double);
2421
p_out += sizeof(double);
2422
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2423
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2424
p_in += sizeof(double);
2425
p_out += sizeof(double);
2426
if (type == GAIA_MULTIPOINTZM)
2427
p_in += sizeof(double);
2430
case GAIA_MULTILINESTRINGM:
2431
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2433
gaiaExport32 ( p_out, entities, 1, endian_arch);
2435
for ( ie = 0; ie < entities; ie++ )
2439
gaiaExport32 ( p_out, GEOS_3D_LINESTRING, 1, endian_arch);
2441
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2443
gaiaExport32 ( p_out, points, 1, endian_arch);
2445
for ( iv = 0; iv < points; iv++ )
2447
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2448
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2449
p_in += sizeof(double);
2450
p_out += sizeof(double);
2451
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2452
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2453
p_in += sizeof(double);
2454
p_out += sizeof(double);
2455
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2456
p_in += sizeof(double);
2457
p_out += sizeof(double);
2461
case GAIA_MULTILINESTRINGZ:
2462
case GAIA_MULTILINESTRINGZM:
2463
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2465
gaiaExport32 ( p_out, entities, 1, endian_arch);
2467
for ( ie = 0; ie < entities; ie++ )
2471
gaiaExport32 ( p_out, GEOS_3D_LINESTRING, 1, endian_arch);
2473
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2475
gaiaExport32 ( p_out, points, 1, endian_arch);
2477
for ( iv = 0; iv < points; iv++ )
2479
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2480
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2481
p_in += sizeof(double);
2482
p_out += sizeof(double);
2483
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2484
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2485
p_in += sizeof(double);
2486
p_out += sizeof(double);
2487
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2488
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2489
p_in += sizeof(double);
2490
p_out += sizeof(double);
2491
if (type == GAIA_MULTILINESTRINGZM)
2492
p_in += sizeof(double);
2496
case GAIA_MULTIPOLYGONM:
2497
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2499
gaiaExport32 ( p_out, entities, 1, endian_arch);
2501
for ( ie = 0; ie < entities; ie++ )
2505
gaiaExport32 ( p_out, GEOS_3D_POLYGON, 1, endian_arch);
2507
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2509
gaiaExport32 ( p_out, rings, 1, endian_arch);
2511
for ( ib = 0; ib < rings; ib++ )
2513
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2515
gaiaExport32 ( p_out, points, 1, endian_arch);
2517
for ( iv = 0; iv < points; iv++ )
2519
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2520
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2521
p_in += sizeof(double);
2522
p_out += sizeof(double);
2523
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2524
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2525
p_in += sizeof(double);
2526
p_out += sizeof(double);
2527
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2528
p_in += sizeof(double);
2529
p_out += sizeof(double);
2534
case GAIA_MULTIPOLYGONZ:
2535
case GAIA_MULTIPOLYGONZM:
2536
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2538
gaiaExport32 ( p_out, entities, 1, endian_arch);
2540
for ( ie = 0; ie < entities; ie++ )
2544
gaiaExport32 ( p_out, GEOS_3D_POLYGON, 1, endian_arch);
2546
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2548
gaiaExport32 ( p_out, rings, 1, endian_arch);
2550
for ( ib = 0; ib < rings; ib++ )
2552
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2554
gaiaExport32 ( p_out, points, 1, endian_arch);
2556
for ( iv = 0; iv < points; iv++ )
2558
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2559
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2560
p_in += sizeof(double);
2561
p_out += sizeof(double);
2562
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2563
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2564
p_in += sizeof(double);
2565
p_out += sizeof(double);
2566
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2567
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2568
p_in += sizeof(double);
2569
p_out += sizeof(double);
2570
if (type == GAIA_MULTIPOLYGONZM)
2571
p_in += sizeof(double);
2576
case GAIA_GEOMETRYCOLLECTIONM:
2577
case GAIA_GEOMETRYCOLLECTIONZ:
2578
case GAIA_GEOMETRYCOLLECTIONZM:
2579
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2581
gaiaExport32 ( p_out, entities, 1, endian_arch );
2583
for ( ie = 0; ie < entities; ie++ )
2585
int type2 = gaiaImport32 ( p_in + 1, little_endian, endian_arch );
2593
gaiaExport32 ( p_out, GEOS_3D_POINT, 1, endian_arch);
2595
case GAIA_LINESTRINGZ:
2596
case GAIA_LINESTRINGM:
2597
case GAIA_LINESTRINGZM:
2598
gaiaExport32 ( p_out, GEOS_3D_LINESTRING, 1, endian_arch);
2602
case GAIA_POLYGONZM:
2603
gaiaExport32 ( p_out, GEOS_3D_POLYGON, 1, endian_arch);
2609
// setting sub-Geometry values
2611
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2612
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2613
p_in += sizeof(double);
2614
p_out += sizeof(double);
2615
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2616
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2617
p_in += sizeof(double);
2618
p_out += sizeof(double);
2619
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2620
p_in += sizeof(double);
2621
p_out += sizeof(double);
2625
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2626
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2627
p_in += sizeof(double);
2628
p_out += sizeof(double);
2629
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2630
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2631
p_in += sizeof(double);
2632
p_out += sizeof(double);
2633
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2634
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2635
p_in += sizeof(double);
2636
p_out += sizeof(double);
2637
if (type2 == GAIA_POINTZM)
2638
p_in += sizeof(double);
2640
case GAIA_LINESTRINGM:
2641
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2643
gaiaExport32 ( p_out, points, 1, endian_arch);
2645
for ( iv = 0; iv < points; iv++ )
2647
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2648
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2649
p_in += sizeof(double);
2650
p_out += sizeof(double);
2651
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2652
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2653
p_in += sizeof(double);
2654
p_out += sizeof(double);
2655
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2656
p_in += sizeof(double);
2657
p_out += sizeof(double);
2660
case GAIA_LINESTRINGZ:
2661
case GAIA_LINESTRINGZM:
2662
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2664
gaiaExport32 ( p_out, points, 1, endian_arch);
2666
for ( iv = 0; iv < points; iv++ )
2668
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2669
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2670
p_in += sizeof(double);
2671
p_out += sizeof(double);
2672
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2673
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2674
p_in += sizeof(double);
2675
p_out += sizeof(double);
2676
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2677
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2678
p_in += sizeof(double);
2679
p_out += sizeof(double);
2680
if (type2 == GAIA_LINESTRINGZM)
2681
p_in += sizeof(double);
2685
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2687
gaiaExport32 ( p_out, rings, 1, endian_arch);
2689
for ( ib = 0; ib < rings; ib++ )
2691
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2693
gaiaExport32 ( p_out, points, 1, endian_arch);
2695
for ( iv = 0; iv < points; iv++ )
2697
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2698
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2699
p_in += sizeof(double);
2700
p_out += sizeof(double);
2701
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2702
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2703
p_in += sizeof(double);
2704
p_out += sizeof(double);
2705
gaiaExport64 ( p_out, 0.0, 1, endian_arch ); // Z
2706
p_in += sizeof(double);
2707
p_out += sizeof(double);
2712
case GAIA_POLYGONZM:
2713
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2715
gaiaExport32 ( p_out, rings, 1, endian_arch);
2717
for ( ib = 0; ib < rings; ib++ )
2719
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2721
gaiaExport32 ( p_out, points, 1, endian_arch);
2723
for ( iv = 0; iv < points; iv++ )
2725
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2726
gaiaExport64 ( p_out, coord, 1, endian_arch ); // X
2727
p_in += sizeof(double);
2728
p_out += sizeof(double);
2729
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2730
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Y
2731
p_in += sizeof(double);
2732
p_out += sizeof(double);
2733
coord = gaiaImport64 ( p_in, little_endian, endian_arch );
2734
gaiaExport64 ( p_out, coord, 1, endian_arch ); // Z
2735
p_in += sizeof(double);
2736
p_out += sizeof(double);
2737
if (type2 == GAIA_POLYGONZM)
2738
p_in += sizeof(double);
2751
int QgsSpatiaLiteProvider::computeMultiWKB3Dsize( const unsigned char *p_in, int little_endian, int endian_arch )
2753
// computing the required size to store a GEOS 3D MultiXX
2762
entities = gaiaImport32 ( p_in, little_endian, endian_arch );
2765
for ( ie = 0; ie < entities; ie++ )
2767
type = gaiaImport32 ( p_in + 1, little_endian, endian_arch );
2772
// compunting the required size
2775
size += 3 * sizeof(double);
2776
p_in += 3 * sizeof(double);
2779
size += 3 * sizeof(double);
2780
p_in += 4 * sizeof(double);
2782
case GAIA_LINESTRINGZ:
2783
case GAIA_LINESTRINGM:
2784
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2787
size += points * ( 3 * sizeof(double) );
2788
p_in += points * ( 3 * sizeof(double) );
2790
case GAIA_LINESTRINGZM:
2791
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2794
size += points * ( 3 * sizeof(double) );
2795
p_in += points * ( 4 * sizeof(double) );
2799
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2802
for ( ib = 0; ib < rings; ib++ )
2804
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2807
size += points * ( 3 * sizeof(double) );
2808
p_in += points * ( 3 * sizeof(double) );
2811
case GAIA_POLYGONZM:
2812
rings = gaiaImport32 ( p_in, little_endian, endian_arch );
2815
for ( ib = 0; ib < rings; ib++ )
2817
points = gaiaImport32 ( p_in, little_endian, endian_arch );
2820
size += points * ( 3 * sizeof(double) );
2821
p_in += points * ( 4 * sizeof(double) );
474
2830
QString QgsSpatiaLiteProvider::subsetString()
476
2832
return mSubsetString;
479
bool QgsSpatiaLiteProvider::setSubsetString( QString theSQL )
2835
bool QgsSpatiaLiteProvider::setSubsetString( QString theSQL, bool updateFeatureCount )
481
2837
QString prevSubsetString = mSubsetString;
482
2838
mSubsetString = theSQL;