"""Module for managing the PROJ data directory."""# pylint: disable=global-statementimportosimportshutilimportsysfrompathlibimportPathfrompyproj._contextimport(# noqa: F401 pylint: disable=unused-import_set_context_data_dir,get_user_data_dir,)frompyproj.exceptionsimportDataDirError_USER_PROJ_DATA=None_VALIDATED_PROJ_DATA=None
[docs]defset_data_dir(proj_data_dir:str|Path)->None:""" Set the data directory for PROJ to use. Parameters ---------- proj_data_dir: str | Path The path to the PROJ data directory. """global_USER_PROJ_DATAglobal_VALIDATED_PROJ_DATA_USER_PROJ_DATA=str(proj_data_dir)# set to none to re-validate_VALIDATED_PROJ_DATA=None# need to reset the global PROJ context# to prevent core dumping if the data directory# is not found._set_context_data_dir()
[docs]defappend_data_dir(proj_data_dir:str|Path)->None:""" Add an additional data directory for PROJ to use. Parameters ---------- proj_data_dir: str | Path The path to the PROJ data directory. """set_data_dir(os.pathsep.join([get_data_dir(),str(proj_data_dir)]))
[docs]defget_data_dir()->str:""" The order of preference for the data directory is: 1. The one set by pyproj.datadir.set_data_dir (if exists & valid) 2. The internal proj directory (if exists & valid) 3. The directory in PROJ_DATA (PROJ 9.1+) | PROJ_LIB (PROJ<9.1) (if exists & valid) 4. The directory on sys.prefix (if exists & valid) 5. The directory on the PATH (if exists & valid) Returns ------- str: The valid data directory. """# to avoid re-validatingglobal_VALIDATED_PROJ_DATAif_VALIDATED_PROJ_DATAisnotNone:return_VALIDATED_PROJ_DATAinternal_datadir=Path(__file__).absolute().parent/"proj_dir"/"share"/"proj"proj_lib_dirs=os.environ.get("PROJ_DATA",os.environ.get("PROJ_LIB",""))prefix_datadir=Path(sys.prefix,"share","proj")conda_windows_prefix_datadir=Path(sys.prefix,"Library","share","proj")defvalid_data_dir(potential_data_dir):if(potential_data_dirisnotNoneandPath(potential_data_dir,"proj.db").exists()):returnTruereturnFalsedefvalid_data_dirs(potential_data_dirs):ifpotential_data_dirsisNone:returnFalseforproj_data_dirinpotential_data_dirs.split(os.pathsep):ifvalid_data_dir(proj_data_dir):returnTruereturnNoneifvalid_data_dirs(_USER_PROJ_DATA):_VALIDATED_PROJ_DATA=_USER_PROJ_DATAelifvalid_data_dir(internal_datadir):_VALIDATED_PROJ_DATA=str(internal_datadir)elifvalid_data_dirs(proj_lib_dirs):_VALIDATED_PROJ_DATA=proj_lib_dirselifvalid_data_dir(prefix_datadir):_VALIDATED_PROJ_DATA=str(prefix_datadir)elifvalid_data_dir(conda_windows_prefix_datadir):_VALIDATED_PROJ_DATA=str(conda_windows_prefix_datadir)else:proj_exe=shutil.which("proj",path=sys.prefix)ifproj_exeisNone:proj_exe=shutil.which("proj")ifproj_exeisnotNone:system_proj_dir=Path(proj_exe).parent.parent/"share"/"proj"ifvalid_data_dir(system_proj_dir):_VALIDATED_PROJ_DATA=str(system_proj_dir)if_VALIDATED_PROJ_DATAisNone:raiseDataDirError("Valid PROJ data directory not found. ""Either set the path using the environmental variable ""PROJ_DATA (PROJ 9.1+) | PROJ_LIB (PROJ<9.1) or ""with `pyproj.datadir.set_data_dir`.")return_VALIDATED_PROJ_DATA