save_as_vector.diff
src/core/qgsvectorfilewriter.h (working copy) | ||
---|---|---|
53 | 53 |
ErrProjection // added in 1.5 |
54 | 54 |
}; |
55 | 55 | |
56 |
/** Write contents of vector layer to a shapefile */ |
|
56 |
/** Write contents of vector layer to a shapefile |
|
57 |
@note: deprecated. Use writeAsVectorFormat instead*/ |
|
57 | 58 |
static WriterError writeAsShapefile( QgsVectorLayer* layer, |
58 | 59 |
const QString& shapefileName, |
59 | 60 |
const QString& fileEncoding, |
... | ... | |
61 | 62 |
bool onlySelected = FALSE, |
62 | 63 |
QString *errorMessage = 0 ); |
63 | 64 | |
65 |
/** Write contents of vector layer to an (OGR supported) vector formt |
|
66 |
@note: this method was added in version 1.5*/ |
|
67 |
static WriterError writeAsVectorFormat( QgsVectorLayer* layer, |
|
68 |
const QString& fileName, |
|
69 |
const QString& fileEncoding, |
|
70 |
const QgsCoordinateReferenceSystem *destCRS, |
|
71 |
const QString& driverName = "ESRI Shapefile", |
|
72 |
bool onlySelected = FALSE, |
|
73 |
QString *errorMessage = 0 ); |
|
74 | ||
64 | 75 |
/** create shapefile and initialize it */ |
65 | 76 |
QgsVectorFileWriter( const QString& shapefileName, |
66 | 77 |
const QString& fileEncoding, |
... | ... | |
69 | 80 |
const QgsCoordinateReferenceSystem* srs, |
70 | 81 |
const QString& driverName = "ESRI Shapefile" ); |
71 | 82 | |
83 |
/**Returns map with format filter string as key and OGR format key as value*/ |
|
84 |
static QMap< QString, QString> supportedFiltersAndFormats(); |
|
85 | ||
86 |
/**Returns filter string that can be used for dialogs*/ |
|
87 |
static QString fileFilterString(); |
|
88 | ||
89 |
/**Creates a filter for an OGR driver key*/ |
|
90 |
static QString filterForDriver( const QString& driverName ); |
|
91 | ||
72 | 92 |
/** checks whether there were any errors in constructor */ |
73 | 93 |
WriterError hasError(); |
74 | 94 |
src/core/qgsvectorfilewriter.cpp (working copy) | ||
---|---|---|
386 | 386 |
bool onlySelected, |
387 | 387 |
QString *errorMessage ) |
388 | 388 |
{ |
389 | ||
389 |
return writeAsVectorFormat( layer, shapefileName, fileEncoding, destCRS, "ESRI Shapefile", onlySelected, errorMessage ); |
|
390 |
#if 0 |
|
390 | 391 |
const QgsCoordinateReferenceSystem* outputCRS; |
391 | 392 |
QgsCoordinateTransform* ct = 0; |
392 | 393 |
int shallTransform = false; |
... | ... | |
471 | 472 |
} |
472 | 473 | |
473 | 474 |
return NoError; |
475 |
#endif //0 |
|
474 | 476 |
} |
475 | 477 | |
478 |
QgsVectorFileWriter::WriterError |
|
479 |
QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, |
|
480 |
const QString& fileName, |
|
481 |
const QString& fileEncoding, |
|
482 |
const QgsCoordinateReferenceSystem *destCRS, |
|
483 |
const QString& driverName, |
|
484 |
bool onlySelected, |
|
485 |
QString *errorMessage ) |
|
486 |
{ |
|
487 |
const QgsCoordinateReferenceSystem* outputCRS; |
|
488 |
QgsCoordinateTransform* ct = 0; |
|
489 |
int shallTransform = false; |
|
476 | 490 | |
491 |
if ( destCRS && destCRS->isValid() ) |
|
492 |
{ |
|
493 |
// This means we should transform |
|
494 |
outputCRS = destCRS; |
|
495 |
shallTransform = true; |
|
496 |
} |
|
497 |
else |
|
498 |
{ |
|
499 |
// This means we shouldn't transform, use source CRS as output (if defined) |
|
500 |
outputCRS = &layer->srs(); |
|
501 |
} |
|
502 |
QgsVectorFileWriter* writer = |
|
503 |
new QgsVectorFileWriter( fileName, fileEncoding, layer->pendingFields(), layer->wkbType(), outputCRS, driverName ); |
|
504 | ||
505 |
// check whether file creation was successful |
|
506 |
WriterError err = writer->hasError(); |
|
507 |
if ( err != NoError ) |
|
508 |
{ |
|
509 |
if ( errorMessage ) |
|
510 |
*errorMessage = writer->errorMessage(); |
|
511 |
delete writer; |
|
512 |
return err; |
|
513 |
} |
|
514 | ||
515 |
QgsAttributeList allAttr = layer->pendingAllAttributesList(); |
|
516 |
QgsFeature fet; |
|
517 | ||
518 |
layer->select( allAttr, QgsRectangle(), true ); |
|
519 | ||
520 |
const QgsFeatureIds& ids = layer->selectedFeaturesIds(); |
|
521 | ||
522 |
// Create our transform |
|
523 |
if ( destCRS ) |
|
524 |
{ |
|
525 |
ct = new QgsCoordinateTransform( layer->srs(), *destCRS ); |
|
526 |
} |
|
527 | ||
528 |
// Check for failure |
|
529 |
if ( ct == NULL ) |
|
530 |
{ |
|
531 |
shallTransform = false; |
|
532 |
} |
|
533 | ||
534 |
// write all features |
|
535 |
while ( layer->nextFeature( fet ) ) |
|
536 |
{ |
|
537 |
if ( onlySelected && !ids.contains( fet.id() ) ) |
|
538 |
continue; |
|
539 | ||
540 |
if ( shallTransform ) |
|
541 |
{ |
|
542 |
try |
|
543 |
{ |
|
544 |
fet.geometry()->transform( *ct ); |
|
545 |
} |
|
546 |
catch ( QgsCsException &e ) |
|
547 |
{ |
|
548 |
delete ct; |
|
549 |
delete writer; |
|
550 | ||
551 |
QString msg = QObject::tr( "Failed to transform a point while drawing a feature of type '%1'. Writing stopped. (Exception: %2)" ) |
|
552 |
.arg( fet.typeName() ).arg( e.what() ); |
|
553 |
QgsLogger::warning( msg ); |
|
554 |
if ( errorMessage ) |
|
555 |
*errorMessage = msg; |
|
556 | ||
557 |
return ErrProjection; |
|
558 |
} |
|
559 |
} |
|
560 |
writer->addFeature( fet ); |
|
561 |
} |
|
562 | ||
563 |
delete writer; |
|
564 | ||
565 |
if ( shallTransform ) |
|
566 |
{ |
|
567 |
delete ct; |
|
568 |
} |
|
569 | ||
570 |
return NoError; |
|
571 |
} |
|
572 | ||
573 | ||
477 | 574 |
bool QgsVectorFileWriter::deleteShapeFile( QString theFileName ) |
478 | 575 |
{ |
479 | 576 |
QFileInfo fi( theFileName ); |
... | ... | |
498 | 595 | |
499 | 596 |
return ok; |
500 | 597 |
} |
598 | ||
599 |
QMap< QString, QString> QgsVectorFileWriter::supportedFiltersAndFormats() |
|
600 |
{ |
|
601 |
QMap<QString, QString> resultMap; |
|
602 | ||
603 |
QgsApplication::registerOgrDrivers(); |
|
604 |
int const drvCount = OGRGetDriverCount(); |
|
605 | ||
606 |
QString drvName; |
|
607 |
QString filterString; |
|
608 |
for ( int i = 0; i < drvCount; ++i ) |
|
609 |
{ |
|
610 |
OGRSFDriverH drv = OGRGetDriver( i ); |
|
611 |
if ( drv ) |
|
612 |
{ |
|
613 |
drvName = OGR_Dr_GetName( drv ); |
|
614 |
if ( OGR_Dr_TestCapability( drv, ODrCCreateDataSource ) != 0 ) |
|
615 |
{ |
|
616 |
//add driver name and filter to map |
|
617 |
filterString = QgsVectorFileWriter::filterForDriver( drvName ); |
|
618 |
if ( !filterString.isEmpty() ) |
|
619 |
{ |
|
620 |
resultMap.insert( filterString, drvName ); |
|
621 |
} |
|
622 |
} |
|
623 |
} |
|
624 |
} |
|
625 | ||
626 |
return resultMap; |
|
627 |
} |
|
628 | ||
629 |
QString QgsVectorFileWriter::fileFilterString() |
|
630 |
{ |
|
631 |
QString filterString; |
|
632 |
QMap< QString, QString> driverFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats(); |
|
633 |
QMap< QString, QString>::const_iterator it = driverFormatMap.constBegin(); |
|
634 |
for ( ; it != driverFormatMap.constEnd(); ++it ) |
|
635 |
{ |
|
636 |
filterString += it.key(); |
|
637 |
} |
|
638 |
return filterString; |
|
639 |
} |
|
640 | ||
641 |
QString QgsVectorFileWriter::filterForDriver( const QString& driverName ) |
|
642 |
{ |
|
643 |
QString longName; |
|
644 |
QString glob; |
|
645 | ||
646 |
if ( driverName.startsWith( "AVCE00" ) ) |
|
647 |
{ |
|
648 |
longName = "Arc/Info ASCII Coverage"; |
|
649 |
glob = "*.e00"; |
|
650 |
} |
|
651 |
else if ( driverName.startsWith( "BNA" ) ) |
|
652 |
{ |
|
653 |
longName = "Atlas BNA"; |
|
654 |
glob = "*.bna"; |
|
655 |
} |
|
656 |
else if ( driverName.startsWith( "CSV" ) ) |
|
657 |
{ |
|
658 |
longName = "Comma Separated Value"; |
|
659 |
glob = "*.csv"; |
|
660 |
} |
|
661 |
else if ( driverName.startsWith( "ESRI" ) ) |
|
662 |
{ |
|
663 |
longName = "ESRI Shapefiles"; |
|
664 |
glob = "*.shp"; |
|
665 |
} |
|
666 |
else if ( driverName.startsWith( "FMEObjects Gateway" ) ) |
|
667 |
{ |
|
668 |
longName = "FMEObjects Gateway"; |
|
669 |
glob = "*.fdd"; |
|
670 |
} |
|
671 |
else if ( driverName.startsWith( "GeoJSON" ) ) |
|
672 |
{ |
|
673 |
longName = "GeoJSON"; |
|
674 |
glob = "*.geojson"; |
|
675 |
} |
|
676 |
else if ( driverName.startsWith( "GeoRSS" ) ) |
|
677 |
{ |
|
678 |
longName = "GeoRSS"; |
|
679 |
glob = "*.xml"; |
|
680 |
} |
|
681 |
else if ( driverName.startsWith( "GML" ) ) |
|
682 |
{ |
|
683 |
longName = "Geography Markup Language"; |
|
684 |
glob = "*.gml"; |
|
685 |
} |
|
686 |
else if ( driverName.startsWith( "GMT" ) ) |
|
687 |
{ |
|
688 |
longName = "GMT"; |
|
689 |
glob = "*.gmt"; |
|
690 |
} |
|
691 |
else if ( driverName.startsWith( "GPX" ) ) |
|
692 |
{ |
|
693 |
longName = "GPX"; |
|
694 |
glob = "*.gpx"; |
|
695 |
} |
|
696 |
else if ( driverName.startsWith( "Interlis 1" ) ) |
|
697 |
{ |
|
698 |
longName = "INTERLIS 1"; |
|
699 |
glob = "*.itf *.xml *.ili"; |
|
700 |
} |
|
701 |
else if ( driverName.startsWith( "Interlis 2" ) ) |
|
702 |
{ |
|
703 |
longName = "INTERLIS 2"; |
|
704 |
glob = "*.itf *.xml *.ili"; |
|
705 |
} |
|
706 |
else if ( driverName.startsWith( "KML" ) ) |
|
707 |
{ |
|
708 |
longName = "KML"; |
|
709 |
glob = "*.kml" ; |
|
710 |
} |
|
711 |
else if ( driverName.startsWith( "MapInfo File" ) ) |
|
712 |
{ |
|
713 |
longName = "Mapinfo File"; |
|
714 |
glob = "*.mif *.tab"; |
|
715 |
} |
|
716 |
else if ( driverName.startsWith( "DGN" ) ) |
|
717 |
{ |
|
718 |
longName = "Microstation DGN"; |
|
719 |
glob = "*.dgn"; |
|
720 |
} |
|
721 |
else if ( driverName.startsWith( "S57" ) ) |
|
722 |
{ |
|
723 |
longName = "S-57 Base file"; |
|
724 |
glob = "*.000"; |
|
725 |
} |
|
726 |
else if ( driverName.startsWith( "SDTS" ) ) |
|
727 |
{ |
|
728 |
longName = "Spatial Data Transfer Standard"; |
|
729 |
glob = "*catd.ddf"; |
|
730 |
} |
|
731 |
else if ( driverName.startsWith( "SQLite" ) ) |
|
732 |
{ |
|
733 |
longName = "SQLite"; |
|
734 |
glob = "*.sqlite"; |
|
735 |
} |
|
736 |
else if ( driverName.startsWith( "VRT" ) ) |
|
737 |
{ |
|
738 |
longName = "VRT - Virtual Datasource "; |
|
739 |
glob = "*.vrt"; |
|
740 |
} |
|
741 |
else if ( driverName.startsWith( "XPlane" ) ) |
|
742 |
{ |
|
743 |
longName = "X-Plane/Flighgear"; |
|
744 |
glob = "apt.dat nav.dat fix.dat awy.dat"; |
|
745 |
} |
|
746 |
else |
|
747 |
{ |
|
748 |
return QString(); |
|
749 |
} |
|
750 |
return "[OGR] " + longName + " (" + glob.toLower() + " " + glob.toUpper() + ");;"; |
|
751 |
} |
src/app/legend/qgslegendlayer.h (working copy) | ||
---|---|---|
87 | 87 |
void saveAsShapefile(); |
88 | 88 |
void saveSelectionAsShapefile(); |
89 | 89 | |
90 |
void saveAsVectorFile(); |
|
91 |
void saveSelectionAsVectorFile(); |
|
92 | ||
90 | 93 |
/**update the layer's icon to show whether is in editing mode or in overview */ |
91 | 94 |
void updateIcon(); |
92 | 95 | |
... | ... | |
111 | 114 |
/**Save as shapefile (called from saveAsShapefile and saveSelectionAsShapefile)*/ |
112 | 115 |
void saveAsShapefileGeneral( bool saveOnlySelection ); |
113 | 116 | |
117 |
void saveAsVectorFileGeneral( bool saveOnlySelection ); |
|
118 | ||
114 | 119 |
private: |
115 | 120 |
/** Helper method to make the font bold from all ctors. |
116 | 121 |
* Not to be confused with setFont() which is inherited |
src/app/legend/qgslegendlayer.cpp (working copy) | ||
---|---|---|
423 | 423 |
} |
424 | 424 |
} |
425 | 425 | |
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() ) );
|
|
428 | 428 | |
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() ) );
|
|
431 | 431 |
if ( vlayer->selectedFeatureCount() == 0 ) |
432 | 432 |
{ |
433 |
saveSelectionAction->setEnabled( false ); |
|
433 |
saveSelectionAsAction->setEnabled( false );
|
|
434 | 434 |
} |
435 | 435 | |
436 | 436 |
theMenu.addSeparator(); |
... | ... | |
460 | 460 |
saveAsShapefileGeneral( TRUE ); |
461 | 461 |
} |
462 | 462 | |
463 |
void QgsLegendLayer::saveAsVectorFile() |
|
464 |
{ |
|
465 |
saveAsVectorFileGeneral( false ); |
|
466 |
} |
|
467 | ||
468 |
void QgsLegendLayer::saveSelectionAsVectorFile() |
|
469 |
{ |
|
470 |
saveAsVectorFileGeneral( true ); |
|
471 |
} |
|
472 | ||
463 | 473 |
////////// |
464 | 474 | |
465 | 475 |
void QgsLegendLayer::setVisible( bool visible ) |
... | ... | |
492 | 502 |
legend()->updateOverview(); |
493 | 503 |
} |
494 | 504 | |
505 |
void QgsLegendLayer::saveAsVectorFileGeneral( bool saveOnlySelection ) |
|
506 |
{ |
|
507 |
if ( mLyr.layer()->type() != QgsMapLayer::VectorLayer ) |
|
508 |
return; |
|
495 | 509 | |
510 |
QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( mLyr.layer() ); |
|
496 | 511 | |
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 |
} |
|
497 | 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 |
} |
|
580 | ||
581 | ||
498 | 582 |
void QgsLegendLayer::saveAsShapefileGeneral( bool saveOnlySelection ) |
499 | 583 |
{ |
500 | 584 |
QgsCoordinateReferenceSystem destCRS; |
python/core/qgsvectorfilewriter.sip (working copy) | ||
---|---|---|
31 | 31 |
const QgsCoordinateReferenceSystem*, |
32 | 32 |
bool onlySelected = FALSE); |
33 | 33 | |
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 | ||
34 | 44 |
/** create shapefile and initialize it */ |
35 | 45 |
QgsVectorFileWriter(const QString& shapefileName, |
36 | 46 |
const QString& fileEncoding, |
... | ... | |
38 | 48 |
QGis::WkbType geometryType, |
39 | 49 |
const QgsCoordinateReferenceSystem* srs, |
40 | 50 |
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 ); |
|
41 | 60 |
|
42 | 61 |
/** checks whether there were any errors in constructor */ |
43 | 62 |
WriterError hasError(); |