@@ -1122,7 +1122,7 @@ QgsFeatureIterator QgsSpatiaLiteProvider::getFeatures( const QgsFeatureRequest &
11221122
11231123
11241124int 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 ;
0 commit comments