在PyCharm中导入Basemap时出现错误——KeyError:'PROJ_LIB'

33

我试图使用Basemap包在PyCharm中绘制地图,但是遇到了一些问题

from mpl_toolkits.basemap import Basemap`

以下是跟踪信息:

Traceback (most recent call last):
File "/Users/yupeipei/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-0a24a3a77efd>", line 7, in <module>
    from mpl_toolkits.basemap import Basemap
  File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 20, in do_import
    module = self._system_import(name, *args, **kwargs)
  File "/Users/yupeipei/anaconda3/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py", line 146, in <module>
    pyproj_datadir = os.environ['PROJ_LIB']
  File "/Users/yupeipei/anaconda3/lib/python3.6/os.py", line 669, in __ getitem__
    raise KeyError(key) from None
KeyError: 'PROJ_LIB'

我对PyCharm上出现的这个错误感到困惑,因为同样的脚本在Jupyter或Spyder上可以正常运行!PyCharm的环境是../anaconda3/lib/python3.6,与Anaconda中的相同。

有人遇到过这种错误吗?

请问有人能帮我解决这个错误吗?


我大约在一周前开始遇到这个错误。我认为这是由于Anaconda pyproj软件包的最新更新造成的。我发现我可以编辑.../site-packages/mpl_toolkits/basemap/__init__.py文件的第146行,直接指向PROJ库的安装位置,而不是寻找环境变量。(在我的情况下,anaconda pyproj软件包将PROJ库安装在/anaconda/envs/[我的环境名称]/share/proj,你的情况可能有所不同)。 - mewahl
我在安装Anaconda 5.7之后遇到了这个问题。 - blaylockbk
10个回答

27
对于安装了Anaconda和Python 3.71的Windows 10(我确定其他Python 3版本和Windows 7/8也适用),您需要告诉Basemap Proj4的“epsg”文件在哪里才能成功。因为太麻烦了,所以我没有设置“环境”之类的东西 - 所以我没有anaconda\share\proj区域(据我所知,这就是我没有它的原因)。

但是,Basemap想要的是“epsg”文件,可以使用Windows资源管理器在Anaconda目录中搜索它。如果找不到,请通过打开“Anaconda提示符”并键入以下内容来安装Proj4:

conda install -c conda-forge proj4

如果找到它,应该在类似以下路径的位置:

C:\Utilities\Python\Anaconda\Library\Share(这是我的安装路径,以及 \pkgs\ 路径,我猜那是放置包本身的地方 - 如果需要,那些位置也可以使用,起初我用它们,但库中的应该通过更新更好地工作(也许))。

在导入 Basemap 之前使用下面的代码,它会起作用。将环境变量 PROJ_LIB 设置为 epsg 所在的位置,然后 Basemap 就可以愉快地工作了。
import os
os.environ["PROJ_LIB"] = "C:\\Utilities\\Python\\Anaconda\\Library\\share"; #fixr
from mpl_toolkits.basemap import Basemap

作为额外的好处,要获取Basemap的高分辨率数据(Anaconda安装时未包含),请在“Anaconda提示符”中键入:
conda install -c conda-forge basemap-data-hires

20

根据mewahl的评论,我已经在我的.bashrc文件中添加了以下内容(我使用bash):

export PROJ_LIB=/path/to/your/instalation/of/anaconda/share/proj/

现在basemap(以及其他工具)可以正常工作了。


1
它解决了我的问题。你可以把它看作是一个变通方法,但是我评论中提供的链接所指出的解决方案并没有解决这个问题。 - user1770719
3
这是解决此问题的好方法[https://dev59.com/4VQJ5IYBdhLWcg3w356R?noredirect=1&lq=1]。 - Edwin Torres
非常好的答案,这拯救了我的一天。 - Jinhua Wang
除了设置PROJ_LIB变量外,我还必须将pyproj降级到1.9.6才能使其正常工作,否则epsg文件会丢失。 - Itamar Katz

14

答案来自 Github,对我很有用。

import os
import conda

conda_file_dir = conda.__file__
conda_dir = conda_file_dir.split('lib')[0]
proj_lib = os.path.join(os.path.join(conda_dir, 'share'), 'proj')
os.environ["PROJ_LIB"] = proj_lib

from mpl_toolkits.basemap import Basemap

14

在新版本中,您需要设置Proj lib的路径,因为该路径已被替换。在导入matplot_toolkits之前写入以下两行代码:

import os
os.environ["PROJ_LIB"] = "your_path_to_Proj_lib"
  ### For Window's Users
      import os
      os.environ['PROJ_LIB'] = r'C:\Users\XXXXX\Anaconda3\pkgs\proj4-5.2.0- 
      ha925a31_1\Library\share'

要找到Proj_lib的路径,只需搜索epsg,然后复制这个epsg文件位置并放入proj_lib即可。

  ### For Linux's Users
  import os
  os.environ['PROJ_LIB'] = r'/home/XXXXXX/anaconda3/pkgs/proj4-5.2.0- 
  he6710b0_1/share/proj'

我找了好几个月这个东西!终于它能正常工作了。 - yair suari

13

这对我有用:

import os
os.environ["PROJ_LIB"] = os.path.join(os.environ["CONDA_PREFIX"], "share", "proj")

这扩展了@Yusuf Baktir的答案,通过省略硬编码EPSG文件路径来实现。 这样代码可以在任何安装了conda(当然也要激活)的计算机上运行。


2

这似乎是一个常见的问题。有几个关于此问题的错误报告:

我自己也遇到了这个错误,对我来说解决方案是卸载 basemap 1.2,然后从我还留着的旧 wheel 文件中安装 basemap 1.1,最后再安装 basemap 1.2。但老实说,我不知道为什么这样做可以解决问题。

另外,从上述问题中,人们还报告了各种其他解决方案,希望其中之一也适用于这里。


0

在PyCharm中解决Proj4问题的简单方法是:前往设置 -> 项目解释器 -> + -> 在搜索字段中输入proj4并安装。


0

我无法解决这个问题,但我找到了一个替代方案,使用CartoPy。 basemap正在为Python 2.7用户维护。 CartoPy是一个更好的选择。


0

我相信当使用混合版本的basemap、basemap-data和basemap-data-hires包时,会出现此错误。 对我来说,遵循已安装但找不到basemap-data-hires上的说明解决了问题。


-2

我遇到了同样的问题。我安装了Anaconda并使用conda install -c anaconda basemap进行安装。

我使用Anaconda内置的IDE,名为“Spyder”。 Spyder比pycharm好。唯一的问题是缺乏智能感知。

我通过设置路径解决了Proj4的问题。

其他问题是加载.json较大文件数据集时内核重新启动。

我使用Notepad ++和010编辑器将文件重新保存为小块,最后将所有输出合并。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接