22
22
23
23
#if PROJ_VERSION_MAJOR>=6
24
24
#include < proj.h>
25
+ #include < mutex>
25
26
#endif
26
27
27
28
QReadWriteLock QgsEllipsoidUtils::sEllipsoidCacheLock ;
@@ -31,6 +32,15 @@ QList< QgsEllipsoidUtils::EllipsoidDefinition > QgsEllipsoidUtils::sDefinitionCa
31
32
32
33
QgsEllipsoidUtils::EllipsoidParameters QgsEllipsoidUtils::ellipsoidParameters ( const QString &ellipsoid )
33
34
{
35
+ #if PROJ_VERSION_MAJOR >= 6
36
+ // ensure ellipsoid database is populated when first called
37
+ static std::once_flag initialized;
38
+ std::call_once ( initialized, [ = ]
39
+ {
40
+ ( void )definitions ();
41
+ } );
42
+ #endif
43
+
34
44
// check cache
35
45
sEllipsoidCacheLock .lockForRead ();
36
46
QHash< QString, EllipsoidParameters >::const_iterator cacheIt = sEllipsoidCache .constFind ( ellipsoid );
@@ -73,7 +83,9 @@ QgsEllipsoidUtils::EllipsoidParameters QgsEllipsoidUtils::ellipsoidParameters( c
73
83
return params;
74
84
}
75
85
86
+ #if PROJ_VERSION_MAJOR< 6
76
87
// cache miss - get from database
88
+ // NOT REQUIRED FOR PROJ >= 6 -- we populate known types once by calling definitions() above
77
89
78
90
QString radius, parameter2;
79
91
//
@@ -177,6 +189,13 @@ QgsEllipsoidUtils::EllipsoidParameters QgsEllipsoidUtils::ellipsoidParameters( c
177
189
sEllipsoidCache .insert ( ellipsoid, params );
178
190
sEllipsoidCacheLock .unlock ();
179
191
return params;
192
+ #else
193
+ params.valid = false ;
194
+ sEllipsoidCacheLock .lockForWrite ();
195
+ sEllipsoidCache .insert ( ellipsoid, params );
196
+ sEllipsoidCacheLock .unlock ();
197
+ return params;
198
+ #endif
180
199
}
181
200
182
201
QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions ()
@@ -194,6 +213,8 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
194
213
QList<QgsEllipsoidUtils::EllipsoidDefinition> defs;
195
214
196
215
#if PROJ_VERSION_MAJOR>=6
216
+ sEllipsoidCacheLock .lockForWrite ();
217
+
197
218
// use proj to get ellipsoids
198
219
const PJ_ELLPS *ellipsoid = proj_list_ellps ();
199
220
while ( ellipsoid->name )
@@ -218,13 +239,26 @@ QList<QgsEllipsoidUtils::EllipsoidDefinition> QgsEllipsoidUtils::definitions()
218
239
}
219
240
220
241
QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem::fromProj4 ( QStringLiteral ( " +proj=longlat +ellps=%1 +no_defs" ).arg ( def.acronym ) );
221
- if ( crs.isValid () )
222
- def.parameters .crs = crs;
242
+ if ( crs.srsid () == 0 )
243
+ {
244
+ // TODO: createFromProj4 used to save to the user database any new CRS
245
+ // this behavior was changed in order to separate creation and saving.
246
+ // Not sure if it necessary to save it here, should be checked by someone
247
+ // familiar with the code (should also give a more descriptive name to the generated CRS)
248
+ QString name = QStringLiteral ( " * %1 (%2)" )
249
+ .arg ( QObject::tr ( " Generated CRS" , " A CRS automatically generated from layer info get this prefix for description" ),
250
+ crs.toProj4 () );
251
+ crs.saveAsUserCrs ( name );
252
+ }
253
+ def.parameters .crs = crs;
223
254
224
255
defs << def;
225
256
257
+ sEllipsoidCache .insert ( QString ( ellipsoid->id ), def.parameters );
258
+
226
259
ellipsoid++;
227
260
}
261
+ sEllipsoidCacheLock .unlock ();
228
262
229
263
230
264
#else
0 commit comments