Python
Ubuntu

Pythonで世界地図-3(日本地図)

Pythonで世界地図
https://qiita.com/ty21ky/items/c7a93b83cbbfa8a82a17

Pythonで世界地図-2
https://qiita.com/ty21ky/items/c9e29a5361e35ca7c4f2

の続き

日本地図に県境を入れる

basemapやcartopyで地図上でplot
http://www.mwsoft.jp/programming/numpy/plot_map.html

上記のサイトに日本地図に県境を表示する方法が書かれています。詳しくは上記のサイトを参照してください。

インストール

$ git clone https://github.com/OSGeo/proj.4.git
$ cd proj.4
$ git checkout -b 4.9.0 tags/4.9.0
$ ./configure
$ make
$ sudo make install

$ sudo apt-get install libgeos-dev

$ git clone https://github.com/SciTools/cartopy.git
$ cd cartopy
$ git tag

$ git checkout -b v0.14.2 tags/v0.14.2

ここまでは順調に進んだが、次の
$ sudo pip install .
でエラー。メッセージを翻訳するとsudoに-Hを入れろと書いてあるので入れるとOKだった。

$ sudo -H pip install .
$ python -c "import cartopy"

ここで、またエラー。
libproj.so.0がないらしい。
$ ls -l /usr/local/lib/libp*
-rw-r--r-- 1 root root 3737918 5月 2 14:21 /usr/local/lib/libproj.a
-rwxr-xr-x 1 root root 953 5月 2 14:21 /usr/local/lib/libproj.la*
lrwxrwxrwx 1 root root 16 5月 2 14:21 /usr/local/lib/libproj.so -> libproj.so.0.8.0*
lrwxrwxrwx 1 root root 16 5月 2 14:21 /usr/local/lib/libproj.so.0 -> libproj.so.0.8.0*
-rwxr-xr-x 1 root root 1775816 5月 2 14:21 /usr/local/lib/libproj.so.0.8.0*
ここにシンボリックリンクがあるが?

ネットで検索すると、海外のサイトにバグらしいと書いてあった。
Debianでは、なおっているがUbuntuはまだらしい。
ネットに書いてることをいろいろやっても駄目。
しかし、

$ export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib

これで、import出来るようになりました。

上記のサイトを参考に
国土数値情報 ダウンロードサービス
http://nlftp.mlit.go.jp/ksj/
から、データをダウンロード

2. 政策区域 ー> 行政区域 ー> ダウンロードするデータの選択

でデータをダウンロードしました。
ダウンロードする時間帯が悪いのか、それほどファイルサイズが大きくないのに物凄く時間がかかる。(数十分)マイクロソフト以外でこれほど時間がかかったのは初めてだ。

上記のサイトのサンプルプログラムを実行

test.py
#!/usr/bin/python
# coding: UTF-8

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib.pyplot as plt

# 落としてきた行政区域のshpファイルを指定
fname = '/home/ty/python/map/japan/N03-170101_GML/N03-17_170101.shp'
shapes = list(shpreader.Reader(fname).geometries())

# 東京あたりを描画
ax = plt.axes(projection=ccrs.PlateCarree())
ax.add_geometries(shapes, ccrs.PlateCarree(), edgecolor='black', facecolor='gray', alpha=0.3)
ax.set_extent([139, 141, 35, 36], ccrs.PlateCarree())
plt.show()

image.png

最初は気が付かなかったが、このプログラムはBasemapとは、全然関係なかったぁぁ・・・

image.png

しかし、さすが国交省が作った地図なので、Basemapの"f"よりもさらに精度は良いですね。

県境だけにするか、県境の色を変更したいがshpファイルを読むことが出来ないので、現在調査中。