Pythonで地図を表示するためのライブラリとして、basemapというのがあるらしいので、早速使ってみた。
condaを使って、basemapと地図データをインストールする。
>conda install -c anaconda basemap >conda install basemap-data-hires
さっそく、Basemapモジュールをpythonで読み込んでみると、以下のようなエラーがでた。
>python >>> from mpl_toolkits.basemap import Basemap Traceback (most recent call last): File "map_error.py", line 5, in <module> from mpl_toolkits.basemap import Basemap File "/home/hachiya/anaconda3/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py", line 155, in <module> pyproj_datadir = os.environ['PROJ_LIB'] File "/home/hachiya/anaconda3/lib/python3.6/os.py", line 669, in __getitem__ raise KeyError(key) from None KeyError: 'PROJ_LIB'
よく分からないエラーなので、ググってみたところ、basemapの問題ではなくて、使い方の問題だという話になっていた。
https://github.com/conda-forge/basemap-feedstock/issues/30
そして、Basemapの前に以下のコードを入れると解決するとのこと。
import os
import condaconda_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_libfrom mpl_toolkits.basemap import Basemap
以下のサイトを参考に、日本地図上の所定の座標にテキストを描画するmap.pyというpythonコードを作成して、実行してみた。
qiita.com
import numpy as np import matplotlib.pyplot as plt import os import conda #----------------- # added by Hachiya 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 fig = plt.figure(figsize=(8,4)) m = Basemap(projection='merc', resolution='h', llcrnrlon=131, llcrnrlat=33, urcrnrlon=141, urcrnrlat=38) m.drawcoastlines(color='lightgray') m.drawcountries(color='lightgray') m.fillcontinents(color='white', lake_color='#eeeeee'); m.drawmapboundary(fill_color='#eeeeee') #m.drawparallels(np.arange(31.0, 38.1, 1.0), labels = [1,0,0,0], fontsize=12) #m.drawmeridians(np.arange(132.0, 140.1, 2.0), labels = [0,0,0,1], fontsize=12) sumoto_lon = 134.7687 sumoto_lat = 34.3755 hiratsuka_lon = 139.3581 hiratsuka_lat = 35.3587 x1,y1 = m(sumoto_lon, sumoto_lat) x2,y2 = m(hiratsuka_lon, hiratsuka_lat) m.plot(x1, y1, 'm.', markersize=10) m.plot(x2, y2, 'm.', markersize=10) plt.text(x1 + 10000, y1 + 10000, u"sumoto") plt.text(x2 + 10000, y2 + 10000, u"hiratsuka") plt.show() fig.savefig('map.png')