QgsGeometry QgsAtlasComposition::currentGeometry( const QgsCoordinateReferenceSystem& crs ) const { if ( !mCoverageLayer || !mCurrentFeature.isValid() || !mCurrentFeature.hasGeometry() ) { return QgsGeometry(); } if ( !crs.isValid() ) { // no projection, return the native geometry return mCurrentFeature.geometry(); } QMap<long, QgsGeometry>::const_iterator it = mGeometryCache.constFind( crs.srsid() ); if ( it != mGeometryCache.constEnd() ) { // we have it in cache, return it return it.value(); } if ( mCoverageLayer->crs() == crs ) { return mCurrentFeature.geometry(); } QgsGeometry transformed = mCurrentFeature.geometry(); transformed.transform( QgsCoordinateTransformCache::instance()->transform( mCoverageLayer->crs().authid(), crs.authid() ) ); mGeometryCache[crs.srsid()] = transformed; return transformed; }
void QgsWFSSourceSelect::changeCRSFilter() { QgsDebugMsg( "changeCRSFilter called" ); //evaluate currently selected typename and set the CRS filter in mProjectionSelector QModelIndex currentIndex = treeView->selectionModel()->currentIndex(); if ( currentIndex.isValid() ) { QString currentTypename = currentIndex.sibling( currentIndex.row(), MODEL_IDX_NAME ).data().toString(); QgsDebugMsg( QString( "the current typename is: %1" ).arg( currentTypename ) ); QMap<QString, QStringList >::const_iterator crsIterator = mAvailableCRS.find( currentTypename ); if ( crsIterator != mAvailableCRS.end() ) { QSet<QString> crsNames( crsIterator->toSet() ); if ( mProjectionSelector ) { mProjectionSelector->setOgcWmsCrsFilter( crsNames ); QString preferredCRS = getPreferredCrs( crsNames ); //get preferred EPSG system if ( !preferredCRS.isEmpty() ) { QgsCoordinateReferenceSystem refSys; refSys.createFromOgcWmsCrs( preferredCRS ); mProjectionSelector->setSelectedCrsId( refSys.srsid() ); labelCoordRefSys->setText( preferredCRS ); } } } } }
void QgsOptions::on_pbnSelectProjection_clicked() { QSettings settings; QgsGenericProjectionSelector * mySelector = new QgsGenericProjectionSelector( this ); //find out srs id of current proj4 string QgsCoordinateReferenceSystem refSys; if ( refSys.createFromProj4( txtGlobalWkt->toPlainText() ) ) { mySelector->setSelectedCrsId( refSys.srsid() ); } if ( mySelector->exec() ) { //! @todo changes this control name in gui to txtGlobalProjString txtGlobalWkt->setText( mySelector->selectedProj4String() ); QgsDebugMsg( QString( "------ Global Default Projection Selection set to ----------\n%1" ).arg( txtGlobalWkt->toPlainText() ) ); } else { QgsDebugMsg( "------ Global Default Projection Selection change cancelled ----------" ); QApplication::restoreOverrideCursor(); } }
void QgsGrassNewMapset::setCurrentRegion() { QgsDebugMsg( "entered" ); QgsRectangle ext = mIface->mapCanvas()->extent(); QgsCoordinateReferenceSystem srs = mIface->mapCanvas()->mapSettings().destinationCrs(); QgsDebugMsg( "srs = " + srs.toWkt() ); std::vector<QgsPoint> points; // TODO: this is not perfect points.push_back( QgsPoint( ext.xMinimum(), ext.yMinimum() ) ); points.push_back( QgsPoint( ext.xMaximum(), ext.yMaximum() ) ); // TODO add a method, this code is copy-paste from setSelectedRegion if ( srs.isValid() && mCrs.isValid() && srs.srsid() != mCrs.srsid() ) { QgsCoordinateTransform trans( srs, mCrs ); bool ok = true; for ( int i = 0; i < 2; i++ ) { try { points[i] = trans.transform( points[i] ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( "Cannot transform point" ); ok = false; break; } } if ( !ok ) { QgsGrass::warning( tr( "Cannot reproject region" ) ); return; } } mNorthLineEdit->setText( QString::number( points[1].y() ) ); mSouthLineEdit->setText( QString::number( points[0].y() ) ); mEastLineEdit->setText( QString::number( points[1].x() ) ); mWestLineEdit->setText( QString::number( points[0].x() ) ); mRegionModified = true; checkRegion(); drawRegion(); QgsDebugMsg( "setCurrentRegion - End" ); }
double Heatmap::mapUnitsOf( double meters, QgsCoordinateReferenceSystem layerCrs ) { // Worker to transform metres input to mapunits QgsDistanceArea da; da.setSourceCrs( layerCrs.srsid() ); da.setEllipsoid( layerCrs.ellipsoidAcronym() ); if ( da.geographic() ) { da.setEllipsoidalMode( true ); } return meters / da.measureLine( QgsPoint( 0.0, 0.0 ), QgsPoint( 0.0, 1.0 ) ); }
void QgsGrassNewMapset::setGrassRegionDefaults() { QgsDebugMsg( QString( "mCellHead.proj = %1" ).arg( mCellHead.proj ) ); QgsCoordinateReferenceSystem srs = mIface->mapCanvas()->mapSettings().destinationCrs(); QgsDebugMsg( "srs = " + srs.toWkt() ); QgsRectangle ext = mIface->mapCanvas()->extent(); bool extSet = false; if ( ext.xMinimum() < ext.xMaximum() && ext.yMinimum() < ext.yMaximum() ) { extSet = true; } if ( extSet && ( mNoProjRadioButton->isChecked() || ( mProjRadioButton->isChecked() && srs.srsid() == mProjectionSelector->selectedCrsId() ) ) ) { mNorthLineEdit->setText( QString::number( ext.yMaximum() ) ); mSouthLineEdit->setText( QString::number( ext.yMinimum() ) ); mEastLineEdit->setText( QString::number( ext.xMaximum() ) ); mWestLineEdit->setText( QString::number( ext.xMinimum() ) ); } else if ( mCellHead.proj == PROJECTION_XY ) { mNorthLineEdit->setText( "1000" ); mSouthLineEdit->setText( "0" ); mEastLineEdit->setText( "1000" ); mWestLineEdit->setText( "0" ); } else if ( mCellHead.proj == PROJECTION_LL ) { mNorthLineEdit->setText( "90" ); mSouthLineEdit->setText( "-90" ); mEastLineEdit->setText( "180" ); mWestLineEdit->setText( "-180" ); } else { mNorthLineEdit->setText( "100000" ); mSouthLineEdit->setText( "-100000" ); mEastLineEdit->setText( "100000" ); mWestLineEdit->setText( "-100000" ); } mRegionModified = false; }
double HeatmapGui::mapUnitsOf( double dist, const QgsCoordinateReferenceSystem& layerCrs ) const { // converter function to transform layer input to mapunits // so that bounding box can be updated QgsDistanceArea da; da.setSourceCrs( layerCrs.srsid() ); da.setEllipsoid( layerCrs.ellipsoidAcronym() ); if ( da.geographic() ) { da.setEllipsoidalMode( true ); } double unitDistance = da.measureLine( QgsPoint( 0.0, 0.0 ), QgsPoint( 0.0, 1.0 ) ); QgsDebugMsg( QString( "Converted %1 layer to %2 map units" ).arg( dist ).arg( dist / unitDistance ) ); return dist / unitDistance; }
QgsNewSpatialiteLayerDialog::QgsNewSpatialiteLayerDialog( QWidget *parent, Qt::WFlags fl ) : QDialog( parent, fl ) { setupUi( this ); QSettings settings; restoreGeometry( settings.value( "/Windows/NewSpatiaLiteLayer/geometry" ).toByteArray() ); mAddAttributeButton->setIcon( QgisApp::getThemeIcon( "/mActionNewAttribute.png" ) ); mRemoveAttributeButton->setIcon( QgisApp::getThemeIcon( "/mActionDeleteAttribute.png" ) ); mTypeBox->addItem( tr( "Text data" ), "text" ); mTypeBox->addItem( tr( "Whole number" ), "integer" ); mTypeBox->addItem( tr( "Decimal number" ), "real" ); mPointRadioButton->setChecked( true ); // Populate the database list from the stored connections settings.beginGroup( "/SpatiaLite/connections" ); QStringList keys = settings.childGroups(); QStringList::Iterator it = keys.begin(); mDatabaseComboBox->clear(); while ( it != keys.end() ) { // retrieving the SQLite DB name and full path QString text = settings.value( *it + "/sqlitepath", "###unknown###" ).toString(); mDatabaseComboBox->addItem( text ); ++it; } settings.endGroup(); mOkButton = buttonBox->button( QDialogButtonBox::Ok ); mOkButton->setEnabled( false ); // Set the SRID box to a default of WGS84 QgsCoordinateReferenceSystem srs; srs.createFromOgcWmsCrs( GEO_EPSG_CRS_AUTHID ); srs.validate(); mCrsId = srs.srsid(); leSRID->setText( srs.authid() + " - " + srs.description() ); pbnFindSRID->setEnabled( mDatabaseComboBox->count() ); connect( mNameEdit, SIGNAL( textChanged( QString ) ), this, SLOT( nameChanged( QString ) ) ); connect( mAttributeView, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) ); mAddAttributeButton->setEnabled( false ); mRemoveAttributeButton->setEnabled( false ); }
void QgsNewVectorLayerDialog::on_pbnChangeSpatialRefSys_clicked() { QgsGenericProjectionSelector *mySelector = new QgsGenericProjectionSelector( this ); mySelector->setMessage(); mySelector->setSelectedCrsId( mCrsId ); if ( mySelector->exec() ) { QgsCoordinateReferenceSystem srs; srs.createFromOgcWmsCrs( mySelector->selectedAuthId() ); mCrsId = srs.srsid(); leSpatialRefSys->setText( srs.authid() + " - " + srs.description() ); } else { QApplication::restoreOverrideCursor(); } delete mySelector; }
void QgsSLDConfigParser::setCrsForLayer( const QDomElement& layerElem, QgsMapLayer* ml ) const { //create CRS if specified as attribute ("epsg" or "proj") QString epsg = layerElem.attribute( QStringLiteral( "epsg" ), QLatin1String( "" ) ); if ( !epsg.isEmpty() ) { bool conversionOk; int epsgnr = epsg.toInt( &conversionOk ); if ( conversionOk ) { //set spatial ref sys QgsCoordinateReferenceSystem srs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( QStringLiteral( "EPSG:%1" ).arg( epsgnr ) ); ml->setCrs( srs ); } } else { QString projString = layerElem.attribute( QStringLiteral( "proj" ), QLatin1String( "" ) ); if ( !projString.isEmpty() ) { QgsCoordinateReferenceSystem srs = QgsCoordinateReferenceSystem::fromProj4( projString ); //TODO: createFromProj4 used to save to the user database any new CRS // this behavior was changed in order to separate creation and saving. // Not sure if it necessary to save it here, should be checked by someone // familiar with the code (should also give a more descriptive name to the generated CRS) if ( srs.srsid() == 0 ) { QString myName = QStringLiteral( " * %1 (%2)" ) .arg( QObject::tr( "Generated CRS", "A CRS automatically generated from layer info get this prefix for description" ), srs.toProj4() ); srs.saveAsUserCrs( myName ); } ml->setCrs( srs ); } } }
/**************************** REGION ********************************/ void QgsGrassNewMapset::setRegionPage() { QgsDebugMsg( "entered." ); // Set defaults if ( !mRegionModified ) { setGrassRegionDefaults(); } // Create new projection QgsCoordinateReferenceSystem newSrs; if ( mProjRadioButton->isChecked() ) { QgsDebugMsg( QString( "selectedCrsId() = %1" ).arg( mProjectionSelector->selectedCrsId() ) ); if ( mProjectionSelector->selectedCrsId() > 0 ) { newSrs.createFromSrsId( mProjectionSelector->selectedCrsId() ); if ( ! newSrs.isValid() ) { QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot create projection." ) ); } } } // Reproject previous region if it was modified // and if previous and current projection is valid if ( mRegionModified && newSrs.isValid() && mSrs.isValid() && newSrs.srsid() != mSrs.srsid() ) { QgsCoordinateTransform trans( mSrs, newSrs ); double n = mNorthLineEdit->text().toDouble(); double s = mSouthLineEdit->text().toDouble(); double e = mEastLineEdit->text().toDouble(); double w = mWestLineEdit->text().toDouble(); std::vector<QgsPoint> points; // TODO: this is not perfect points.push_back( QgsPoint( w, s ) ); points.push_back( QgsPoint( e, n ) ); bool ok = true; for ( int i = 0; i < 2; i++ ) { try { points[i] = trans.transform( points[i] ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( "Cannot transform point" ); ok = false; break; } } if ( ok ) { mNorthLineEdit->setText( QString::number( points[1].y() ) ); mSouthLineEdit->setText( QString::number( points[0].y() ) ); mEastLineEdit->setText( QString::number( points[1].x() ) ); mWestLineEdit->setText( QString::number( points[0].x() ) ); } else { QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot reproject previously set region, default region set." ) ); setGrassRegionDefaults(); } } // Set current region projection mSrs = newSrs; // Enable / disable region selection widgets if ( mNoProjRadioButton->isChecked() ) { mRegionMap->hide(); mCurrentRegionButton->hide(); mRegionsComboBox->hide(); mRegionButton->hide(); mSetRegionFrame->hide(); } else { mRegionMap->show(); mCurrentRegionButton->show(); mRegionsComboBox->show(); mRegionButton->show(); mSetRegionFrame->show(); QgsRectangle ext = mIface->mapCanvas()->extent(); if ( ext.xMinimum() >= ext.xMaximum() || ext.yMinimum() >= ext.yMaximum() ) { mCurrentRegionButton->setEnabled( false ); } } checkRegion(); if ( !mNoProjRadioButton->isChecked() ) { drawRegion(); } }
bool QgsDistanceArea::setEllipsoid( const QString& ellipsoid ) { QString radius, parameter2; // // SQLITE3 stuff - get parameters for selected ellipsoid // sqlite3 *myDatabase; const char *myTail; sqlite3_stmt *myPreparedStatement; int myResult; // Shortcut if ellipsoid is none. if ( ellipsoid == GEO_NONE ) { mEllipsoid = GEO_NONE; return true; } // Check if we have a custom projection, and set from text string. // Format is "PARAMETER:<semi-major axis>:<semi minor axis> // Numbers must be with (optional) decimal point and no other separators (C locale) // Distances in meters. Flattening is calculated. if ( ellipsoid.startsWith( "PARAMETER" ) ) { QStringList paramList = ellipsoid.split( ':' ); bool semiMajorOk, semiMinorOk; double semiMajor = paramList[1].toDouble( & semiMajorOk ); double semiMinor = paramList[2].toDouble( & semiMinorOk ); if ( semiMajorOk && semiMinorOk ) { return setEllipsoid( semiMajor, semiMinor ); } else { return false; } } // Continue with PROJ.4 list of ellipsoids. //check the db is available myResult = sqlite3_open_v2( QgsApplication::srsDbFilePath().toUtf8().data(), &myDatabase, SQLITE_OPEN_READONLY, nullptr ); if ( myResult ) { QgsMessageLog::logMessage( QObject::tr( "Can't open database: %1" ).arg( sqlite3_errmsg( myDatabase ) ) ); // XXX This will likely never happen since on open, sqlite creates the // database if it does not exist. return false; } // Set up the query to retrieve the projection information needed to populate the ELLIPSOID list QString mySql = "select radius, parameter2 from tbl_ellipsoid where acronym='" + ellipsoid + '\''; myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail ); // XXX Need to free memory from the error msg if one is set if ( myResult == SQLITE_OK ) { if ( sqlite3_step( myPreparedStatement ) == SQLITE_ROW ) { radius = QString( reinterpret_cast< const char * >( sqlite3_column_text( myPreparedStatement, 0 ) ) ); parameter2 = QString( reinterpret_cast< const char * >( sqlite3_column_text( myPreparedStatement, 1 ) ) ); } } // close the sqlite3 statement sqlite3_finalize( myPreparedStatement ); sqlite3_close( myDatabase ); // row for this ellipsoid wasn't found? if ( radius.isEmpty() || parameter2.isEmpty() ) { QgsDebugMsg( QString( "setEllipsoid: no row in tbl_ellipsoid for acronym '%1'" ).arg( ellipsoid ) ); return false; } // get major semiaxis if ( radius.left( 2 ) == "a=" ) mSemiMajor = radius.mid( 2 ).toDouble(); else { QgsDebugMsg( QString( "setEllipsoid: wrong format of radius field: '%1'" ).arg( radius ) ); return false; } // get second parameter // one of values 'b' or 'f' is in field parameter2 // second one must be computed using formula: invf = a/(a-b) if ( parameter2.left( 2 ) == "b=" ) { mSemiMinor = parameter2.mid( 2 ).toDouble(); mInvFlattening = mSemiMajor / ( mSemiMajor - mSemiMinor ); } else if ( parameter2.left( 3 ) == "rf=" ) { mInvFlattening = parameter2.mid( 3 ).toDouble(); mSemiMinor = mSemiMajor - ( mSemiMajor / mInvFlattening ); } else { QgsDebugMsg( QString( "setEllipsoid: wrong format of parameter2 field: '%1'" ).arg( parameter2 ) ); return false; } QgsDebugMsg( QString( "setEllipsoid: a=%1, b=%2, 1/f=%3" ).arg( mSemiMajor ).arg( mSemiMinor ).arg( mInvFlattening ) ); // get spatial ref system for ellipsoid QString proj4 = "+proj=longlat +ellps=" + ellipsoid + " +no_defs"; QgsCoordinateReferenceSystem destCRS; destCRS.createFromProj4( proj4 ); //TODO: createFromProj4 used to save to the user database any new CRS // this behavior was changed in order to separate creation and saving. // Not sure if it necessary to save it here, should be checked by someone // familiar with the code (should also give a more descriptive name to the generated CRS) if ( destCRS.srsid() == 0 ) { QString myName = QString( " * %1 (%2)" ) .arg( QObject::tr( "Generated CRS", "A CRS automatically generated from layer info get this prefix for description" ), destCRS.toProj4() ); destCRS.saveAsUserCRS( myName ); } // // set transformation from project CRS to ellipsoid coordinates mCoordTransform->setDestCRS( destCRS ); mEllipsoid = ellipsoid; // precalculate some values for area calculations computeAreaInit(); return true; }
/**************************** REGION ********************************/ void QgsGrassNewMapset::setRegionPage() { // Set defaults if ( !mRegionModified ) { setGrassRegionDefaults(); } // Create new projection QgsCoordinateReferenceSystem newCrs; if ( mProjRadioButton->isChecked() ) { QgsDebugMsg( QString( "selectedCrsId() = %1" ).arg( mProjectionSelector->crs().srsid() ) ); if ( mProjectionSelector->crs().srsid() > 0 ) { newCrs = mProjectionSelector->crs(); if ( ! newCrs.isValid() ) { QgsGrass::warning( tr( "Cannot create projection." ) ); } } } // Reproject previous region if it was modified // and if previous and current projection is valid if ( mRegionModified && newCrs.isValid() && mCrs.isValid() && newCrs.srsid() != mCrs.srsid() ) { QgsCoordinateTransform trans( mCrs, newCrs ); double n = mNorthLineEdit->text().toDouble(); double s = mSouthLineEdit->text().toDouble(); double e = mEastLineEdit->text().toDouble(); double w = mWestLineEdit->text().toDouble(); std::vector<QgsPointXY> points; // TODO: this is not perfect points.push_back( QgsPointXY( w, s ) ); points.push_back( QgsPointXY( e, n ) ); bool ok = true; for ( int i = 0; i < 2; i++ ) { try { points[i] = trans.transform( points[i] ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( "Cannot transform point" ); ok = false; break; } } if ( ok ) { int precision = newCrs.mapUnits() == QgsUnitTypes::DistanceDegrees ? 6 : 1; mNorthLineEdit->setText( qgsDoubleToString( points[1].y(), precision ) ); mSouthLineEdit->setText( qgsDoubleToString( points[0].y(), precision ) ); mEastLineEdit->setText( qgsDoubleToString( points[1].x(), precision ) ); mWestLineEdit->setText( qgsDoubleToString( points[0].x(), precision ) ); } else { QgsGrass::warning( tr( "Cannot reproject previously set region, default region set." ) ); setGrassRegionDefaults(); } } // Set current region projection mCrs = newCrs; // Enable / disable region selection widgets if ( mNoProjRadioButton->isChecked() ) { mRegionMap->hide(); mCurrentRegionButton->hide(); mRegionsComboBox->hide(); mRegionButton->hide(); mSetRegionFrame->hide(); } else { mRegionMap->show(); mCurrentRegionButton->show(); mRegionsComboBox->show(); mRegionButton->show(); mSetRegionFrame->show(); QgsRectangle ext = mIface->mapCanvas()->extent(); mCurrentRegionButton->setEnabled( !ext.isEmpty() ); } checkRegion(); if ( !mNoProjRadioButton->isChecked() ) { drawRegion(); } }
void QgsLegendLayerFile::saveAsShapefileGeneral( bool saveOnlySelection ) { QgsCoordinateReferenceSystem destCRS; if ( mLyr.layer()->type() != QgsMapLayer::VectorLayer ) return; QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>( mLyr.layer() ); // get a name for the shapefile // Get a file to process, starting at the current directory QSettings settings; QString filter = QString( "Shapefiles (*.shp)" ); QString dirName = settings.value( "/UI/lastShapefileDir", "." ).toString(); QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog( 0, tr( "Save layer as..." ), dirName, filter, QString( "UTF-8" ) ); openFileDialog->setAcceptMode( QFileDialog::AcceptSave ); // allow for selection of more than one file //openFileDialog->setMode(QFileDialog::AnyFile); if ( openFileDialog->exec() != QDialog::Accepted ) return; QString encoding = openFileDialog->encoding(); QString shapefileName = openFileDialog->selectedFiles().first(); settings.setValue( "/UI/lastShapefileDir", QFileInfo( shapefileName ).absolutePath() ); if ( shapefileName.isNull() ) return; // add the extension if not present if ( shapefileName.indexOf( ".shp" ) == -1 ) { shapefileName += ".shp"; } destCRS = vlayer->srs(); // Find out if we have projections enabled or not if ( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ) { destCRS = QgisApp::instance()->mapCanvas()->mapRenderer()->destinationSrs(); } QgsGenericProjectionSelector * mySelector = new QgsGenericProjectionSelector(); mySelector->setSelectedCrsId( destCRS.srsid() ); mySelector->setMessage( tr( "Select the coordinate reference system for the saved shapefile." ) + tr( "The data points will be transformed from the layer coordinate reference system." ) ); if ( mySelector->exec() ) { QgsCoordinateReferenceSystem srs( mySelector->selectedCrsId(), QgsCoordinateReferenceSystem::InternalCrsId ); destCRS = srs; // destCRS->createFromId(mySelector->selectedCrsId(), QgsCoordinateReferenceSystem::InternalCrsId) } else { // Aborted CS selection, don't save. delete mySelector; return; } delete mySelector; // overwrite the file - user will already have been prompted // to verify they want to overwrite by the file dialog above if ( QFile::exists( shapefileName ) ) { if ( !QgsVectorFileWriter::deleteShapeFile( shapefileName ) ) { return; } } // ok if the file existed it should be deleted now so we can continue... QApplication::setOverrideCursor( Qt::WaitCursor ); QgsVectorFileWriter::WriterError error; error = QgsVectorFileWriter::writeAsShapefile( vlayer, shapefileName, encoding, &destCRS, saveOnlySelection ); QApplication::restoreOverrideCursor(); switch ( error ) { case QgsVectorFileWriter::NoError: QMessageBox::information( 0, tr( "Saving done" ), tr( "Export to Shapefile has been completed" ) ); break; case QgsVectorFileWriter::ErrDriverNotFound: QMessageBox::warning( 0, tr( "Driver not found" ), tr( "ESRI Shapefile driver is not available" ) ); break; case QgsVectorFileWriter::ErrCreateDataSource: QMessageBox::warning( 0, tr( "Error creating shapefile" ), tr( "The shapefile could not be created (" ) + shapefileName + ")" ); break; case QgsVectorFileWriter::ErrCreateLayer: QMessageBox::warning( 0, tr( "Error" ), tr( "Layer creation failed" ) ); break; case QgsVectorFileWriter::ErrAttributeTypeUnsupported: QMessageBox::warning( 0, tr( "Error" ), tr( "Layer attribute table contains unsupported datatype(s)" ) ); break; } }
QgsNewVectorLayerDialog::QgsNewVectorLayerDialog( QWidget *parent, Qt::WindowFlags fl ) : QDialog( parent, fl ) { setupUi( this ); QSettings settings; restoreGeometry( settings.value( "/Windows/NewVectorLayer/geometry" ).toByteArray() ); mAddAttributeButton->setIcon( QgsApplication::getThemeIcon( "/mActionNewAttribute.png" ) ); mRemoveAttributeButton->setIcon( QgsApplication::getThemeIcon( "/mActionDeleteAttribute.png" ) ); mTypeBox->addItem( tr( "Text data" ), "String" ); mTypeBox->addItem( tr( "Whole number" ), "Integer" ); mTypeBox->addItem( tr( "Decimal number" ), "Real" ); mTypeBox->addItem( tr( "Date" ), "Date" ); mWidth->setValidator( new QIntValidator( 1, 255, this ) ); mPrecision->setValidator( new QIntValidator( 0, 15, this ) ); mPointRadioButton->setChecked( true ); mFileFormatComboBox->addItem( tr( "ESRI Shapefile" ), "ESRI Shapefile" ); #if 0 // Disabled until provider properly supports editing the created file formats mFileFormatComboBox->addItem( tr( "Comma Separated Value" ), "Comma Separated Value" ); mFileFormatComboBox->addItem( tr( "GML" ), "GML" ); mFileFormatComboBox->addItem( tr( "Mapinfo File" ), "Mapinfo File" ); #endif if ( mFileFormatComboBox->count() == 1 ) { mFileFormatComboBox->setVisible( false ); mFileFormatLabel->setVisible( false ); } mFileFormatComboBox->setCurrentIndex( 0 ); mFileEncoding->addItems( QgsVectorDataProvider::availableEncodings() ); // Use default encoding if none supplied QString enc = QSettings().value( "/UI/encoding", "System" ).toString(); // The specified decoding is added if not existing alread, and then set current. // This should select it. int encindex = mFileEncoding->findText( enc ); if ( encindex < 0 ) { mFileEncoding->insertItem( 0, enc ); encindex = 0; } mFileEncoding->setCurrentIndex( encindex ); mOkButton = buttonBox->button( QDialogButtonBox::Ok ); mAttributeView->addTopLevelItem( new QTreeWidgetItem( QStringList() << "id" << "Integer" << "10" << "" ) ); QgsCoordinateReferenceSystem srs; srs.createFromOgcWmsCrs( settings.value( "/Projections/layerDefaultCrs", GEO_EPSG_CRS_AUTHID ).toString() ); srs.validate(); mCrsId = srs.srsid(); leSpatialRefSys->setText( srs.authid() + " - " + srs.description() ); connect( mNameEdit, SIGNAL( textChanged( QString ) ), this, SLOT( nameChanged( QString ) ) ); connect( mAttributeView, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) ); mAddAttributeButton->setEnabled( false ); mRemoveAttributeButton->setEnabled( false ); }
bool QgsDistanceArea::setEllipsoid( const QString& ellipsoid ) { // Shortcut if ellipsoid is none. if ( ellipsoid == GEO_NONE ) { mEllipsoid = GEO_NONE; return true; } // Check if we have a custom projection, and set from text string. // Format is "PARAMETER:<semi-major axis>:<semi minor axis> // Numbers must be with (optional) decimal point and no other separators (C locale) // Distances in meters. Flattening is calculated. if ( ellipsoid.startsWith( "PARAMETER" ) ) { QStringList paramList = ellipsoid.split( ":" ); bool semiMajorOk, semiMinorOk; double semiMajor = paramList[1].toDouble( & semiMajorOk ); double semiMinor = paramList[2].toDouble( & semiMinorOk ); if ( semiMajorOk && semiMinorOk ) { return setEllipsoid( semiMajor, semiMinor ); } else { return false; } } // Continue with PROJ.4 list of ellipsoids. QgsEllipsoidCache::Params params = QgsEllipsoidCache::instance()->getParams( ellipsoid ); // row for this ellipsoid wasn't found? if ( params.radius.isEmpty() || params.parameter2.isEmpty() ) { QgsDebugMsg( QString( "setEllipsoid: no row in tbl_ellipsoid for acronym '%1'" ).arg( ellipsoid ) ); return false; } // get major semiaxis if ( params.radius.left( 2 ) == "a=" ) mSemiMajor = params.radius.mid( 2 ).toDouble(); else { QgsDebugMsg( QString( "setEllipsoid: wrong format of radius field: '%1'" ).arg( params.radius ) ); return false; } // get second parameter // one of values 'b' or 'f' is in field parameter2 // second one must be computed using formula: invf = a/(a-b) if ( params.parameter2.left( 2 ) == "b=" ) { mSemiMinor = params.parameter2.mid( 2 ).toDouble(); mInvFlattening = mSemiMajor / ( mSemiMajor - mSemiMinor ); } else if ( params.parameter2.left( 3 ) == "rf=" ) { mInvFlattening = params.parameter2.mid( 3 ).toDouble(); mSemiMinor = mSemiMajor - ( mSemiMajor / mInvFlattening ); } else { QgsDebugMsg( QString( "setEllipsoid: wrong format of parameter2 field: '%1'" ).arg( params.parameter2 ) ); return false; } QgsDebugMsg( QString( "setEllipsoid: a=%1, b=%2, 1/f=%3" ).arg( mSemiMajor ).arg( mSemiMinor ).arg( mInvFlattening ) ); // get spatial ref system for ellipsoid QString proj4 = "+proj=longlat +ellps=" + ellipsoid + " +no_defs"; QgsCoordinateReferenceSystem destCRS = QgsCRSCache::instance()->crsByProj4( proj4 ); //TODO: createFromProj4 used to save to the user database any new CRS // this behavior was changed in order to separate creation and saving. // Not sure if it necessary to save it here, should be checked by someone // familiar with the code (should also give a more descriptive name to the generated CRS) if ( destCRS.srsid() == 0 ) { QString myName = QString( " * %1 (%2)" ) .arg( QObject::tr( "Generated CRS", "A CRS automatically generated from layer info get this prefix for description" ) ) .arg( destCRS.toProj4() ); destCRS.saveAsUserCRS( myName ); } // // set transformation from project CRS to ellipsoid coordinates mCoordTransform->setDestCRS( destCRS ); mEllipsoid = ellipsoid; // precalculate some values for area calculations computeAreaInit(); return true; }