diff --git a/src/core/qgscoordinatereferencesystem.cpp b/src/core/qgscoordinatereferencesystem.cpp index 5727622d8b3..07c43155d0e 100644 --- a/src/core/qgscoordinatereferencesystem.cpp +++ b/src/core/qgscoordinatereferencesystem.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "qgsapplication.h" #include "qgslogger.h" @@ -220,26 +221,28 @@ bool QgsCoordinateReferenceSystem::createFromString( const QString &definition ) sCrsStringLock.unlock(); bool result = false; - QRegExp reCrsId( "^(epsg|postgis|internal)\\:(\\d+)$", Qt::CaseInsensitive ); - if ( reCrsId.indexIn( definition ) == 0 ) + QRegularExpression reCrsId( "^(epsg|postgis|internal|user)\\:(\\d+)$", QRegularExpression::CaseInsensitiveOption ); + QRegularExpressionMatch match = reCrsId.match( definition ); + if ( match.capturedStart() == 0 ) { - QString authName = reCrsId.cap( 1 ).toLower(); + QString authName = match.captured( 1 ).toLower(); CrsType type = InternalCrsId; if ( authName == QLatin1String( "epsg" ) ) type = EpsgCrsId; if ( authName == QLatin1String( "postgis" ) ) type = PostgisCrsId; - long id = reCrsId.cap( 2 ).toLong(); + long id = match.captured( 2 ).toLong(); result = createFromId( id, type ); } else { - QRegExp reCrsStr( "^(?:(wkt|proj4)\\:)?(.+)$", Qt::CaseInsensitive ); - if ( reCrsStr.indexIn( definition ) == 0 ) + QRegularExpression reCrsStr( "^(?:(wkt|proj4)\\:)?(.+)$", QRegularExpression::CaseInsensitiveOption ); + match = reCrsStr.match( definition ); + if ( match.capturedStart() == 0 ) { - if ( reCrsStr.cap( 1 ).toLower() == QLatin1String( "proj4" ) ) + if ( match.captured( 1 ).toLower() == QLatin1String( "proj4" ) ) { - result = createFromProj4( reCrsStr.cap( 2 ) ); + result = createFromProj4( match.captured( 2 ) ); //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 @@ -254,7 +257,7 @@ bool QgsCoordinateReferenceSystem::createFromString( const QString &definition ) } else { - result = createFromWkt( reCrsStr.cap( 2 ) ); + result = createFromWkt( match.captured( 2 ) ); } } } diff --git a/tests/src/core/testqgscoordinatereferencesystem.cpp b/tests/src/core/testqgscoordinatereferencesystem.cpp index bc00efa844e..ceea0a67d48 100644 --- a/tests/src/core/testqgscoordinatereferencesystem.cpp +++ b/tests/src/core/testqgscoordinatereferencesystem.cpp @@ -842,6 +842,14 @@ void TestQgsCoordinateReferenceSystem::saveAsUserCrs() QCOMPARE( userCrs2.srsid(), userCrs.srsid() ); QCOMPARE( userCrs2.authid(), QStringLiteral( "USER:100000" ) ); QCOMPARE( userCrs2.description(), QStringLiteral( "babies first projection" ) ); + + // createFromString with user crs + QgsCoordinateReferenceSystem userCrs3; + userCrs3.createFromString( QStringLiteral( "USER:100000" ) ); + QVERIFY( userCrs3.isValid() ); + QCOMPARE( userCrs3.authid(), QString( "USER:100000" ) ); + QCOMPARE( userCrs3.toProj4(), madeUpProjection ); + QCOMPARE( userCrs3.description(), QStringLiteral( "babies first projection" ) ); } void TestQgsCoordinateReferenceSystem::projectWithCustomCrs()