Skip to content

Commit d8b8c6a

Browse files
author
mhugent
committed
Apply patch #2452 (save as vector)
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@13072 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 2656f4d commit d8b8c6a

File tree

5 files changed

+391
-12
lines changed

5 files changed

+391
-12
lines changed

python/core/qgsvectorfilewriter.sip

+20-1
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,32 @@ public:
3131
const QgsCoordinateReferenceSystem*,
3232
bool onlySelected = FALSE);
3333

34+
/** Write contents of vector layer to an (OGR supported) vector formt
35+
@note: this method was added in version 1.5*/
36+
static WriterError writeAsVectorFormat( QgsVectorLayer* layer,
37+
const QString& fileName,
38+
const QString& fileEncoding,
39+
const QgsCoordinateReferenceSystem *destCRS,
40+
const QString& driverName = "ESRI Shapefile",
41+
bool onlySelected = FALSE,
42+
QString *errorMessage = 0 );
43+
3444
/** create shapefile and initialize it */
35-
QgsVectorFileWriter(const QString& shapefileName,
45+
QgsVectorFileWriter(const QString& vectorFileName,
3646
const QString& fileEncoding,
3747
const QMap<int, QgsField>& fields,
3848
QGis::WkbType geometryType,
3949
const QgsCoordinateReferenceSystem* srs,
4050
const QString& driverName = "ESRI Shapefile" );
51+
52+
/**Returns map with format filter string as key and OGR format key as value*/
53+
static QMap< QString, QString> supportedFiltersAndFormats();
54+
55+
/**Returns filter string that can be used for dialogs*/
56+
static QString fileFilterString();
57+
58+
/**Creates a filter for an OGR driver key*/
59+
static QString filterForDriver( const QString& driverName );
4160

4261
/** checks whether there were any errors in constructor */
4362
WriterError hasError();

src/app/legend/qgslegendlayer.cpp

+89-5
Original file line numberDiff line numberDiff line change
@@ -423,14 +423,14 @@ void QgsLegendLayer::addToPopupMenu( QMenu& theMenu, QAction* toggleEditingActio
423423
}
424424
}
425425

426-
// save as shapefile
427-
theMenu.addAction( tr( "Save as shapefile..." ), this, SLOT( saveAsShapefile() ) );
426+
// save as vector file
427+
theMenu.addAction( tr( "Save as..." ), this, SLOT( saveAsVectorFile() ) );
428428

429-
// save selection as shapefile
430-
QAction* saveSelectionAction = theMenu.addAction( tr( "Save selection as shapefile..." ), this, SLOT( saveSelectionAsShapefile() ) );
429+
// save selection as vector file
430+
QAction* saveSelectionAsAction = theMenu.addAction( tr( "Save selection as..." ), this, SLOT( saveSelectionAsVectorFile() ) );
431431
if ( vlayer->selectedFeatureCount() == 0 )
432432
{
433-
saveSelectionAction->setEnabled( false );
433+
saveSelectionAsAction->setEnabled( false );
434434
}
435435

436436
theMenu.addSeparator();
@@ -460,6 +460,16 @@ void QgsLegendLayer::saveSelectionAsShapefile()
460460
saveAsShapefileGeneral( TRUE );
461461
}
462462

463+
void QgsLegendLayer::saveAsVectorFile()
464+
{
465+
saveAsVectorFileGeneral( false );
466+
}
467+
468+
void QgsLegendLayer::saveSelectionAsVectorFile()
469+
{
470+
saveAsVectorFileGeneral( true );
471+
}
472+
463473
//////////
464474

465475
void QgsLegendLayer::setVisible( bool visible )
@@ -492,7 +502,81 @@ void QgsLegendLayer::showInOverview()
492502
legend()->updateOverview();
493503
}
494504

