diff --git a/python/core/auto_additions/qgspointcloudlayerexporter.py b/python/core/auto_additions/qgspointcloudlayerexporter.py index 0f8225f55b6..29915a48727 100644 --- a/python/core/auto_additions/qgspointcloudlayerexporter.py +++ b/python/core/auto_additions/qgspointcloudlayerexporter.py @@ -5,5 +5,6 @@ QgsPointCloudLayerExporter.ExportFormat.Las.__doc__ = "LAS/LAZ point cloud" QgsPointCloudLayerExporter.ExportFormat.Gpkg.__doc__ = "Geopackage" QgsPointCloudLayerExporter.ExportFormat.Shp.__doc__ = "ESRI ShapeFile" QgsPointCloudLayerExporter.ExportFormat.Dxf.__doc__ = "AutoCAD dxf" -QgsPointCloudLayerExporter.ExportFormat.__doc__ = 'Supported export formats for point clouds\n\n' + '* ``Memory``: ' + QgsPointCloudLayerExporter.ExportFormat.Memory.__doc__ + '\n' + '* ``Las``: ' + QgsPointCloudLayerExporter.ExportFormat.Las.__doc__ + '\n' + '* ``Gpkg``: ' + QgsPointCloudLayerExporter.ExportFormat.Gpkg.__doc__ + '\n' + '* ``Shp``: ' + QgsPointCloudLayerExporter.ExportFormat.Shp.__doc__ + '\n' + '* ``Dxf``: ' + QgsPointCloudLayerExporter.ExportFormat.Dxf.__doc__ +QgsPointCloudLayerExporter.ExportFormat.Csv.__doc__ = "Comma separated values" +QgsPointCloudLayerExporter.ExportFormat.__doc__ = 'Supported export formats for point clouds\n\n' + '* ``Memory``: ' + QgsPointCloudLayerExporter.ExportFormat.Memory.__doc__ + '\n' + '* ``Las``: ' + QgsPointCloudLayerExporter.ExportFormat.Las.__doc__ + '\n' + '* ``Gpkg``: ' + QgsPointCloudLayerExporter.ExportFormat.Gpkg.__doc__ + '\n' + '* ``Shp``: ' + QgsPointCloudLayerExporter.ExportFormat.Shp.__doc__ + '\n' + '* ``Dxf``: ' + QgsPointCloudLayerExporter.ExportFormat.Dxf.__doc__ + '\n' + '* ``Csv``: ' + QgsPointCloudLayerExporter.ExportFormat.Csv.__doc__ # -- diff --git a/python/core/auto_generated/pointcloud/qgspointcloudlayerexporter.sip.in b/python/core/auto_generated/pointcloud/qgspointcloudlayerexporter.sip.in index f5c9fc6ac0b..74ccf39b9f4 100644 --- a/python/core/auto_generated/pointcloud/qgspointcloudlayerexporter.sip.in +++ b/python/core/auto_generated/pointcloud/qgspointcloudlayerexporter.sip.in @@ -32,6 +32,7 @@ Handles exporting point cloud layers to memory layers, OGR supported files and P Gpkg, Shp, Dxf, + Csv, }; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 7073ce43907..534a6b229ce 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -8387,6 +8387,7 @@ QString QgisApp::saveAsPointCloudLayer( QgsPointCloudLayer *pclayer ) case QgsPointCloudLayerExporter::ExportFormat::Gpkg: case QgsPointCloudLayerExporter::ExportFormat::Shp: case QgsPointCloudLayerExporter::ExportFormat::Dxf: + case QgsPointCloudLayerExporter::ExportFormat::Csv: if ( dialog.hasAttributes() ) exp->setAttributes( dialog.attributes() ); else diff --git a/src/core/pointcloud/qgspointcloudlayerexporter.cpp b/src/core/pointcloud/qgspointcloudlayerexporter.cpp index 97595ee3922..0e65a392e76 100644 --- a/src/core/pointcloud/qgspointcloudlayerexporter.cpp +++ b/src/core/pointcloud/qgspointcloudlayerexporter.cpp @@ -42,6 +42,8 @@ QString QgsPointCloudLayerExporter::getOgrDriverName( ExportFormat format ) return QStringLiteral( "DXF" ); case ExportFormat::Shp: return QStringLiteral( "ESRI Shapefile" ); + case ExportFormat::Csv: + return QStringLiteral( "CSV" ); case ExportFormat::Memory: case ExportFormat::Las: break; @@ -214,6 +216,8 @@ void QgsPointCloudLayerExporter::doExport() } } + QStringList layerCreationOptions; + switch ( mFormat ) { case ExportFormat::Memory: @@ -245,6 +249,10 @@ void QgsPointCloudLayerExporter::doExport() break; } + case ExportFormat::Csv: + layerCreationOptions << QStringLiteral( "GEOMETRY=AS_XYZ" ) + << QStringLiteral( "SEPARATOR=COMMA" ); // just in case ogr changes the default lco + // Intentional Fallthrough case ExportFormat::Gpkg: case ExportFormat::Dxf: case ExportFormat::Shp: @@ -255,6 +263,7 @@ void QgsPointCloudLayerExporter::doExport() saveOptions.driverName = ogrDriver; saveOptions.datasourceOptions = QgsVectorFileWriter::defaultDatasetOptions( ogrDriver ); saveOptions.layerOptions = QgsVectorFileWriter::defaultLayerOptions( ogrDriver ); + saveOptions.layerOptions << layerCreationOptions; saveOptions.symbologyExport = QgsVectorFileWriter::NoSymbology; saveOptions.actionOnExistingFile = mActionOnExistingFile; saveOptions.feedback = mFeedback; @@ -292,6 +301,7 @@ QgsMapLayer *QgsPointCloudLayerExporter::takeExportedLayer() case ExportFormat::Dxf: case ExportFormat::Shp: + case ExportFormat::Csv: { const QFileInfo fileInfo( mFilename ); return new QgsVectorLayer( mFilename, fileInfo.completeBaseName(), QStringLiteral( "ogr" ) ); diff --git a/src/core/pointcloud/qgspointcloudlayerexporter.h b/src/core/pointcloud/qgspointcloudlayerexporter.h index 9ade975ca61..45ed03e4235 100644 --- a/src/core/pointcloud/qgspointcloudlayerexporter.h +++ b/src/core/pointcloud/qgspointcloudlayerexporter.h @@ -55,6 +55,7 @@ class CORE_EXPORT QgsPointCloudLayerExporter SIP_NODEFAULTCTORS Gpkg = 2, //!< Geopackage Shp = 3, //!< ESRI ShapeFile Dxf = 4, //!< AutoCAD dxf + Csv = 5, //!< Comma separated values }; /** @@ -65,13 +66,14 @@ class CORE_EXPORT QgsPointCloudLayerExporter SIP_NODEFAULTCTORS static QList< ExportFormat > supportedFormats() SIP_SKIP { QList< ExportFormat > formats; - formats << ExportFormat::Memory; + formats << ExportFormat::Memory #ifdef HAVE_PDAL_QGIS - formats << ExportFormat::Las; + << ExportFormat::Las #endif - formats << ExportFormat::Gpkg; - formats << ExportFormat::Shp; - formats << ExportFormat::Dxf; + << ExportFormat::Gpkg + << ExportFormat::Shp + << ExportFormat::Dxf + << ExportFormat::Csv; return formats; } diff --git a/src/gui/pointcloud/qgspointcloudlayersaveasdialog.cpp b/src/gui/pointcloud/qgspointcloudlayersaveasdialog.cpp index af15eb28710..70ed4b8dd54 100644 --- a/src/gui/pointcloud/qgspointcloudlayersaveasdialog.cpp +++ b/src/gui/pointcloud/qgspointcloudlayersaveasdialog.cpp @@ -315,6 +315,7 @@ void QgsPointCloudLayerSaveAsDialog::mFormatComboBox_currentIndexChanged( int id case QgsPointCloudLayerExporter::ExportFormat::Memory: case QgsPointCloudLayerExporter::ExportFormat::Gpkg: case QgsPointCloudLayerExporter::ExportFormat::Shp: + case QgsPointCloudLayerExporter::ExportFormat::Csv: mAttributesSelection->setEnabled( true ); break; @@ -334,6 +335,7 @@ void QgsPointCloudLayerSaveAsDialog::mFormatComboBox_currentIndexChanged( int id case QgsPointCloudLayerExporter::ExportFormat::Shp: case QgsPointCloudLayerExporter::ExportFormat::Las: case QgsPointCloudLayerExporter::ExportFormat::Dxf: + case QgsPointCloudLayerExporter::ExportFormat::Csv: leLayername->setEnabled( false ); break; } @@ -351,6 +353,7 @@ void QgsPointCloudLayerSaveAsDialog::mFormatComboBox_currentIndexChanged( int id case QgsPointCloudLayerExporter::ExportFormat::Shp: case QgsPointCloudLayerExporter::ExportFormat::Las: case QgsPointCloudLayerExporter::ExportFormat::Dxf: + case QgsPointCloudLayerExporter::ExportFormat::Csv: mAddToCanvas->setEnabled( true ); if ( mWasAddToCanvasForced ) { @@ -576,6 +579,8 @@ QString QgsPointCloudLayerSaveAsDialog::getFilterForFormat( QgsPointCloudLayerEx return QStringLiteral( "AutoCAD DXF (*.dxf *.dxf)" ); case QgsPointCloudLayerExporter::ExportFormat::Shp: return QStringLiteral( "ESRI Shapefile (*.shp *.SHP)" ); + case QgsPointCloudLayerExporter::ExportFormat::Csv: + return QStringLiteral( "Comma separated values (*.csv *.CSV)" ); case QgsPointCloudLayerExporter::ExportFormat::Memory: break; } @@ -596,6 +601,8 @@ QString QgsPointCloudLayerSaveAsDialog::getTranslatedNameForFormat( QgsPointClou return tr( "ESRI Shapefile" ); case QgsPointCloudLayerExporter::ExportFormat::Las: return tr( "LAS/LAZ point cloud" ); + case QgsPointCloudLayerExporter::ExportFormat::Csv: + return tr( "Comma separated values" ); } return QString(); }