[gdal-dev] Properly reinitializing PROJ_LIB search paths after supplementary file download
Even Rouault
even.rouault at spatialys.com
Tue Oct 7 14:50:14 PDT 2025
Le 07/10/2025 à 23:47, David Klaus a écrit :
> Even,
>
> I will check on this in a moment. If there are OGR/Proj/GDAL entities
> on the heap/stack -- such as OGRCoordinateTransformation -- will
> calling OSRCleanup cause issues?
That should be fine. You should however avoid any concurrent GDAL call
in another thread
>
> On Tue, Oct 7, 2025 at 5:43 PM Even Rouault
> <even.rouault at spatialys.com> wrote:
>
> David,
>
> does calling OSRCleanup() help ?
>
> Even
>
> Le 07/10/2025 à 17:00, David Klaus via gdal-dev a écrit :
>> Hello GDAL community,
>>
>> The product that I work on uses the CPP GDAL library for a number
>> of routines. Occasionally, this requires supplementary files --
>> Currently, we supply proj-data 1.20
>> <https://github.com/OSGeo/PROJ-data/releases/tag/1.20.0> -- which
>> we download when we detect that the dataset is needed. Here's the
>> problem, often GDALRegisterAll() is called before the proj-data
>> 1.20 files are downloaded. From my testing, it appears that if
>> the proj-data 1.20 files are not available when GDALRegisterAll()
>> is called, GDAL will not use them regardless of whether or not
>> these files are available later.
>>
>> Now, what I think might be a good solution is appropriately
>> updating GDAL's state after proj-data is downloaded s.t. it is
>> able to detect the proj-data files. But, I'm not sure how to do
>> this. Calling the following seems to produce correct results:
>>
>> GDALDestroy()
>> GDALAllRegister()
>>
>> However, the documentation says the following:
>>
>> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////FROM
>> DOCUMENTATION///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>> Finalize GDAL/OGR library.
>>
>> This function calls GDALDestroyDriverManager() and
>> OGRCleanupAll() and finalize Thread Local Storage variables.
>>
>> Prior to GDAL 2.4.0, this function should normally be explicitly
>> called by application code if GDAL is dynamically linked (but
>> that does not hurt), since it was automatically called through
>> the unregistration mechanisms of dynamic library loading.
>>
>> Since GDAL 2.4.0, this function may be called by application
>> code, since it is no longer called automatically, on non-MSVC
>> builds, due to ordering problems with respect to automatic
>> destruction of global C++ objects.
>>
>> *Note: no GDAL/OGR code should be called after this call!*
>> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////FROM
>> DOCUMENTATION///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>
>> So, this doesn't seem like the correct way to address this
>> problem. How should I go about updating GDAL's state s.t. it will
>> detect and read the downloaded supplementary proj-data files? Or,
>> is there something more I should be doing before
>> GDALAllRegister() is called?
>>
>> GDAL Version: GDAL 3.10.3, released 2025/04/01
>> Proj Version: 9.6.0
>>
>> P.S. To get out in front of what I expect to be the first
>> question, yes I am setting the PROJ_LIB environmental variable at
>> runtime to the correct folder. Further, I have tried creating an
>> empty proj-data folder available to GDAL when GDALRegisterAll()
>> is called. This did not change GDAL's behavior. Here is the code
>> I use for setting PROJ_LIB:
>>
>> SetEnvironmentVariable("PROJ_LIB", "c:/path/to/proj-data/folder");
>> _putenv_s("PROJ_LIB", "c:/path/to/proj-data/folder"); // (See:
>> GETENV_NOTE)
>>
>> P.P.S Here is the GETENV_NOTE:
>> // GETENV_NOTE:
>> // _putenv_s() is used to ensure compatibility with getenv().
>> getenv() operates on environment variables loaded into the
>> _environ global variable (loaded at "process startup.")
>> // SetEnvironmentVariable() affects the environment variables set
>> for this process but does not change _environ. _putenv_s()
>> updates _environ and ensures compatibility w/
>> // genenv().
>>
>> P.P.P.S I do know that there is a more current proj-data dataset
>> available. We may update to this dataset in the future. But
>> unless that will fix the current issue, I'd rather not do that now.
>>
>>
>> --
>> David Klaus
>> Carlson Software
>>
>>
>> *Disclaimer*
>>
>> The information contained in this communication from the sender
>> is confidential. It is intended solely for use by the recipient
>> and others authorized to receive it. If you are not the
>> recipient, you are hereby notified that any disclosure, copying,
>> distribution or taking action in relation of the contents of this
>> information is strictly prohibited and may be unlawful.
>>
>>
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/gdal-dev
>
> --
> http://www.spatialys.com
> My software is free, but my time generally not.
>
>
>
> --
> David Klaus
> Carlson Software
>
>
> *Disclaimer*
>
> The information contained in this communication from the sender is
> confidential. It is intended solely for use by the recipient and
> others authorized to receive it. If you are not the recipient, you are
> hereby notified that any disclosure, copying, distribution or taking
> action in relation of the contents of this information is strictly
> prohibited and may be unlawful.
>
--
http://www.spatialys.com
My software is free, but my time generally not.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20251007/6a4261d5/attachment.htm>
More information about the gdal-dev
mailing list