505+
void QgsLegendLayer::saveAsVectorFileGeneral( bool saveOnlySelection )
506+
{
507+
if ( mLyr.layer()->type() != QgsMapLayer::VectorLayer )
508+
return;
509+
510+
QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( mLyr.layer() );
495511

512+
//get output name and format
513+
QSettings settings;
514+
QString filter = QString( "Shapefiles (*.shp)" );
515+
QString dirName = settings.value( "/UI/lastVectorfileDir", "." ).toString();
516+
QString filterString = QgsVectorFileWriter::fileFilterString();
517+
QString selectedFilter = settings.value( "/UI/lastVectorFilter", "[OGR] ESRI Shapefiles (*.shp *.SHP)" ).toString();
518+
QString outputFile = QFileDialog::getSaveFileName( 0, tr( "Save layer as..." ), dirName, filterString, &selectedFilter );
519+
if ( outputFile.isNull() )
520+
{
521+
return; //cancelled
522+
}
523+
524+
settings.setValue( "/UI/lastVectorfileDir", QFileInfo( outputFile ).absolutePath() );
525+
settings.setValue( "/UI/lastVectorFilter", selectedFilter );
526+
527+
QMap< QString, QString> filterDriverMap = QgsVectorFileWriter::supportedFiltersAndFormats();
528+
QMap< QString, QString>::const_iterator it = filterDriverMap.find( selectedFilter + ";;" );
529+
if ( it == filterDriverMap.constEnd() )
530+
{
531+
return; //unknown format
532+
}
533+
534+
QString driverKey = *it;
535+
536+
//output CRS
537+
QgsCoordinateReferenceSystem destCRS = vlayer->srs();
538+
// Find out if we have projections enabled or not
539+
if ( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() )
540+
{
541+
destCRS = QgisApp::instance()->mapCanvas()->mapRenderer()->destinationSrs();
542+
}
543+
544+
QgsGenericProjectionSelector * mySelector = new QgsGenericProjectionSelector();
545+
mySelector->setSelectedCrsId( destCRS.srsid() );
546+
mySelector->setMessage( tr( "Select the coordinate reference system for the saved shapefile. "
547+
"The data points will be transformed from the layer coordinate reference system." ) );
548+
549+
if ( mySelector->exec() )
550+
{
551+
QgsCoordinateReferenceSystem srs( mySelector->selectedCrsId(), QgsCoordinateReferenceSystem::InternalCrsId );
552+
destCRS = srs;
553+
// destCRS->createFromId(mySelector->selectedCrsId(), QgsCoordinateReferenceSystem::InternalCrsId)
554+
}
555+
else
556+
{
557+
// Aborted CS selection, don't save.
558+
delete mySelector;
559+
return;
560+
}
561+
delete mySelector;
562+
563+
// overwrite the file - user will already have been prompted
564+
// to verify they want to overwrite by the file dialog above
565+
// might not even exists in the given case.
566+
if ( driverKey == "ESRI Shapefile" )
567+
{
568+
// add the extension if not present
569+
if ( !outputFile.endsWith( ".shp", Qt::CaseInsensitive ) )
570+
{
571+
outputFile += ".shp";
572+
}
573+
QgsVectorFileWriter::deleteShapeFile( outputFile );
574+
}
575+
576+
QString errorMessage;
577+
QgsVectorFileWriter::WriterError error;
578+
error = QgsVectorFileWriter::writeAsVectorFormat( vlayer, outputFile, "utf-8", &destCRS, driverKey, saveOnlySelection, &errorMessage );
579+
}
496580

497581

498582
void QgsLegendLayer::saveAsShapefileGeneral( bool saveOnlySelection )

src/app/legend/qgslegendlayer.h

+5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ class QgsLegendLayer : public QgsLegendItem
8787
void saveAsShapefile();
8888
void saveSelectionAsShapefile();
8989

90+
void saveAsVectorFile();
91+
void saveSelectionAsVectorFile();
92+
9093
/**update the layer's icon to show whether is in editing mode or in overview */
9194
void updateIcon();
9295

@@ -111,6 +114,8 @@ class QgsLegendLayer : public QgsLegendItem
111114
/**Save as shapefile (called from saveAsShapefile and saveSelectionAsShapefile)*/
112115
void saveAsShapefileGeneral( bool saveOnlySelection );
113116

117+
void saveAsVectorFileGeneral( bool saveOnlySelection );
118+
114119
private:
115120
/** Helper method to make the font bold from all ctors.
116121
* Not to be confused with setFont() which is inherited

0 commit comments

Comments
 (0)