LoginSignup
0
1

More than 5 years have passed since last update.

Pythonで世界地図-27(シェイプファイルのそれぞれのポリゴンに着色する)

Last updated at Posted at 2018-08-11

実行した環境

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

image.png

防衛省が公開している訓練空域図の地図を利用して、シェイプファイルを作成しました。

image.png

この地図は精度を悪くしてあるのか、地図の種類が違うのか、地図に位置情報を付与した時に大きくずれていたので、ポリゴンを作成し地図上に描画すると大きくずれていたので適当に修正しました。(海の上は目標にするものがない)

上記のシェイプファイル関係をアップロードしました。
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

<インスタンス>.<シェイプファイルにつけた名前> で指定します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1