@@ -280,7 +280,7 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri )
280
280
, mOgrGeometryTypeFilter( wkbUnknown )
281
281
, ogrDriver( nullptr )
282
282
, mValid( false )
283
- , geomType ( wkbUnknown )
283
+ , mOGRGeomType ( wkbUnknown )
284
284
, mFeaturesCounted( -1 )
285
285
, mWriteAccess( false )
286
286
, mShapefileMayBeCorrupted( false )
@@ -497,6 +497,38 @@ QString QgsOgrProvider::ogrWkbGeometryTypeName( OGRwkbGeometryType type ) const
497
497
case wkbGeometryCollection:
498
498
geom = " GeometryCollection" ;
499
499
break ;
500
+ #if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,0,0)
501
+ case wkbCircularString:
502
+ geom = " CircularString" ;
503
+ break ;
504
+ case wkbCompoundCurve:
505
+ geom = " CompoundCurve" ;
506
+ break ;
507
+ case wkbCurvePolygon:
508
+ geom = " CurvePolygon" ;
509
+ break ;
510
+ case wkbMultiCurve:
511
+ geom = " MultiCurve" ;
512
+ break ;
513
+ case wkbMultiSurface:
514
+ geom = " MultiSurface" ;
515
+ break ;
516
+ case wkbCircularStringZ:
517
+ geom = " CircularStringZ" ;
518
+ break ;
519
+ case wkbCompoundCurveZ:
520
+ geom = " CompoundCurveZ" ;
521
+ break ;
522
+ case wkbCurvePolygonZ:
523
+ geom = " CurvePolygonZ" ;
524
+ break ;
525
+ case wkbMultiCurveZ:
526
+ geom = " MultiCurveZ" ;
527
+ break ;
528
+ case wkbMultiSurfaceZ:
529
+ geom = " MultiSurfaceZ" ;
530
+ break ;
531
+ #endif
500
532
case wkbNone:
501
533
geom = " None" ;
502
534
break ;
@@ -525,7 +557,8 @@ QString QgsOgrProvider::ogrWkbGeometryTypeName( OGRwkbGeometryType type ) const
525
557
geom = " GeometryCollection25D" ;
526
558
break ;
527
559
default :
528
- geom = QString ( " Unknown WKB: %1" ).arg ( type );
560
+ // Do not use ':', as it will mess with the separator used by QgsSublayersDialog::populateLayers()
561
+ geom = QString ( " Unknown WKB (%1)" ).arg ( type );
529
562
}
530
563
return geom;
531
564
}
@@ -691,11 +724,11 @@ void QgsOgrProvider::loadFields()
691
724
692
725
if ( mOgrGeometryTypeFilter != wkbUnknown )
693
726
{
694
- geomType = mOgrGeometryTypeFilter ;
727
+ mOGRGeomType = mOgrGeometryTypeFilter ;
695
728
}
696
729
else
697
730
{
698
- geomType = getOgrGeomType ( ogrLayer );
731
+ mOGRGeomType = getOgrGeomType ( ogrLayer );
699
732
}
700
733
OGRFeatureDefnH fdef = OGR_L_GetLayerDefn ( ogrLayer );
701
734
if ( fdef )
@@ -907,7 +940,7 @@ size_t QgsOgrProvider::layerCount() const
907
940
*/
908
941
QGis::WkbType QgsOgrProvider::geometryType () const
909
942
{
910
- return static_cast <QGis::WkbType>( geomType );
943
+ return static_cast <QGis::WkbType>( mOGRGeomType );
911
944
}
912
945
913
946
/* *
@@ -933,6 +966,36 @@ bool QgsOgrProvider::isValid()
933
966
return mValid ;
934
967
}
935
968
969
+ // Drivers may be more tolerant than we really wish (e.g. GeoPackage driver
970
+ // may accept any geometry type)
971
+ OGRGeometryH QgsOgrProvider::ConvertGeometryIfNecessary ( OGRGeometryH hGeom )
972
+ {
973
+ if ( hGeom == nullptr )
974
+ return hGeom;
975
+ OGRwkbGeometryType layerGeomType = OGR_L_GetGeomType ( ogrLayer );
976
+ OGRwkbGeometryType flattenLayerGeomType = wkbFlatten ( layerGeomType );
977
+ OGRwkbGeometryType geomType = OGR_G_GetGeometryType ( hGeom );
978
+ OGRwkbGeometryType flattenGeomType = wkbFlatten ( geomType );
979
+
980
+ if ( flattenLayerGeomType == wkbUnknown || flattenLayerGeomType == flattenGeomType )
981
+ {
982
+ return hGeom;
983
+ }
984
+ if ( flattenLayerGeomType == wkbMultiPolygon && flattenGeomType == wkbPolygon )
985
+ {
986
+ return OGR_G_ForceToMultiPolygon ( hGeom );
987
+ }
988
+ if ( flattenLayerGeomType == wkbMultiLineString && flattenGeomType == wkbLineString )
989
+ {
990
+ return OGR_G_ForceToMultiLineString ( hGeom );
991
+ }
992
+ #if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,0,0)
993
+ return OGR_G_ForceTo ( hGeom, layerGeomType, nullptr );
994
+ #else
995
+ return hGeom;
996
+ #endif
997
+ }
998
+
936
999
bool QgsOgrProvider::addFeature ( QgsFeature& f )
937
1000
{
938
1001
bool returnValue = true ;
@@ -951,6 +1014,9 @@ bool QgsOgrProvider::addFeature( QgsFeature& f )
951
1014
pushError ( tr ( " OGR error creating wkb for feature %1: %2" ).arg ( f.id () ).arg ( CPLGetLastErrorMsg () ) );
952
1015
return false ;
953
1016
}
1017
+
1018
+ geom = ConvertGeometryIfNecessary ( geom );
1019
+
954
1020
OGR_F_SetGeometryDirectly ( feature, geom );
955
1021
}
956
1022
}
@@ -1320,6 +1386,8 @@ bool QgsOgrProvider::changeGeometryValues( const QgsGeometryMap &geometry_map )
1320
1386
continue ;
1321
1387
}
1322
1388
1389
+ theNewGeometry = ConvertGeometryIfNecessary ( theNewGeometry );
1390
+
1323
1391
// set the new geometry
1324
1392
if ( OGR_F_SetGeometryDirectly ( theOGRFeature, theNewGeometry ) != OGRERR_NONE )
1325
1393
{
@@ -2677,7 +2745,7 @@ void QgsOgrProvider::recalculateFeatureCount()
2677
2745
bool QgsOgrProvider::doesStrictFeatureTypeCheck () const
2678
2746
{
2679
2747
// FIXME probably other drivers too...
2680
- return ogrDriverName != " ESRI Shapefile" || ( geomType == wkbPoint || geomType == wkbPoint25D );
2748
+ return ogrDriverName != " ESRI Shapefile" || ( mOGRGeomType == wkbPoint || mOGRGeomType == wkbPoint25D );
2681
2749
}
2682
2750
2683
2751
OGRwkbGeometryType QgsOgrProvider::ogrWkbSingleFlatten ( OGRwkbGeometryType type )
0 commit comments