diff --git a/src/core/qgsvectorlayerexporter.cpp b/src/core/qgsvectorlayerexporter.cpp index 604b794deb0..6d9fb87be56 100644 --- a/src/core/qgsvectorlayerexporter.cpp +++ b/src/core/qgsvectorlayerexporter.cpp @@ -267,6 +267,7 @@ QgsVectorLayerExporter::exportLayer( QgsVectorLayer *layer, } QgsFields fields = layer->fields(); + QgsWkbTypes::Type wkbType = layer->wkbType(); // Special handling for Shapefiles @@ -286,9 +287,6 @@ QgsVectorLayerExporter::exportLayer( QgsVectorLayer *layer, // convert wkbtype to multipart (see #5547) switch ( wkbType ) { - case QgsWkbTypes::Point: - wkbType = QgsWkbTypes::MultiPoint; - break; case QgsWkbTypes::LineString: wkbType = QgsWkbTypes::MultiLineString; break; diff --git a/src/gui/providers/ogr/qgsgeopackageitemguiprovider.cpp b/src/gui/providers/ogr/qgsgeopackageitemguiprovider.cpp index d828298baa4..a61a63d0df2 100644 --- a/src/gui/providers/ogr/qgsgeopackageitemguiprovider.cpp +++ b/src/gui/providers/ogr/qgsgeopackageitemguiprovider.cpp @@ -496,7 +496,6 @@ bool QgsGeoPackageItemGuiProvider::handleDropGeopackage( QgsGeoPackageCollection options.insert( QStringLiteral( "update" ), true ); options.insert( QStringLiteral( "overwrite" ), true ); options.insert( QStringLiteral( "layerName" ), dropUri.name ); - options.insert( QStringLiteral( "forceSinglePartGeometryType" ), true ); QgsVectorLayerExporterTask *exportTask = new QgsVectorLayerExporterTask( vectorSrcLayer, uri, QStringLiteral( "ogr" ), vectorSrcLayer->crs(), options, owner ); mainTask->addSubTask( exportTask, importTasks ); importTasks << exportTask; diff --git a/src/providers/postgres/qgspostgresdataitems.cpp b/src/providers/postgres/qgspostgresdataitems.cpp index ae691a8428c..d2323bd8bd3 100644 --- a/src/providers/postgres/qgspostgresdataitems.cpp +++ b/src/providers/postgres/qgspostgresdataitems.cpp @@ -272,9 +272,7 @@ bool QgsPGConnectionItem::handleDrop( const QMimeData *data, const QString &toSc uri.setSchema( toSchema ); } - QVariantMap options; - options.insert( QStringLiteral( "forceSinglePartGeometryType" ), true ); - std::unique_ptr< QgsVectorLayerExporterTask > exportTask( new QgsVectorLayerExporterTask( srcLayer, uri.uri( false ), QStringLiteral( "postgres" ), srcLayer->crs(), options, owner ) ); + std::unique_ptr< QgsVectorLayerExporterTask > exportTask( new QgsVectorLayerExporterTask( srcLayer, uri.uri( false ), QStringLiteral( "postgres" ), srcLayer->crs(), QVariantMap(), owner ) ); // when export is successful: connect( exportTask.get(), &QgsVectorLayerExporterTask::exportComplete, this, [ = ]() diff --git a/tests/src/python/test_provider_ogr_gpkg.py b/tests/src/python/test_provider_ogr_gpkg.py index f236a2a2b3f..17704273e7b 100644 --- a/tests/src/python/test_provider_ogr_gpkg.py +++ b/tests/src/python/test_provider_ogr_gpkg.py @@ -1361,6 +1361,73 @@ class TestPyQgsOGRProviderGpkg(unittest.TestCase): fids = set([f['fid'] for f in vl.getFeatures()]) self.assertEqual(len(fids), 1) + def testExportMultiFromShp(self): + """Test if a Point is imported as single geom and MultiPoint as multi""" + + single_tmpfile = os.path.join(self.basetestpath, 'testExportMultiFromShp_point.shp') + ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(single_tmpfile) + lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint) + lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) + f = ogr.Feature(lyr.GetLayerDefn()) + f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) + f.SetField('str_field', 'one') + lyr.CreateFeature(f) + f = ogr.Feature(lyr.GetLayerDefn()) + f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetField('str_field', 'two') + lyr.CreateFeature(f) + f = None + ds = None + + multi_tmpfile = os.path.join(self.basetestpath, 'testExportMultiFromShp_multipoint.shp') + ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(multi_tmpfile) + lyr = ds.CreateLayer('test', geom_type=ogr.wkbMultiPoint) + lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) + f = ogr.Feature(lyr.GetLayerDefn()) + f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT ((0 0))')) + f.SetField('str_field', 'one') + lyr.CreateFeature(f) + f = ogr.Feature(lyr.GetLayerDefn()) + f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT ((1 1), (2 2))')) + f.SetField('str_field', 'two') + lyr.CreateFeature(f) + f = None + ds = None + + tmpfile = os.path.join(self.basetestpath, 'testExportMultiFromShpMulti.gpkg') + options = {} + options['driverName'] = 'GPKG' + lyr = QgsVectorLayer(multi_tmpfile, 'y', 'ogr') + self.assertTrue(lyr.isValid()) + self.assertEqual(lyr.featureCount(), 2) + err, _ = QgsVectorLayerExporter.exportLayer(lyr, tmpfile, "ogr", lyr.crs(), False, options) + self.assertEqual(err, 0) + lyr = QgsVectorLayer(tmpfile, "y", "ogr") + self.assertTrue(lyr.isValid()) + self.assertEqual(lyr.wkbType(), QgsWkbTypes.MultiPoint) + features = lyr.getFeatures() + f = next(features) + self.assertEqual(f.geometry().asWkt().upper(), 'MULTIPOINT ((0 0))') + f = next(features) + self.assertEqual(f.geometry().asWkt().upper(), 'MULTIPOINT ((1 1),(2 2))') + + tmpfile = os.path.join(self.basetestpath, 'testExportMultiFromShpSingle.gpkg') + options = {} + options['driverName'] = 'GPKG' + lyr = QgsVectorLayer(single_tmpfile, 'y', 'ogr') + self.assertTrue(lyr.isValid()) + self.assertEqual(lyr.featureCount(), 2) + err, _ = QgsVectorLayerExporter.exportLayer(lyr, tmpfile, "ogr", lyr.crs(), False, options) + self.assertEqual(err, 0) + lyr = QgsVectorLayer(tmpfile, "y", "ogr") + self.assertTrue(lyr.isValid()) + self.assertEqual(lyr.wkbType(), QgsWkbTypes.Point) + features = lyr.getFeatures() + f = next(features) + self.assertEqual(f.geometry().asWkt().upper(), 'POINT (0 0)') + f = next(features) + self.assertEqual(f.geometry().asWkt().upper(), 'POINT (1 1)') + if __name__ == '__main__': unittest.main()