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 ) ); }
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; }
bool QgsCustomProjectionDialog::saveCRS( QgsCoordinateReferenceSystem myCRS, QString myName, QString myId, bool newEntry ) { QString mySql; int return_id; QString myProjectionAcronym = myCRS.projectionAcronym(); QString myEllipsoidAcronym = myCRS.ellipsoidAcronym(); QgsDebugMsg( QString( "Saving a CRS:%1, %2, %3" ).arg( myName ).arg( myCRS.toProj4() ).arg( newEntry ) ); if ( newEntry ) { return_id = myCRS.saveAsUserCRS( myName ); if ( return_id == -1 ) return false; else myId = QString::number( return_id ); } else { mySql = "update tbl_srs set description=" + quotedValue( myName ) + ",projection_acronym=" + quotedValue( myProjectionAcronym ) + ",ellipsoid_acronym=" + quotedValue( myEllipsoidAcronym ) + ",parameters=" + quotedValue( myCRS.toProj4() ) + ",is_geo=0" // <--shamelessly hard coded for now + " where srs_id=" + quotedValue( myId ) ; QgsDebugMsg( mySql ); sqlite3 *myDatabase; const char *myTail; sqlite3_stmt *myPreparedStatement; int myResult; //check if the db is available myResult = sqlite3_open( QgsApplication::qgisUserDbFilePath().toUtf8(), &myDatabase ); if ( myResult != SQLITE_OK ) { QgsDebugMsg( QString( "Can't open database: %1 \n please notify QGIS developers of this error \n %2 (file name) " ).arg( sqlite3_errmsg( myDatabase ) ).arg( QgsApplication::qgisUserDbFilePath() ) ); // XXX This will likely never happen since on open, sqlite creates the // database if it does not exist. Q_ASSERT( myResult == SQLITE_OK ); } myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail ); sqlite3_step( myPreparedStatement ); // XXX Need to free memory from the error msg if one is set if ( myResult != SQLITE_OK ) { QgsDebugMsg( QString( "failed to write to database in custom projection dialog: %1 [%2]" ).arg( mySql ).arg( sqlite3_errmsg( myDatabase ) ) ); } sqlite3_finalize( myPreparedStatement ); // close sqlite3 db sqlite3_close( myDatabase ); if ( myResult != SQLITE_OK ) return false; } existingCRSparameters[myId] = myCRS.toProj4(); existingCRSnames[myId] = myName; QgsCRSCache::instance()->updateCRSCache( QString( "USER:%1" ).arg( myId ) ); // If we have a projection acronym not in the user db previously, add it. // This is a must, or else we can't select it from the vw_srs table. // Actually, add it always and let the SQL PRIMARY KEY remove duplicates. insertProjection( myProjectionAcronym ); return true; }
bool QgsCustomProjectionDialog::saveCrs( QgsCoordinateReferenceSystem parameters, const QString &name, const QString &existingId, bool newEntry ) { QString id = existingId; QString sql; int returnId; QString projectionAcronym = parameters.projectionAcronym(); QString ellipsoidAcronym = parameters.ellipsoidAcronym(); QgsDebugMsg( QString( "Saving a CRS:%1, %2, %3" ).arg( name, parameters.toProj4() ).arg( newEntry ) ); if ( newEntry ) { returnId = parameters.saveAsUserCrs( name ); if ( returnId == -1 ) return false; else id = QString::number( returnId ); } else { sql = "update tbl_srs set description=" + quotedValue( name ) + ",projection_acronym=" + quotedValue( projectionAcronym ) + ",ellipsoid_acronym=" + quotedValue( ellipsoidAcronym ) + ",parameters=" + quotedValue( parameters.toProj4() ) + ",is_geo=0" // <--shamelessly hard coded for now + " where srs_id=" + quotedValue( id ) ; QgsDebugMsg( sql ); sqlite3_database_unique_ptr database; //check if the db is available int result = database.open( QgsApplication::qgisUserDatabaseFilePath() ); if ( result != SQLITE_OK ) { QgsDebugMsg( QString( "Can't open database: %1 \n please notify QGIS developers of this error \n %2 (file name) " ).arg( database.errorMessage(), QgsApplication::qgisUserDatabaseFilePath() ) ); // XXX This will likely never happen since on open, sqlite creates the // database if it does not exist. Q_ASSERT( result == SQLITE_OK ); } sqlite3_statement_unique_ptr preparedStatement = database.prepare( sql, result ); if ( result != SQLITE_OK || preparedStatement.step() != SQLITE_DONE ) { QgsDebugMsg( QString( "failed to write to database in custom projection dialog: %1 [%2]" ).arg( sql, database.errorMessage() ) ); } preparedStatement.reset(); if ( result != SQLITE_OK ) return false; } mExistingCRSparameters[id] = parameters.toProj4(); mExistingCRSnames[id] = name; QgsCoordinateReferenceSystem::invalidateCache(); QgsCoordinateTransformCache::instance()->invalidateCrs( QStringLiteral( "USER:%1" ).arg( id ) ); // If we have a projection acronym not in the user db previously, add it. // This is a must, or else we can't select it from the vw_srs table. // Actually, add it always and let the SQL PRIMARY KEY remove duplicates. insertProjection( projectionAcronym ); return true; }