Re: How to find the active metadata search path in PROJ 6

Nyall Dawson <[email protected]>
Newsgroups gmane.comp.gis.proj-4.devel
Message-ID <CAB28AshMqU0th1y6vFd2Yk98U8qi1vPLrZWhtDj+YHqxnZCujg@mail.gmail.com>
On Sat, 7 Sep 2019 at 23:20, Roger Bivand <[email protected]> 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.

> 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 );
  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.

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: [email protected]
> https://orcid.org/0000-0003-2392-6140
> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
> _______________________________________________
> PROJ mailing list
> [email protected]
> https://lists.osgeo.org/mailman/listinfo/proj
_______________________________________________
PROJ mailing list
[email protected]
https://lists.osgeo.org/mailman/listinfo/proj
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.