diff --git a/src/gui/qgsnewgeopackagelayerdialog.cpp b/src/gui/qgsnewgeopackagelayerdialog.cpp index b17a5e2b8eb..b8ed4497f78 100644 --- a/src/gui/qgsnewgeopackagelayerdialog.cpp +++ b/src/gui/qgsnewgeopackagelayerdialog.cpp @@ -68,18 +68,18 @@ QgsNewGeoPackageLayerDialog::QgsNewGeoPackageLayerDialog( QWidget *parent, Qt::W mGeometryTypeBox->addItem( tr( "Point" ), wkbPoint ); mGeometryTypeBox->addItem( tr( "Line" ), wkbLineString ); mGeometryTypeBox->addItem( tr( "Polygon" ), wkbPolygon ); - mGeometryTypeBox->addItem( tr( "Multi point" ), wkbMultiPoint ); - mGeometryTypeBox->addItem( tr( "Multi line" ), wkbMultiLineString ); - mGeometryTypeBox->addItem( tr( "Multi polygon" ), wkbMultiPolygon ); + mGeometryTypeBox->addItem( tr( "MultiPoint" ), wkbMultiPoint ); + mGeometryTypeBox->addItem( tr( "MultiLine" ), wkbMultiLineString ); + mGeometryTypeBox->addItem( tr( "MultiPolygon" ), wkbMultiPolygon ); #if 0 // QGIS always create CompoundCurve and there's no real interest of having just CircularString. CompoundCurve are more useful - mGeometryTypeBox->addItem( tr( "Circular string" ), wkbCircularString ); + mGeometryTypeBox->addItem( tr( "CircularString" ), wkbCircularString ); #endif - mGeometryTypeBox->addItem( tr( "Compound curve" ), wkbCompoundCurve ); - mGeometryTypeBox->addItem( tr( "Curve polygon" ), wkbCurvePolygon ); - mGeometryTypeBox->addItem( tr( "Multi curve" ), wkbMultiCurve ); - mGeometryTypeBox->addItem( tr( "Multi surface" ), wkbMultiSurface ); + mGeometryTypeBox->addItem( tr( "CompoundCurve" ), wkbCompoundCurve ); + mGeometryTypeBox->addItem( tr( "CurvePolygon" ), wkbCurvePolygon ); + mGeometryTypeBox->addItem( tr( "MultiCurve" ), wkbMultiCurve ); + mGeometryTypeBox->addItem( tr( "MultiSurface" ), wkbMultiSurface ); mGeometryWithZCheckBox->setEnabled( false ); mGeometryWithMCheckBox->setEnabled( false ); diff --git a/src/gui/qgsnewmemorylayerdialog.cpp b/src/gui/qgsnewmemorylayerdialog.cpp index ba7acfec68a..258f5662ed9 100644 --- a/src/gui/qgsnewmemorylayerdialog.cpp +++ b/src/gui/qgsnewmemorylayerdialog.cpp @@ -58,9 +58,9 @@ QgsNewMemoryLayerDialog::QgsNewMemoryLayerDialog( QWidget *parent, Qt::WindowFla mGeometryTypeBox->addItem( tr( "Point" ), QgsWkbTypes::Point ); mGeometryTypeBox->addItem( tr( "Line" ), QgsWkbTypes::LineString ); mGeometryTypeBox->addItem( tr( "Polygon" ), QgsWkbTypes::Polygon ); - mGeometryTypeBox->addItem( tr( "Multi point" ), QgsWkbTypes::MultiPoint ); - mGeometryTypeBox->addItem( tr( "Multi line" ), QgsWkbTypes::MultiLineString ); - mGeometryTypeBox->addItem( tr( "Multi polygon" ), QgsWkbTypes::MultiPolygon ); + mGeometryTypeBox->addItem( tr( "MultiPoint" ), QgsWkbTypes::MultiPoint ); + mGeometryTypeBox->addItem( tr( "MultiLine" ), QgsWkbTypes::MultiLineString ); + mGeometryTypeBox->addItem( tr( "MultiPolygon" ), QgsWkbTypes::MultiPolygon ); mGeometryWithZCheckBox->setEnabled( false ); mGeometryWithMCheckBox->setEnabled( false ); @@ -69,6 +69,7 @@ QgsNewMemoryLayerDialog::QgsNewMemoryLayerDialog( QWidget *parent, Qt::WindowFla connect( mGeometryTypeBox, static_cast( &QComboBox::currentIndexChanged ), this, &QgsNewMemoryLayerDialog::geometryTypeChanged ); connect( mButtonBox, &QDialogButtonBox::helpRequested, this, &QgsNewMemoryLayerDialog::showHelp ); + geometryTypeChanged( mGeometryTypeBox->currentIndex() ); } QgsNewMemoryLayerDialog::~QgsNewMemoryLayerDialog() diff --git a/src/gui/qgsnewvectorlayerdialog.cpp b/src/gui/qgsnewvectorlayerdialog.cpp index 3e8c2c22993..97eeef98c93 100644 --- a/src/gui/qgsnewvectorlayerdialog.cpp +++ b/src/gui/qgsnewvectorlayerdialog.cpp @@ -167,8 +167,11 @@ QgsWkbTypes::Type QgsNewVectorLayerDialog::selectedType() const wkbType = static_cast ( mGeometryTypeBox->currentData( Qt::UserRole ).toInt() ); - if ( mGeometryWithZCheckBox->isChecked() && wkbType != QgsWkbTypes::Unknown ) - wkbType = QgsWkbTypes::to25D( wkbType ); + if ( mGeometryWithZCheckBox->isChecked() ) + wkbType = QgsWkbTypes::addZ( wkbType ); + + if ( mGeometryWithMCheckBox->isChecked() ) + wkbType = QgsWkbTypes::addM( wkbType ); return wkbType; } diff --git a/src/providers/ogr/qgsogrdataitems.cpp b/src/providers/ogr/qgsogrdataitems.cpp index ad04e0ab42f..b16ac8155bb 100644 --- a/src/providers/ogr/qgsogrdataitems.cpp +++ b/src/providers/ogr/qgsogrdataitems.cpp @@ -361,34 +361,23 @@ static QgsOgrLayerItem *dataItemForLayer( QgsDataItem *parentItem, QString name, QgsLayerItem::LayerType layerType = QgsLayerItem::Vector; OGRwkbGeometryType ogrType = QgsOgrProvider::getOgrGeomType( hLayer ); - switch ( ogrType ) + QgsWkbTypes::Type wkbType = QgsOgrProviderUtils::qgisTypeFromOgrType( ogrType ); + switch ( QgsWkbTypes::geometryType( wkbType ) ) { - case wkbUnknown: - case wkbGeometryCollection: + case QgsWkbTypes::UnknownGeometry: break; - case wkbNone: + case QgsWkbTypes::NullGeometry: layerType = QgsLayerItem::TableLayer; break; - case wkbPoint: - case wkbMultiPoint: - case wkbPoint25D: - case wkbMultiPoint25D: + case QgsWkbTypes::PointGeometry: layerType = QgsLayerItem::Point; break; - case wkbLineString: - case wkbMultiLineString: - case wkbLineString25D: - case wkbMultiLineString25D: + case QgsWkbTypes::LineGeometry: layerType = QgsLayerItem::Line; break; - case wkbPolygon: - case wkbMultiPolygon: - case wkbPolygon25D: - case wkbMultiPolygon25D: + case QgsWkbTypes::PolygonGeometry: layerType = QgsLayerItem::Polygon; break; - default: - break; } QgsDebugMsgLevel( QString( "ogrType = %1 layertype = %2" ).arg( ogrType ).arg( layerType ), 2 ); diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index 8bc8fc3af90..43d710b8533 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -2993,47 +2993,18 @@ QGISEXTERN bool createEmptyDataSource( const QString &uri, OGRwkbGeometryType OGRvectortype = wkbUnknown; switch ( vectortype ) { - case QgsWkbTypes::Point: - OGRvectortype = wkbPoint; - break; - case QgsWkbTypes::Point25D: - OGRvectortype = wkbPoint25D; - break; - case QgsWkbTypes::LineString: - OGRvectortype = wkbLineString; - break; - case QgsWkbTypes::LineString25D: - OGRvectortype = wkbLineString25D; - break; - case QgsWkbTypes::Polygon: - OGRvectortype = wkbPolygon; - break; - case QgsWkbTypes::Polygon25D: - OGRvectortype = wkbPolygon25D; - break; - case QgsWkbTypes::MultiPoint: - OGRvectortype = wkbMultiPoint; - break; - case QgsWkbTypes::MultiPoint25D: - OGRvectortype = wkbMultiPoint25D; - break; - case QgsWkbTypes::MultiLineString: - OGRvectortype = wkbMultiLineString; - break; - case QgsWkbTypes::MultiLineString25D: - OGRvectortype = wkbMultiLineString25D; - break; - case QgsWkbTypes::MultiPolygon: - OGRvectortype = wkbMultiPolygon; - break; - case QgsWkbTypes::MultiPolygon25D: - OGRvectortype = wkbMultiPolygon25D; - break; - default: + case QgsWkbTypes::GeometryCollection: + case QgsWkbTypes::GeometryCollectionZ: + case QgsWkbTypes::GeometryCollectionM: + case QgsWkbTypes::GeometryCollectionZM: + case QgsWkbTypes::Unknown: { QgsMessageLog::logMessage( QObject::tr( "Unknown vector type of %1" ).arg( ( int )( vectortype ) ), QObject::tr( "OGR" ) ); return false; } + + default: + OGRvectortype = QgsOgrProviderUtils::ogrTypeFromQgisType( vectortype ); } char **papszOptions = nullptr; @@ -4390,6 +4361,285 @@ void QgsOgrProviderUtils::invalidateCachedLastModifiedDate( const QString &dsNam } } +OGRwkbGeometryType QgsOgrProviderUtils::ogrTypeFromQgisType( QgsWkbTypes::Type type ) +{ + switch ( type ) + { + case QgsWkbTypes::Point: + return wkbPoint; + case QgsWkbTypes::Point25D: + case QgsWkbTypes::PointZ: + return wkbPoint25D; + case QgsWkbTypes::PointM: + return wkbPointM; + case QgsWkbTypes::PointZM: + return wkbPointZM; + + case QgsWkbTypes::LineString: + return wkbLineString; + case QgsWkbTypes::LineString25D: + case QgsWkbTypes::LineStringZ: + return wkbLineString25D; + case QgsWkbTypes::LineStringM: + return wkbLineStringM; + case QgsWkbTypes::LineStringZM: + return wkbLineStringZM; + + case QgsWkbTypes::Polygon: + return wkbPolygon; + case QgsWkbTypes::Polygon25D: + case QgsWkbTypes::PolygonZ: + return wkbPolygon25D; + case QgsWkbTypes::PolygonM: + return wkbPolygonM; + case QgsWkbTypes::PolygonZM: + return wkbPolygonZM; + + case QgsWkbTypes::MultiPoint: + return wkbMultiPoint; + case QgsWkbTypes::MultiPoint25D: + case QgsWkbTypes::MultiPointZ: + return wkbMultiPoint25D; + case QgsWkbTypes::MultiPointM: + return wkbMultiPointM; + case QgsWkbTypes::MultiPointZM: + return wkbMultiPointZM; + + case QgsWkbTypes::MultiLineString: + return wkbMultiLineString; + case QgsWkbTypes::MultiLineString25D: + case QgsWkbTypes::MultiLineStringZ: + return wkbMultiLineString25D; + case QgsWkbTypes::MultiLineStringM: + return wkbMultiLineStringM; + case QgsWkbTypes::MultiLineStringZM: + return wkbMultiLineStringZM; + + case QgsWkbTypes::MultiPolygon: + return wkbMultiPolygon; + case QgsWkbTypes::MultiPolygon25D: + case QgsWkbTypes::MultiPolygonZ: + return wkbMultiPolygon25D; + case QgsWkbTypes::MultiPolygonM: + return wkbMultiPolygonM; + case QgsWkbTypes::MultiPolygonZM: + return wkbMultiPolygonZM; + + case QgsWkbTypes::CircularString: + return wkbCircularString; + case QgsWkbTypes::CircularStringZ: + return wkbCircularStringZ; + case QgsWkbTypes::CircularStringM: + return wkbCircularStringM; + case QgsWkbTypes::CircularStringZM: + return wkbCircularStringZM; + + case QgsWkbTypes::CompoundCurve: + return wkbCompoundCurve; + case QgsWkbTypes::CompoundCurveZ: + return wkbCompoundCurveZ; + case QgsWkbTypes::CompoundCurveM: + return wkbCompoundCurveM; + case QgsWkbTypes::CompoundCurveZM: + return wkbCompoundCurveZM; + + case QgsWkbTypes::CurvePolygon: + return wkbCurvePolygon; + case QgsWkbTypes::CurvePolygonZ: + return wkbCurvePolygonZ; + case QgsWkbTypes::CurvePolygonM: + return wkbCurvePolygonM; + case QgsWkbTypes::CurvePolygonZM: + return wkbCurvePolygonZM; + + case QgsWkbTypes::MultiCurve: + return wkbMultiCurve; + case QgsWkbTypes::MultiCurveZ: + return wkbMultiCurveZ; + case QgsWkbTypes::MultiCurveM: + return wkbMultiCurveM; + case QgsWkbTypes::MultiCurveZM: + return wkbMultiCurveZM; + + case QgsWkbTypes::MultiSurface: + return wkbMultiSurface; + case QgsWkbTypes::MultiSurfaceZ: + return wkbMultiSurfaceZ; + case QgsWkbTypes::MultiSurfaceM: + return wkbMultiSurfaceM; + case QgsWkbTypes::MultiSurfaceZM: + return wkbMultiSurfaceZM; + + case QgsWkbTypes::Triangle: + return wkbTriangle; + case QgsWkbTypes::TriangleZ: + return wkbTriangleZ; + case QgsWkbTypes::TriangleM: + return wkbTriangleM; + case QgsWkbTypes::TriangleZM: + return wkbTriangleZM; + + case QgsWkbTypes::NoGeometry: + return wkbNone; + + case QgsWkbTypes::GeometryCollection: + return wkbGeometryCollection; + case QgsWkbTypes::GeometryCollectionZ: + return wkbGeometryCollection25D; + case QgsWkbTypes::GeometryCollectionM: + return wkbGeometryCollectionM; + case QgsWkbTypes::GeometryCollectionZM: + return wkbGeometryCollectionZM; + + case QgsWkbTypes::Unknown: + return wkbUnknown; + } + // no warnings! + return wkbUnknown; +} + +QgsWkbTypes::Type QgsOgrProviderUtils::qgisTypeFromOgrType( OGRwkbGeometryType type ) +{ + switch ( type ) + { + case wkbUnknown: + return QgsWkbTypes::Unknown; + + case wkbPoint: + return QgsWkbTypes::Point; + case wkbLineString: + return QgsWkbTypes::LineString; + case wkbPolygon: + return QgsWkbTypes::Polygon; + case wkbMultiPoint: + return QgsWkbTypes::MultiPoint; + case wkbMultiLineString: + return QgsWkbTypes::MultiLineString; + case wkbMultiPolygon: + return QgsWkbTypes::MultiPolygon; + case wkbGeometryCollection: + return QgsWkbTypes::GeometryCollection; + case wkbCircularString: + return QgsWkbTypes::CircularString; + case wkbCompoundCurve: + return QgsWkbTypes::CompoundCurve; + case wkbCurvePolygon: + return QgsWkbTypes::CurvePolygon; + case wkbMultiCurve: + return QgsWkbTypes::MultiCurve; + case wkbMultiSurface: + return QgsWkbTypes::MultiSurface; + case wkbTriangle: + return QgsWkbTypes::Triangle; + case wkbNone: + return QgsWkbTypes::NoGeometry; + + case wkbCircularStringZ: + return QgsWkbTypes::CircularStringZ; + case wkbCompoundCurveZ: + return QgsWkbTypes::CompoundCurveZ; + case wkbCurvePolygonZ: + return QgsWkbTypes::PolygonZ; + case wkbMultiCurveZ: + return QgsWkbTypes::MultiCurveZ; + case wkbMultiSurfaceZ: + return QgsWkbTypes::MultiSurfaceZ; + case wkbTriangleZ: + return QgsWkbTypes::TriangleZ; + + case wkbPointM: + return QgsWkbTypes::PointM; + case wkbLineStringM: + return QgsWkbTypes::LineStringM; + case wkbPolygonM: + return QgsWkbTypes::PolygonM; + case wkbMultiPointM: + return QgsWkbTypes::PointM; + case wkbMultiLineStringM: + return QgsWkbTypes::LineStringM; + case wkbMultiPolygonM: + return QgsWkbTypes::PolygonM; + case wkbGeometryCollectionM: + return QgsWkbTypes::GeometryCollectionM; + case wkbCircularStringM: + return QgsWkbTypes::CircularStringM; + case wkbCompoundCurveM: + return QgsWkbTypes::CompoundCurveM; + case wkbCurvePolygonM: + return QgsWkbTypes::PolygonM; + case wkbMultiCurveM: + return QgsWkbTypes::MultiCurveM; + case wkbMultiSurfaceM: + return QgsWkbTypes::MultiSurfaceM; + case wkbTriangleM: + return QgsWkbTypes::TriangleM; + + case wkbPointZM: + return QgsWkbTypes::PointZM; + case wkbLineStringZM: + return QgsWkbTypes::LineStringZM; + case wkbPolygonZM: + return QgsWkbTypes::PolygonZM; + case wkbMultiPointZM: + return QgsWkbTypes::MultiPointZM; + case wkbMultiLineStringZM: + return QgsWkbTypes::MultiLineStringZM; + case wkbMultiPolygonZM: + return QgsWkbTypes::MultiPolygonZM; + case wkbGeometryCollectionZM: + return QgsWkbTypes::GeometryCollectionZM; + case wkbCircularStringZM: + return QgsWkbTypes::CircularStringZM; + case wkbCompoundCurveZM: + return QgsWkbTypes::CompoundCurveZM; + case wkbCurvePolygonZM: + return QgsWkbTypes::CurvePolygonZM; + case wkbMultiCurveZM: + return QgsWkbTypes::MultiCurveZM; + case wkbMultiSurfaceZM: + return QgsWkbTypes::MultiSurfaceZM; + case wkbTriangleZM: + return QgsWkbTypes::TriangleZM; + + case wkbPoint25D: + return QgsWkbTypes::Point25D; + case wkbLineString25D: + return QgsWkbTypes::LineString25D; + case wkbPolygon25D: + return QgsWkbTypes::Polygon25D; + case wkbMultiPoint25D: + return QgsWkbTypes::MultiPoint25D; + case wkbMultiLineString25D: + return QgsWkbTypes::MultiLineString25D; + case wkbMultiPolygon25D: + return QgsWkbTypes::MultiPolygon25D; + case wkbGeometryCollection25D: + return QgsWkbTypes::GeometryCollectionZ; + + case wkbCurve: + case wkbSurface: + case wkbCurveZ: + case wkbSurfaceZ: + case wkbCurveM: + case wkbSurfaceM: + case wkbCurveZM: + case wkbSurfaceZM: + return QgsWkbTypes::Unknown; // abstract types - no direct mapping to QGIS types + + case wkbLinearRing: + case wkbTIN: + case wkbTINZ: + case wkbTINM: + case wkbTINZM: + case wkbPolyhedralSurface: + case wkbPolyhedralSurfaceZ: + case wkbPolyhedralSurfaceM: + case wkbPolyhedralSurfaceZM: + return QgsWkbTypes::Unknown; // unsupported types + } + return QgsWkbTypes::Unknown; +} + QString QgsOgrProviderUtils::expandAuthConfig( const QString &dsName ) { diff --git a/src/providers/ogr/qgsogrprovider.h b/src/providers/ogr/qgsogrprovider.h index 481592b0bac..e6a113c4049 100644 --- a/src/providers/ogr/qgsogrprovider.h +++ b/src/providers/ogr/qgsogrprovider.h @@ -421,6 +421,13 @@ class QgsOgrProviderUtils //! Invalidate the cached last modified date of a dataset static void invalidateCachedLastModifiedDate( const QString &dsName ); + + //! Converts a QGIS WKB type to the corresponding OGR wkb type + static OGRwkbGeometryType ogrTypeFromQgisType( QgsWkbTypes::Type type ); + + //! Converts a OGR WKB type to the corresponding QGIS wkb type + static QgsWkbTypes::Type qgisTypeFromOgrType( OGRwkbGeometryType type ); + }; diff --git a/src/ui/qgsnewgeopackagelayerdialogbase.ui b/src/ui/qgsnewgeopackagelayerdialogbase.ui index 0acbae0dbc7..1979cbdb2c9 100644 --- a/src/ui/qgsnewgeopackagelayerdialogbase.ui +++ b/src/ui/qgsnewgeopackagelayerdialogbase.ui @@ -69,7 +69,7 @@ - + New field @@ -240,9 +240,16 @@ + + + + Qt::StrongFocus + + + - + Fields list @@ -321,16 +328,9 @@ - - - - Qt::StrongFocus - - - - - - + + + Advanced options diff --git a/src/ui/qgsnewmemorylayerdialogbase.ui b/src/ui/qgsnewmemorylayerdialogbase.ui index 0252c86e178..9a4eea89fd0 100644 --- a/src/ui/qgsnewmemorylayerdialogbase.ui +++ b/src/ui/qgsnewmemorylayerdialogbase.ui @@ -7,7 +7,7 @@ 0 0 444 - 233 + 246 @@ -59,14 +59,8 @@ - + - - - 0 - 0 - - Qt::StrongFocus diff --git a/src/ui/qgsnewvectorlayerdialogbase.ui b/src/ui/qgsnewvectorlayerdialogbase.ui index f5a98c050cc..b49d3084906 100644 --- a/src/ui/qgsnewvectorlayerdialogbase.ui +++ b/src/ui/qgsnewvectorlayerdialogbase.ui @@ -6,8 +6,8 @@ 0 0 - 471 - 604 + 867 + 993 @@ -17,13 +17,6 @@ true - - - - Qt::StrongFocus - - - @@ -110,7 +103,7 @@ Add to fields list - + :/images/themes/default/mActionNewAttribute.svg:/images/themes/default/mActionNewAttribute.svg @@ -207,7 +200,7 @@ Remove field - + :/images/themes/default/mActionDeleteAttribute.svg:/images/themes/default/mActionDeleteAttribute.svg @@ -278,24 +271,48 @@ - - + + + + Include Z dimension + + - + + + + + 0 + 20 + + + + Qt::StrongFocus + + + + + + + Include M values + + + + true - + true - + @@ -305,12 +322,8 @@ - - - - Include Z dimension - - + + @@ -332,11 +345,11 @@ - mFileName mFileEncoding mFileFormatComboBox mGeometryTypeBox mGeometryWithZCheckBox + mGeometryWithMCheckBox mCrsSelector mNameEdit mTypeBox @@ -346,7 +359,35 @@ mAttributeView mRemoveAttributeButton - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + buttonBox