@@ -280,7 +280,7 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri )
280280 , mOgrGeometryTypeFilter( wkbUnknown )
281281 , ogrDriver( nullptr )
282282 , mValid( false )
283- , geomType ( wkbUnknown )
283+ , mOGRGeomType ( wkbUnknown )
284284 , mFeaturesCounted( -1 )
285285 , mWriteAccess( false )
286286 , mShapefileMayBeCorrupted( false )
@@ -497,6 +497,38 @@ QString QgsOgrProvider::ogrWkbGeometryTypeName( OGRwkbGeometryType type ) const
497497 case wkbGeometryCollection:
498498 geom = " GeometryCollection" ;
499499 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
500532 case wkbNone:
501533 geom = " None" ;
502534 break ;
@@ -525,7 +557,8 @@ QString QgsOgrProvider::ogrWkbGeometryTypeName( OGRwkbGeometryType type ) const
525557 geom = " GeometryCollection25D" ;
526558 break ;
527559 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 );
529562 }
530563 return geom;
531564}
@@ -691,11 +724,11 @@ void QgsOgrProvider::loadFields()
691724
692725 if ( mOgrGeometryTypeFilter != wkbUnknown )
693726 {
694- geomType = mOgrGeometryTypeFilter ;
727+ mOGRGeomType = mOgrGeometryTypeFilter ;
695728 }
696729 else
697730 {
698- geomType = getOgrGeomType ( ogrLayer );
731+ mOGRGeomType = getOgrGeomType ( ogrLayer );
699732 }
700733 OGRFeatureDefnH fdef = OGR_L_GetLayerDefn ( ogrLayer );
701734 if ( fdef )
@@ -907,7 +940,7 @@ size_t QgsOgrProvider::layerCount() const
907940 */
908941QGis::WkbType QgsOgrProvider::geometryType () const
909942{
910- return static_cast <QGis::WkbType>( geomType );
943+ return static_cast <QGis::WkbType>( mOGRGeomType );
911944}
912945
913946/* *
@@ -933,6 +966,36 @@ bool QgsOgrProvider::isValid()
933966 return mValid ;
934967}
935968
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+
936999bool QgsOgrProvider::addFeature ( QgsFeature& f )
9371000{
9381001 bool returnValue = true ;
@@ -951,6 +1014,9 @@ bool QgsOgrProvider::addFeature( QgsFeature& f )
9511014 pushError ( tr ( " OGR error creating wkb for feature %1: %2" ).arg ( f.id () ).arg ( CPLGetLastErrorMsg () ) );
9521015 return false ;
9531016 }
1017+
1018+ geom = ConvertGeometryIfNecessary ( geom );
1019+
9541020 OGR_F_SetGeometryDirectly ( feature, geom );
9551021 }
9561022 }
@@ -1320,6 +1386,8 @@ bool QgsOgrProvider::changeGeometryValues( const QgsGeometryMap &geometry_map )
13201386 continue ;
13211387 }
13221388
1389+ theNewGeometry = ConvertGeometryIfNecessary ( theNewGeometry );
1390+
13231391 // set the new geometry
13241392 if ( OGR_F_SetGeometryDirectly ( theOGRFeature, theNewGeometry ) != OGRERR_NONE )
13251393 {
@@ -2677,7 +2745,7 @@ void QgsOgrProvider::recalculateFeatureCount()
26772745bool QgsOgrProvider::doesStrictFeatureTypeCheck () const
26782746{
26792747 // FIXME probably other drivers too...
2680- return ogrDriverName != " ESRI Shapefile" || ( geomType == wkbPoint || geomType == wkbPoint25D );
2748+ return ogrDriverName != " ESRI Shapefile" || ( mOGRGeomType == wkbPoint || mOGRGeomType == wkbPoint25D );
26812749}
26822750
26832751OGRwkbGeometryType QgsOgrProvider::ogrWkbSingleFlatten ( OGRwkbGeometryType type )
0 commit comments