@@ -410,84 +410,22 @@ bool QgsPostgresFeatureIterator::getFeature( QgsPostgresResult &queryResult, int
410
410
// modify 2.5D WKB types to make them compliant with OGR
411
411
unsigned int wkbType;
412
412
memcpy ( &wkbType, featureGeom + 1 , sizeof ( wkbType ) );
413
-
414
- // convert unsupported types to supported ones
415
- switch ( wkbType )
416
- {
417
- case 15 :
418
- // 2D polyhedral => multipolygon
419
- wkbType = 6 ;
420
- break ;
421
- case 1015 :
422
- // 3D polyhedral => multipolygon
423
- wkbType = 1006 ;
424
- break ;
425
- case 17 :
426
- // 2D triangle => polygon
427
- wkbType = 3 ;
428
- break ;
429
- case 1017 :
430
- // 3D triangle => polygon
431
- wkbType = 1003 ;
432
- break ;
433
- case 16 :
434
- // 2D TIN => multipolygon
435
- wkbType = 6 ;
436
- break ;
437
- case 1016 :
438
- // TIN => multipolygon
439
- wkbType = 1006 ;
440
- break ;
441
- }
442
- // convert from postgis types to qgis types
443
- if ( wkbType >= 1000 )
444
- {
445
- wkbType = wkbType - 1000 + QGis::WKBPoint25D - 1 ;
446
- }
413
+ wkbType = QgsPostgresConn::wkbTypeFromOgcWkbType ( wkbType );
447
414
memcpy ( featureGeom + 1 , &wkbType, sizeof ( wkbType ) );
448
415
449
416
// change wkb type of inner geometries
450
417
if ( wkbType == QGis::WKBMultiPoint25D ||
451
418
wkbType == QGis::WKBMultiLineString25D ||
452
419
wkbType == QGis::WKBMultiPolygon25D )
453
420
{
454
- unsigned int numGeoms = *(( int * )( featureGeom + 5 ) );
455
- unsigned char * wkb = featureGeom + 9 ;
421
+ unsigned int numGeoms;
422
+ memcpy ( &numGeoms, featureGeom + 5 , sizeof ( unsigned int ) );
423
+ unsigned char *wkb = featureGeom + 9 ;
456
424
for ( unsigned int i = 0 ; i < numGeoms; ++i )
457
425
{
458
426
unsigned int localType;
459
427
memcpy ( &localType, wkb + 1 , sizeof ( localType ) );
460
- switch ( localType )
461
- {
462
- case 15 :
463
- // 2D polyhedral => multipolygon
464
- localType = 6 ;
465
- break ;
466
- case 1015 :
467
- // 3D polyhedral => multipolygon
468
- localType = 1006 ;
469
- break ;
470
- case 17 :
471
- // 2D triangle => polygon
472
- localType = 3 ;
473
- break ;
474
- case 1017 :
475
- // 3D triangle => polygon
476
- localType = 1003 ;
477
- break ;
478
- case 16 :
479
- // 2D TIN => multipolygon
480
- localType = 6 ;
481
- break ;
482
- case 1016 :
483
- // TIN => multipolygon
484
- localType = 1006 ;
485
- break ;
486
- }
487
- if ( localType >= 1000 )
488
- {
489
- localType = localType - 1000 + QGis::WKBPoint25D - 1 ;
490
- }
428
+ localType = QgsPostgresConn::wkbTypeFromOgcWkbType ( localType );
491
429
memcpy ( wkb + 1 , &localType, sizeof ( localType ) );
492
430
493
431
// skip endian and type info
@@ -501,21 +439,22 @@ bool QgsPostgresFeatureIterator::getFeature( QgsPostgresResult &queryResult, int
501
439
break ;
502
440
case QGis::WKBMultiLineString25D:
503
441
{
504
- unsigned int nPoints = *(( int * ) wkb ) ;
505
- wkb += sizeof ( nPoints );
506
- wkb += sizeof ( double ) * 3 * nPoints;
442
+ unsigned int nPoints;
443
+ memcpy ( &nPoints, wkb, sizeof ( int ) );
444
+ wkb += sizeof ( int ) + sizeof ( double ) * 3 * nPoints;
507
445
}
508
446
break ;
509
447
default :
510
448
case QGis::WKBMultiPolygon25D:
511
449
{
512
- unsigned int nRings = *(( int * ) wkb );
513
- wkb += sizeof ( nRings );
450
+ unsigned int nRings;
451
+ memcpy ( &nRings, wkb, sizeof ( int ) );
452
+ wkb += sizeof ( int );
514
453
for ( unsigned int j = 0 ; j < nRings; ++j )
515
454
{
516
- unsigned int nPoints = *(( int * ) wkb ) ;
517
- wkb += sizeof ( nPoints );
518
- wkb += sizeof ( double ) * 3 * nPoints;
455
+ unsigned int nPoints;
456
+ memcpy ( &nPoints, wkb, sizeof ( int ) );
457
+ wkb += sizeof ( nPoints ) + sizeof ( double ) * 3 * nPoints;
519
458
}
520
459
}
521
460
break ;
0 commit comments