[PROJ] How to find the active metadata search path in PROJ 6
Roger Bivand
Roger.Bivand at nhh.no
Sun Sep 8 00:25:30 PDT 2019
On Sun, 8 Sep 2019, Nyall Dawson wrote:
> On Sat, 7 Sep 2019 at 23:20, Roger Bivand <Roger.Bivand at nhh.no> wrote:
> xample
>> holding grid files downloaded on the fly or caches from previous sessions,
>> and where the default data/ directory is not user-writable,
>
> Good move, I think all proj based end-user applications should also
> implement this logic.
It does seem justified, doesn't it? It might be even more sensible if (at
some time in the future) the user-writable cache directory was shared
between applications, so that different R or Python packages or QGIS etc.
didn't each have to have separate dumps of the same grid files ... just
speculating.
>
>> I think I need
>> to build the ":" or ";" separated list to update the search path. To avoid
>> overwriting it, I need to prepend the active search path to the local
>> user-writable directory.
>>
>> Hope this is just something I've missed, a function returning a string, or
>> equivalent mechanism.
>
> Here's how we do it in QGIS. Excuse the mix of pure c++/proj/qt api (a
> necessary by-product of working in QGIS code):
>
> on startup:
>
> // append local user-writable folder as a proj search path
> QStringList currentProjSearchPaths = QgsProjUtils::searchPaths();
> currentProjSearchPaths.append( qgisSettingsDirPath() + "proj" );
> char **newPaths = new char *[currentProjSearchPaths.length()];
> for ( int i = 0; i < currentProjSearchPaths.count(); ++i )
> {
> newPaths[i] = CPLStrdup( currentProjSearchPaths.at( i
> ).toUtf8().constData() );
> }
> proj_context_set_search_paths( nullptr,
> currentProjSearchPaths.count(), newPaths );
> for ( int i = 0; i < currentProjSearchPaths.count(); ++i )
> {
> CPLFree( newPaths[i] );
> }
> delete [] newPaths;
>
> where QgsProjUtils::searchPaths() is:
>
> QStringList QgsProjUtils::searchPaths()
> {
> const QString path( proj_info().searchpath );
This: ^^^^^^^^^^^^^^^^^^^^^
was what I needed for a first prototype, thanks very much! I'd missed this
because I didn't read the PROJ_INFO struct definition in proj.h (starting
line 273 in the 6.2.0 source).
> QStringList paths;
> #if PROJ_VERSION_MINOR==1 && PROJ_VERSION_PATCH==0
> // -- see https://github.com/OSGeo/proj.4/pull/1497
> paths = path.split( ';' );
> #else
> #ifdef Q_OS_WIN
> paths = path.split( ';' );
> #else
> paths = path.split( ':' );
> #endif
> #endif
> QSet<QString> existing;
> // thin out duplicates from paths -- see
> https://github.com/OSGeo/proj.4/pull/1498
> QStringList res;
> res.reserve( paths.count() );
> for ( const QString &p : qgis::as_const( paths ) )
> {
> if ( existing.contains( p ) )
> continue;
> existing.insert( p );
> res << p;
> }
> return res;
> }
>
> There's quite a bit of logic here which is in place to work around
> earlier PROJ 6 release behavior, see the links commented in the code
> above.
Thanks again,
Roger
>
> Nyall
>
>
>>
>> Roger
>>
>> --
>> Roger Bivand
>> Department of Economics, Norwegian School of Economics,
>> Helleveien 30, N-5045 Bergen, Norway.
>> voice: +47 55 95 93 55; e-mail: Roger.Bivand at nhh.no
>> https://orcid.org/0000-0003-2392-6140
>> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
>> _______________________________________________
>> PROJ mailing list
>> PROJ at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/proj
>
--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: Roger.Bivand at nhh.no
https://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
More information about the PROJ
mailing list