覚え書きブログ

pythonでの地図表示

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 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

以下のサイトを参考に、日本地図上の所定の座標にテキストを描画する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')

f:id:hirotaka_hachiya:20190127220038p:plain