実行した環境
Ubuntu Stdio 18.04LTS
Python 3.6.5
参考
Pythonで世界地図-20(地図画像に位置情報を付与する)
https://qiita.com/ty21ky/items/a7c648c855f077ff515f
Pythonで世界地図-21(シェープファイルを作成)
https://qiita.com/ty21ky/items/8449a66662fdd02354e9
Pythonで世界地図-12(日本地図に都府県境界線を追加するライブラリ-2)
https://qiita.com/ty21ky/items/a5023ed4e07128d81c7b
防衛省が公開している訓練空域図の地図を利用して、シェイプファイルを作成しました。
この地図は精度を悪くしてあるのか、地図の種類が違うのか、地図に位置情報を付与した時に大きくずれていたので、ポリゴンを作成し地図上に描画すると大きくずれていたので適当に修正しました。(海の上は目標にするものがない)
上記のシェイプファイル関係をアップロードしました。
http://ty21ky.web.fc2.com/JSDF/airspace_japan.zip
新規シェープファイルレイヤーを作成する時に、name(テキストデータ)とtype(テキストデータ)を追加しました。
地物の追加(ポリゴン)する時に、下表のように入力しました。
id | name | type |
---|---|---|
1 | A | High |
2 | B | High |
3 | C | High |
12 | P | High |
13 | Q | High |
14 | U | High |
上の図のコード
都府県の境界線を表示するには、「Pythonで世界地図-12(日本地図に都府県境界線を追加するライブラリ-2)」の「ライブラリ japanmapで都府県境界線を描画する方法」か「japan_border2.py」かその他が必要です。
境界線が不要の時は、関係するコードを削除します。
#!/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 #shp_color
from matplotlib.collections import PatchCollection #shp_color
import numpy as np
font = {'family': 'IPAGothic'} # 日本語Fontを指定
fig = plt.figure() #shp_color
ax = fig.add_subplot(111)
lon1 = 137. #地図の中心
lat1 = 38.
lon2 = 10.5
lat2 = 9.0
map = Basemap(llcrnrlon=lon1-lon2,llcrnrlat=lat1-lat2,urcrnrlon=lon1+lon2,urcrnrlat=lat1+lat2,resolution='i',projection='merc', area_thresh = 0.0)
map.drawcoastlines() #海岸線
jb2.prefectural_bound(map = map) #都府県境界線
#map.readshapefile('/home/ty/自衛隊/Training_airspace/airspace_japan', 'AirspaceMap_japan', drawbounds = False) #高高度訓練空域 #info['name'] == 'A'しか表示されない
map.readshapefile('/home/ty/自衛隊/Training_airspace/airspace_japan', 'AirspaceMap_japan', drawbounds = True) #高高度訓練空域
patches1 = [] #shp_color
for info, shape in zip(map.AirspaceMap_japan_info, map.AirspaceMap_japan): #shp_color
if info['name'] == 'A':
patches1.append( Polygon(np.array(shape), True) )
ax.add_collection(PatchCollection(patches1, facecolor= 'r', edgecolor='k', linewidths=1., zorder=2, alpha=0.3)) #shp_color
plt.show()
上の図では、name = A のポリゴンに着色しています。
id = 1 にしても同じです。
type = High にすると、全てのポリゴンに着色します。
シェイプファイルを表示させる書式
map. #インスタンス
readshapefile('/home/ty/自衛隊/Training_airspace/airspace_japan', #シェイプファイルのファイル名(拡張子はなし)
'AirspaceMap_japan', #シェイプファイルに名前を付ける
drawbounds = True, #これをFalseにすると表示されない(後で操作が必要)
color = 'red') #ポリゴンの外枠の色
ポリゴンに着色する
from matplotlib.patches import Polygon #shp_color
from matplotlib.collections import PatchCollection #shp_color
patches1 = [] #shp_color
for info, shape in zip(map.AirspaceMap_japan_info, map.AirspaceMap_japan): #shp_color
if info['name'] == 'A':
patches1.append( Polygon(np.array(shape), True) )
ax.add_collection(PatchCollection(patches1, facecolor= 'r', edgecolor='k', linewidths=1., zorder=2, alpha=0.3)) #shp_color
<インスタンス>.<シェイプファイルにつけた名前> で指定します。