Skip to content

Commit 8302fc3

Browse files
authored
[spatialite provider] further zm support fixes
1 parent e0aa5e1 commit 8302fc3

File tree

2 files changed

+126
-106
lines changed

2 files changed

+126
-106
lines changed

src/providers/spatialite/qgsspatialiteprovider.cpp

Lines changed: 125 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,7 @@ QgsFeatureIterator QgsSpatiaLiteProvider::getFeatures( const QgsFeatureRequest &
11221122

11231123

11241124
int QgsSpatiaLiteProvider::computeSizeFromGeosWKB2D( const unsigned char *blob,
1125-
int size, int type, int nDims,
1125+
int size, QgsWkbTypes::Type type, int nDims,
11261126
int little_endian, int endian_arch )
11271127
{
11281128
Q_UNUSED( size );
@@ -1133,49 +1133,33 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB2D( const unsigned char *blob,
11331133
const unsigned char *p_in = blob + 5;
11341134
int gsize = 5;
11351135

1136-
switch ( type )
1136+
if ( QgsWkbTypes::isMultiType( type ) )
11371137
{
1138-
// compunting the required size
1139-
case GAIA_POINT:
1140-
switch ( nDims )
1141-
{
1142-
case GAIA_XY_Z_M:
1143-
gsize += 4 * sizeof( double );
1144-
break;
1145-
case GAIA_XY_M:
1146-
case GAIA_XY_Z:
1147-
gsize += 3 * sizeof( double );
1148-
break;
1149-
default:
1150-
gsize += 2 * sizeof( double );
1151-
break;
1152-
}
1153-
break;
1154-
case GAIA_LINESTRING:
1155-
points = gaiaImport32( p_in, little_endian, endian_arch );
1156-
gsize += 4;
1157-
switch ( nDims )
1158-
{
1159-
case GAIA_XY_Z_M:
1160-
gsize += points * ( 4 * sizeof( double ) );
1161-
break;
1162-
case GAIA_XY_M:
1163-
case GAIA_XY_Z:
1164-
gsize += points * ( 3 * sizeof( double ) );
1165-
break;
1166-
default:
1167-
gsize += points * ( 2 * sizeof( double ) );
1168-
break;
1169-
}
1170-
break;
1171-
case GAIA_POLYGON:
1172-
rings = gaiaImport32( p_in, little_endian, endian_arch );
1173-
p_in += 4;
1174-
gsize += 4;
1175-
for ( ib = 0; ib < rings; ib++ )
1176-
{
1138+
gsize += computeSizeFromMultiWKB2D( p_in, nDims, little_endian,
1139+
endian_arch );
1140+
}
1141+
else
1142+
{
1143+
switch ( QgsWkbTypes::geometryType( type ) )
1144+
{
1145+
// compunting the required size
1146+
case QgsWkbTypes::PointGeometry:
1147+
switch ( nDims )
1148+
{
1149+
case GAIA_XY_Z_M:
1150+
gsize += 4 * sizeof( double );
1151+
break;
1152+
case GAIA_XY_M:
1153+
case GAIA_XY_Z:
1154+
gsize += 3 * sizeof( double );
1155+
break;
1156+
default:
1157+
gsize += 2 * sizeof( double );
1158+
break;
1159+
}
1160+
break;
1161+
case QgsWkbTypes::LineGeometry:
11771162
points = gaiaImport32( p_in, little_endian, endian_arch );
1178-
p_in += 4;
11791163
gsize += 4;
11801164
switch ( nDims )
11811165
{
@@ -1190,13 +1174,33 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB2D( const unsigned char *blob,
11901174
gsize += points * ( 2 * sizeof( double ) );
11911175
break;
11921176
}
1193-
p_in += points * ( 2 * sizeof( double ) );
1194-
}
1195-
break;
1196-
default:
1197-
gsize += computeSizeFromMultiWKB2D( p_in, nDims, little_endian,
1198-
endian_arch );
1199-
break;
1177+
break;
1178+
case QgsWkbTypes::PolygonGeometry:
1179+
rings = gaiaImport32( p_in, little_endian, endian_arch );
1180+
p_in += 4;
1181+
gsize += 4;
1182+
for ( ib = 0; ib < rings; ib++ )
1183+
{
1184+
points = gaiaImport32( p_in, little_endian, endian_arch );
1185+
p_in += 4;
1186+
gsize += 4;
1187+
switch ( nDims )
1188+
{
1189+
case GAIA_XY_Z_M:
1190+
gsize += points * ( 4 * sizeof( double ) );
1191+
break;
1192+
case GAIA_XY_M:
1193+
case GAIA_XY_Z:
1194+
gsize += points * ( 3 * sizeof( double ) );
1195+
break;
1196+
default:
1197+
gsize += points * ( 2 * sizeof( double ) );
1198+
break;
1199+
}
1200+
p_in += points * ( 2 * sizeof( double ) );
1201+
}
1202+
break;
1203+
}
12001204
}
12011205

12021206
return gsize;
@@ -1232,16 +1236,18 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB2D( const unsigned char *p_in,
12321236
{
12331237
case GAIA_XY_Z_M:
12341238
size += 4 * sizeof( double );
1239+
p_in += 4 * sizeof( double );
12351240
break;
12361241
case GAIA_XY_Z:
12371242
case GAIA_XY_M:
12381243
size += 3 * sizeof( double );
1244+
p_in += 3 * sizeof( double );
12391245
break;
12401246
default:
12411247
size += 2 * sizeof( double );
1248+
p_in += 2 * sizeof( double );
12421249
break;
12431250
}
1244-
p_in += 2 * sizeof( double );
12451251
break;
12461252
case GAIA_LINESTRING:
12471253
points = gaiaImport32( p_in, little_endian, endian_arch );
@@ -1251,16 +1257,18 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB2D( const unsigned char *p_in,
12511257
{
12521258
case GAIA_XY_Z_M:
12531259
size += points * ( 4 * sizeof( double ) );
1260+
p_in += points * ( 4 * sizeof( double ) );
12541261
break;
12551262
case GAIA_XY_Z:
12561263
case GAIA_XY_M:
12571264
size += points * ( 3 * sizeof( double ) );
1265+
p_in += points * ( 3 * sizeof( double ) );
12581266
break;
12591267
default:
12601268
size += points * ( 2 * sizeof( double ) );
1269+
p_in += points * ( 2 * sizeof( double ) );
12611270
break;
12621271
}
1263-
p_in += points * ( 2 * sizeof( double ) );
12641272
break;
12651273
case GAIA_POLYGON:
12661274
rings = gaiaImport32( p_in, little_endian, endian_arch );
@@ -1275,16 +1283,18 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB2D( const unsigned char *p_in,
12751283
{
12761284
case GAIA_XY_Z_M:
12771285
size += points * ( 4 * sizeof( double ) );
1286+
p_in += points * ( 4 * sizeof( double ) );
12781287
break;
12791288
case GAIA_XY_Z:
12801289
case GAIA_XY_M:
12811290
size += points * ( 3 * sizeof( double ) );
1291+
p_in += points * ( 3 * sizeof( double ) );
12821292
break;
12831293
default:
12841294
size += points * ( 2 * sizeof( double ) );
1295+
p_in += points * ( 2 * sizeof( double ) );
12851296
break;
12861297
}
1287-
p_in += points * ( 2 * sizeof( double ) );
12881298
}
12891299
break;
12901300
}
@@ -1305,49 +1315,33 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob,
13051315
const unsigned char *p_in = blob + 5;
13061316
int gsize = 5;
13071317

1308-
switch ( QgsWkbTypes::geometryType( type ) )
1318+
if ( QgsWkbTypes::isMultiType( type ) )
13091319
{
1310-
// compunting the required size
1311-
case QgsWkbTypes::PointGeometry:
1312-
switch ( nDims )
1313-
{
1314-
case GAIA_XY_Z_M:
1315-
gsize += 4 * sizeof( double );
1316-
break;
1317-
case GAIA_XY_M:
1318-
case GAIA_XY_Z:
1319-
gsize += 3 * sizeof( double );
1320-
break;
1321-
default:
1322-
gsize += 2 * sizeof( double );
1323-
break;
1324-
}
1325-
break;
1326-
case QgsWkbTypes::LineGeometry:
1327-
points = gaiaImport32( p_in, little_endian, endian_arch );
1328-
gsize += 4;
1329-
switch ( nDims )
1330-
{
1331-
case GAIA_XY_Z_M:
1332-
gsize += points * ( 4 * sizeof( double ) );
1333-
break;
1334-
case GAIA_XY_M:
1335-
case GAIA_XY_Z:
1336-
gsize += points * ( 3 * sizeof( double ) );
1337-
break;
1338-
default:
1339-
gsize += points * ( 2 * sizeof( double ) );
1340-
break;
1341-
}
1342-
break;
1343-
case QgsWkbTypes::PolygonGeometry:
1344-
rings = gaiaImport32( p_in, little_endian, endian_arch );
1345-
p_in += 4;
1346-
gsize += 4;
1347-
for ( ib = 0; ib < rings; ib++ )
1348-
{
1320+
gsize += computeSizeFromMultiWKB3D( p_in, nDims, little_endian,
1321+
endian_arch );
1322+
}
1323+
else
1324+
{
1325+
switch ( QgsWkbTypes::geometryType( type ) )
1326+
{
1327+
// compunting the required size
1328+
case QgsWkbTypes::PointGeometry:
1329+
switch ( nDims )
1330+
{
1331+
case GAIA_XY_Z_M:
1332+
gsize += 4 * sizeof( double );
1333+
break;
1334+
case GAIA_XY_M:
1335+
case GAIA_XY_Z:
1336+
gsize += 3 * sizeof( double );
1337+
break;
1338+
default:
1339+
gsize += 2 * sizeof( double );
1340+
break;
1341+
}
1342+
break;
1343+
case QgsWkbTypes::LineGeometry:
13491344
points = gaiaImport32( p_in, little_endian, endian_arch );
1350-
p_in += 4;
13511345
gsize += 4;
13521346
switch ( nDims )
13531347
{
@@ -1362,13 +1356,33 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob,
13621356
gsize += points * ( 2 * sizeof( double ) );
13631357
break;
13641358
}
1365-
p_in += points * ( 3 * sizeof( double ) );
1366-
}
1367-
break;
1368-
default:
1369-
gsize += computeSizeFromMultiWKB3D( p_in, nDims, little_endian,
1370-
endian_arch );
1371-
break;
1359+
break;
1360+
case QgsWkbTypes::PolygonGeometry:
1361+
rings = gaiaImport32( p_in, little_endian, endian_arch );
1362+
p_in += 4;
1363+
gsize += 4;
1364+
for ( ib = 0; ib < rings; ib++ )
1365+
{
1366+
points = gaiaImport32( p_in, little_endian, endian_arch );
1367+
p_in += 4;
1368+
gsize += 4;
1369+
switch ( nDims )
1370+
{
1371+
case GAIA_XY_Z_M:
1372+
gsize += points * ( 4 * sizeof( double ) );
1373+
break;
1374+
case GAIA_XY_M:
1375+
case GAIA_XY_Z:
1376+
gsize += points * ( 3 * sizeof( double ) );
1377+
break;
1378+
default:
1379+
gsize += points * ( 2 * sizeof( double ) );
1380+
break;
1381+
}
1382+
p_in += points * ( 3 * sizeof( double ) );
1383+
}
1384+
break;
1385+
}
13721386
}
13731387

13741388
return gsize;
@@ -1404,16 +1418,18 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in,
14041418
{
14051419
case GAIA_XY_Z_M:
14061420
size += 4 * sizeof( double );
1421+
p_in += 4 * sizeof( double );
14071422
break;
14081423
case GAIA_XY_Z:
14091424
case GAIA_XY_M:
14101425
size += 3 * sizeof( double );
1426+
p_in += 3 * sizeof( double );
14111427
break;
14121428
default:
14131429
size += 2 * sizeof( double );
1430+
p_in += 2 * sizeof( double );
14141431
break;
14151432
}
1416-
p_in += 3 * sizeof( double );
14171433
break;
14181434
case QgsWkbTypes::LineGeometry:
14191435
points = gaiaImport32( p_in, little_endian, endian_arch );
@@ -1423,16 +1439,18 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in,
14231439
{
14241440
case GAIA_XY_Z_M:
14251441
size += points * ( 4 * sizeof( double ) );
1442+
p_in += points * ( 4 * sizeof( double ) );
14261443
break;
14271444
case GAIA_XY_Z:
14281445
case GAIA_XY_M:
14291446
size += points * ( 3 * sizeof( double ) );
1447+
p_in += points * ( 3 * sizeof( double ) );
14301448
break;
14311449
default:
14321450
size += points * ( 2 * sizeof( double ) );
1451+
p_in += points * ( 2 * sizeof( double ) );
14331452
break;
14341453
}
1435-
p_in += points * ( 3 * sizeof( double ) );
14361454
break;
14371455
case QgsWkbTypes::PolygonGeometry:
14381456
rings = gaiaImport32( p_in, little_endian, endian_arch );
@@ -1447,16 +1465,18 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in,
14471465
{
14481466
case GAIA_XY_Z_M:
14491467
size += points * ( 4 * sizeof( double ) );
1468+
p_in += points * ( 4 * sizeof( double ) );
14501469
break;
14511470
case GAIA_XY_Z:
14521471
case GAIA_XY_M:
14531472
size += points * ( 3 * sizeof( double ) );
1473+
p_in += points * ( 3 * sizeof( double ) );
14541474
break;
14551475
default:
14561476
size += points * ( 2 * sizeof( double ) );
1477+
p_in += points * ( 2 * sizeof( double ) );
14571478
break;
14581479
}
1459-
p_in += points * ( 3 * sizeof( double ) );
14601480
}
14611481
break;
14621482
}
@@ -1505,7 +1525,7 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB( const unsigned char *blob,
15051525
return;
15061526
}
15071527

1508-
// we need creating a GAIA WKB
1528+
// we need creating a GAIA WKB
15091529
if ( gDims == 3 )
15101530
gsize = computeSizeFromGeosWKB3D( blob, blob_size, type, nDims,
15111531
little_endian, endian_arch );
@@ -3183,7 +3203,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob,
31833203
{
31843204
p_in += 5;
31853205
*p_out++ = 0x01;
3186-
gaiaExport32( p_out, type == GAIA_MULTIPOLYGONZ ? QgsWkbTypes::Polygon25D : QgsWkbTypes::PolygonZM, 1, endian_arch );
3206+
gaiaExport32( p_out, type == GAIA_MULTIPOLYGONZ ? QgsWkbTypes::Polygon25D : QgsWkbTypes::PolygonM, 1, endian_arch );
31873207
p_out += 4;
31883208
rings = gaiaImport32( p_in, little_endian, endian_arch );
31893209
p_in += 4;

src/providers/spatialite/qgsspatialiteprovider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider
361361
QgsWkbTypes::Type type, int nDims, int little_endian,
362362
int endian_arch );
363363
int computeSizeFromGeosWKB2D( const unsigned char *blob, int size,
364-
int type, int nDims, int little_endian,
364+
QgsWkbTypes::Type type, int nDims, int little_endian,
365365
int endian_arch );
366366

367367
void fetchConstraints();

0 commit comments

Comments
 (0)