Pythonで世界地図-21(シェープファイルを作成)


世界地図で使用するシェープファイルを作成できないか探していたら
6.1. Lesson: 新しいベクターデータセットを作成する
https://docs.qgis.org/2.18/ja/docs/training_manual/create_vector_data/create_new_vector.html
を見つけたのでやってみました。

QGISが必要です、QGISのインストールは、
Pythonで世界地図-20(地図画像に位置情報を付与する)
https://qiita.com/ty21ky/items/a7c648c855f077ff515f
を参照してください。

手順

1.QGIS Desktopを起動する。
2.新規シェープファイルレイヤー をクリック

上記の場合、infoは、
'id','name'は上記で指定した名前、'RINGNUM','SHAPENUM'は自動でつく。
'RINGNUM'は同じ名称の時につく番号?、'SHAPENUM'名称毎の番号?
[{'id':1, 'name': 'AB', 'RINGNUM': 1, 'SHAPENUM': 1},
{'id':2, 'name': 'AB', 'RINGNUM': 2, 'SHAPENUM': 1},
{'id':3, 'name': 'AB', 'RINGNUM': 3, 'SHAPENUM': 1},
{'id':4, 'name': 'AB', 'RINGNUM': 4, 'SHAPENUM': 1},
{'id':5, 'name': 'AL', 'RINGNUM': 1, 'SHAPENUM': 2},
{'id':6, 'name': 'B', 'RINGNUM': 1, 'SHAPENUM': 3},


3.
Pythonで世界地図-20(地図画像に位置情報を付与する)
https://qiita.com/ty21ky/items/a7c648c855f077ff515f
で作成した*.tifファイルを開く。


4.レイヤパネルに追加されたラスタレイヤをレイヤパネルの一番下にドラッグする。(これをしないと地物を作成しても見えない)
5.レイヤパネルに追加されたラスタレイヤを右クリックー>レイヤの領域にズームする をクリック

6.レイヤーパネルのシェープファイルのレイヤーを選択して、右クリックー>編集モード切替

7.「地物の追加」 をクリック

クリックしてポリゴンを作成する。

右クリックで終了する。

地物属性のダイアログが表示される。
id - 1 (数値)
name - test
OKをクリックすると地物が作成される。

8.「地物の追加」の左隣のフロッピーアイコンをクリックし保存する。
9.レイヤーパネルのシェープファイルのレイヤーを選択して、右クリックー>編集モード切替 をクリックして編集モードを解除する。
10.プロジェクトを保存する。

#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import japan_border2 as jb2 #都府県境界線

font = {'family': 'IPAGothic'}  # 日本語Fontを指定

lon1 = 135.50
lat1 = 34.5
lon2 = 11.0
lat2 = 13.0

map = Basemap(llcrnrlon=lon1-lon2,llcrnrlat=lat1-lat2,urcrnrlon=lon1+lon2,urcrnrlat=lat1+lat2,resolution='i',projection='cyl')

map.drawcoastlines() #海岸線

jb2.prefectural_bound(map = map) #都府県境界線

map.readshapefile('test1', 'test', color ='m')

print(map.test)

plt.show()

ポリゴンの座標

$ ./test.py
[[(134.8980608886258, 32.092860695379926), (143.00363355629517, 32.04056667816916), (140.70269679902128, 29.112101714366027), (135.2641190091012, 28.223103421782938), (134.8980608886258, 32.092860695379926)]]
ポリゴンを塗りつぶす
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import japan_border2 as jb2 #都府県境界線
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
import numpy as np

font = {'family': 'IPAGothic'}  # 日本語Fontを指定

lon1 = 135.50
lat1 = 34.5
lon2 = 11.0
lat2 = 13.0

fig     = plt.figure() #shp_color
ax      = fig.add_subplot(111)

map = Basemap(llcrnrlon=lon1-lon2,llcrnrlat=lat1-lat2,urcrnrlon=lon1+lon2,urcrnrlat=lat1+lat2,resolution='i',projection='cyl')

map.drawcoastlines() #海岸線

jb2.prefectural_bound(map = map) #都府県境界線

map.readshapefile('test1', 'test', drawbounds = False)

patches  = [] 

for info, shape in zip(map.test_info, map.test): 
    if info['name'] == 'test':
        patches.append( Polygon(np.array(shape), True) )

ax.add_collection(PatchCollection(patches, facecolor= 'r', edgecolor='k', linewidths=1., zorder=2))

plt.show()